我的 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