我的https(端口443)扭曲的应用程序(.tac)可以很好地部署为systemd服务,但是该单元文件要求user:root侦听/绑定低于1000的端口。问题是,twisted也以user:root身份运行。
如何侦听/绑定端口443,然后以非特权用户身份切换到Twisted .tac?
我想遵循“特权分离”的最佳做法,并避免使用setcap'cap_net_bind_service = + ep'或端口转发之类的变通方法,如详细here所述。
我尝试将Socket Activation与.service单元文件一起使用systemd。我的.socket可以在特权端口443上侦听/绑定。.service文件以非特权用户身份启动了.tac扭曲的应用程序,但是套接字移交不起作用,并且扭曲退出并显示“ permission否认”错误。搜索后,我发现“ {已知问题: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
系统套接字文件testtls.socket:
[Socket]
ListenStream=0.0.0.0:443
[Install]
WantedBy=sockets.target
答案 0 :(得分:0)
我设计了一个带有两个systemd文件的反向代理类型的解决方案,与从一个systemd文件中传递一个套接字相比,我意识到这是一种优雅的方法。我的一个.service文件中有一个root用户,另一个是非特权用户。重定向.service文件使用twisted.web.util.redirect(可找到最新文档here)将443重定向到8443。另一个.service文件在端口8443上侦听,最重要的是作为非特权用户侦听。>
经过测试并可以正常工作,但是,有些具有相同问题的人可能想知道这与端口转发有何不同,因为与.socket tls切换相比,反向代理只是另一种解决方法。
使用iptables进行端口转发将起作用,并且由内核处理,这似乎比运行反向代理服务器的额外负担要快。对于我的用例,我决定使用反向代理,因为它增加了额外的安全性,而且如here所述,更容易保持链接在代理上的完整性。
暂时,我将其作为最佳答案,因为它可以帮助遇到相同问题的其他任何人,但我希望有人发布更好,更优雅的解决方案。