使用密码保护 Web 服务(基于 Flask)而无需更改其代码

使用密码保护 Web 服务(基于 Flask)而无需更改其代码

我使用 beancount 的第三方 Web UI fava。基本上,这意味着我在某个端口上运行 Web 服务。该 Web 服务没有身份验证或安全性。如果很重要,fava 使用 python 和 flask。

我想通过互联网访问此 Web 服务,通过路由器上的相应端口转发,我可以轻松实现此目的。但是,任何知道该端口的人都可以访问此服务(即,我唯一的安全措施是使用高端口号来隐藏身份)。

我至少该如何用密码保护该服务?甚至更好的是,我是否可以将对该服务的访问限制在某些设备(而非 IP 地址)上,例如我自己的智能手机(以及我妻子的智能手机)上?

我考虑过在我们的手机上使用 ssh 隧道,但对于我的妻子来说,这可能太复杂/太麻烦了。理想情况下,我希望她只需单击浏览器中的书签即可访问网站(可能在此过程中会进行密码检查),而不必加载 connectbot 并单击连接。

答案1

我还需要对蚕豆采取最低限度的保护措施。我所做的就是把蚕豆放在快速CGI而不是其内置的 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 的 flip flop 或 Python 2.x 的 flup。

要让 Apache 加载它,您有很多选择。下面是其中两个:

  1. 将文件保存为“fava.fcgi”,使其可由 Apache 的用户 ID 执行,并配置 Apache 以提供 .fcgi 文件。我没有这样做,因为我不喜欢 .fcgi 扩展名出现在我的 URL 中,而且我不想为(在我看来)繁琐的重写规则而烦恼。
  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 fastcgia2enmod 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,但您需要更改(或简化?)我的包装脚本。

相关内容