Я использую сторонний веб-интерфейс beancount, fava. В основном это означает, что я запускаю веб-сервис на определенном порту. Для этого веб-сервиса нет аутентификации или безопасности. В случае, если это важно, fava использует python и flask.

Я хочу получить доступ к этому веб-сервису через Интернет, и переадресация портов на соответствующий порт на моем маршрутизаторе позволяет мне сделать это легко. Однако любой, кто знает порт, сможет получить доступ к этой услуге (т.е. моя единственная защита - незаметность из-за большого номера порта).

Как я могу защитить паролем сервис, как минимум? Более того, могу ли я ограничить доступ к услуге для определенных устройств (не IP-адресов), таких как мой собственный смартфон (и мой жена)?

Я подумал об использовании ssh-туннелирования на наших телефонах, но это, вероятно, было бы слишком сложно / проблематично для моей жены. В идеале я бы хотел, чтобы она могла просто щелкнуть по закладке в своем браузере для доступа к веб-сайту (возможно, с проверкой пароля), вместо того, чтобы загружать connectbot и нажимать connect.

1 ответ1

1

Мне также нужно было применить минимальную защиту к fava. То, что я сделал, это служил fava через FastCGI вместо его встроенного http-сервера. Вот очень минимальная оболочка:

#!/usr/bin/python3
# -*- coding: utf-8 -*-

def main():
    try:
        # In case you're running Python 2.x:  (untested with fava)
        from flup.server.fcgi import WSGIServer
    except ImportError:
        # For Python 3.x:
        from flipflop import WSGIServer

    from fava.application import app, load_file

    app.config['BEANCOUNT_FILES'] = ['/path/to/your/ledger.beancount',]
    load_file()
    WSGIServer(app).run()

if __name__ == '__main__':
    import sys as _sys
    _sys.exit(main())

Вам, конечно, понадобится триггер для Python 3.x или флип для Python 2.x.

Чтобы заставить Apache загрузить это, у вас есть много вариантов. Вот 2:

  1. Сохраните файл как «fava.fcgi», сделайте его исполняемым с помощью идентификатора пользователя Apache и настройте Apache для обслуживания файлов .fcgi. Я этого не делал, потому что мне не нравится, что расширение .fcgi присутствует в моих URL-адресах, и я не хотел беспокоиться о (IMHO) громоздких правилах переписывания.
  2. Мой более простой подход: сохраните файл как "fava", сделайте его исполняемым Apache и добавьте следующие строки в .htaccess для другого файла конфигурации сервера:

    <Files fava>
        # Use this with Debian package libapache2-mod-fastcgi
        SetHandler fastcgi-script
        # Or this with Debian package libapache2-mod-fcgid
        #SetHandler fcgid-script
    </Files>
    

Вам может потребоваться запустить a2enmod fastcgi или a2enmod fcgid зависимости от того, какой модуль Apache FastCGI вы решите использовать.

И самое главное, установите какой-то механизм паролей, и вы, вероятно, захотите использовать SSL. Например: (может быть более элегантный способ объединить этот раздел Directory с вышеупомянутым разделом Files ...)

# Set this to whatever directory contains fava:
<Directory /path/to/dir/containing/fava/>
    Options +ExecCGI
    SSLOptions +StrictRequire
    SSLRequireSSL
    AuthType Basic
    AuthName "Mr. Coffee"
    AuthBasicProvider file
    AuthUserFile /etc/apache2/htpasswd.whatever
    Require valid-user
</Directory>

Заключительные замечания: вместо FastCGI могут работать и другие механизмы, такие как WSGI, но вам нужно будет изменить (или упростить?) мой скрипт-обертка

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .