我有一项开始使用 systemd 的服务。服务用户和组更改为非特权用户。
[Service]
...
User=regular_user
Group=regular_user
...
在某些时候,服务需要启动另一个进程,该进程预计将成为 root。另一个进程设置了它的 's' 位并用来setuid()
成为 root。
如果我启动这个过程,它就会运行得很好。然而,不知何故,当服务尝试启动它时,该setuid()
函数返回并显示错误:
不允许操作。
我看到了一些有关功能的选项,但我不知道这些选项是否是让setuid()
我的服务保持功能正常运行所必需的。我尝试了一些方法,但到目前为止都无济于事。
例如,我尝试过:
AmbientCapabilities=CAP_SETGID CAP_SETUID
SecureBits=keep-caps
尽管该进程似乎不再生成错误,但它仍然没有执行应有的操作(同样,如果我在控制台中运行该进程,它工作得很好!)
答案1
我实际上找到了无新权限=允许我的进程子进程使用setuid()
.
从他们的说法来看,这当然不是一个应该轻易选择使用的选项。但是,默认设置是:不允许该setuid()
功能。 (他们的意思是«提升权限».)
对我有用的是这样做:
NoNewPrivileges=false
请注意,文档没有明确说明此选项的默认值在 Ubuntu 16.04 上为 true。这可能因操作系统而异。