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