1

我的 https(端口 443)twistd 应用程序(.tac)可以很好地部署为 systemd 服务,但单元文件需要 user:root 来监听/绑定低于 1000 的端口。问题是twistd 也以 user:root 身份运行。

如何侦听/绑定端口 443,然后以非特权用户身份移交给 twistd .tac?

我想遵循“权限分离”最佳实践,并避免使用 setcap 'cap_net_bind_service=+ep' 或端口转发等变通方法,详见此处

我尝试使用带有 .service 单元文件的 Socket Activation 的 systemd。我的 .socket 可以在特权端口 443 上侦听/绑定。并且 .service 文件以非特权用户身份启动了 twistd .tac 应用程序,但是套接字切换不起作用,并且 twistd 以“权限被拒绝”错误退出。搜索后我发现“已知问题:Twisted 不支持在从 systemd 继承的套接字上侦听 SSL 连接”这个Twisted doc的最后一行。我使用 Twisted 18.9.0 ubuntu 18.04。

以下 .service 和 .socket 文件部分成功:

我的 Systemd 服务单元文件:

[Unit]
Description=twistd https application
#Requires=testtls.socket

[Service]
ExecStart=/usr/bin/twistd --nodaemon --pidfile= --python=/ws/twistdhttps.tac
WorkingDirectory=/srv/web/https
#User=nobody   #twistd .tac permission denied
#Group=nogroup #twistd .tac permission denied
User=root   #twistd .tac works but no separation of privileges
Group=root  #twistd .tac works but no separation of privileges

Restart=always
#NonBlocking=true

[Install]
WantedBy=multi-user.target

Systemd 套接字文件 testtls.socket:

[Socket]
ListenStream=0.0.0.0:443

[Install]
WantedBy=sockets.target
4

1 回答 1

0

我用两个 systemd 文件制定了一个反向代理类型的解决方案,我意识到与从一个 systemd 文件传递​​套接字相比,这是一种不优雅的方式。我的一个 .service 文件有一个 root 用户,另一个是非特权用户。重定向 .service 文件使用了 twisted.web.util.redirect(最新文档可以在这里找到)将 443 重定向到 8443。另一个 .service 文件侦听端口 8443,最重要的是作为非特权用户。

经过测试并且工作正常,但是,一些有同样问题的人可能想知道这与端口转发有何不同,因为与 .socket tls 切换相比,反向代理只是另一种解决方法。

使用 iptables 的端口转发将起作用,并且由于它是由内核处理的,因此它似乎可能比运行反向代理服务器的额外负载更快。对于我的用例,我决定使用反向代理,因为它增加了额外的安全层,并且更容易保持代理上的链接完整,如此处所述

暂时我接受这是最好的答案,因为它会帮助遇到同样问题的其他人,但我希望有人发布更好、更优雅的解决方案。

于 2019-03-27T20:17:14.790 回答