如何运行一个想要从作为普通用户的 systemd 服务成为 root 的进程?

如何运行一个想要从作为普通用户的 systemd 服务成为 root 的进程?

我有一项开始使用 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。这可能因操作系统而异。

相关内容