我的https(port 443)twistd应用程序(.tac)效果很好地部署了作为系统服务,但单元文件需要用户:root要侦听/绑定1000以下的端口。问题在于问题。Twistd也以用户的方式运行:root。
如何聆听/绑定端口443,然后作为无私人用户移交给twistd .tac?
我想遵循"特权分离"的最佳实践,并避免使用setCap'cap_net_bind_service = ep'或端口 - 福特式解决方案,如此处详细讨论。
>我尝试使用.Service单元文件的套接字激活尝试SystemD。我的.socket致力于在特权端口443上侦听/绑定。服务文件以非私有用户启动了TwistD .TAC应用程序,但是插座交换不起作用,并且带有"许可拒绝"错误的TwistD Exits。搜索后,我发现"已知问题:扭曲不支持从SystemD继承的插座上的SSL连接"此扭曲文档的最后一行。我使用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
我使用了一个带有两个SystemD文件的反向代理类型解决方案,我意识到,这是一种与从一个SystemD文件中脱离套接字相比的内心方式。我的.Service文件之一具有root用户,另一个是非私有用户。使用twisted.web.util.redirect(可以在此处找到最新文档)的重定向.Service文件,以将443重定向至84443.另一个。服务文件在端口8443上聆听,最重要的是作为无私人用户。
测试并效果很好,但是,有些问题可能会想知道这与端口 - 转向有何不同,因为与.socket TLS Handoff相比,反向代理只是另一种类型的解决方法。
使用iptables的端口 - 端口将起作用,并且正如内核所处理的那样,它似乎比运行反向代理服务器的额外负载更快。对于我的用例,我决定进行反向代理,因为它添加了额外的安全层,并且在此处概述的代理上保持完整的链接也更容易。
目前,我将其作为最佳答案,因为它将帮助遇到同样问题的其他人,但我希望有人发布更好,更优雅的解决方案。