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

Ale*_*lke 6 setuid systemd services capabilities

我有一项开始使用 systemd 的服务。服务用户和组更改为非特权用户。

[Service]
...
User=regular_user
Group=regular_user
...
Run Code Online (Sandbox Code Playgroud)

在某些时候,服务需要启动另一个进程,该进程有望成为 root。另一个进程设置了它的 's' 位,它setuid()用来成为 root。

如果我启动它,这个过程就可以正常工作。然而,不知何故,当服务尝试启动它时,该setuid()函数返回一个错误:

不允许操作。

我已经看到了一些有关功能的选项,但我不知道是否需要使用这些选项来使setuid()功能在我的服务中正常工作。我尝试了一些东西,到目前为止没有任何帮助。

例如,我试过:

AmbientCapabilities=CAP_SETGID CAP_SETUID
SecureBits=keep-caps
Run Code Online (Sandbox Code Playgroud)

虽然这个过程似乎不再产生错误,但它仍然没有做它应该做的事情(同样,如果我在我的控制台中运行那个过程,它工作得很好!)

Ale*_*lke 8

我实际上找到了NoNewPrivileges=选项,它允许我的进程子进程使用setuid().

从他们的说法来看,这当然不是一个可以轻易选择使用的选项。但是,默认值为:不允许该setuid()功能。(他们所说的“提升特权”是什么意思。)

对我有用的是这样做:

NoNewPrivileges=false
Run Code Online (Sandbox Code Playgroud)

请注意,文档没有明确说明此选项的默认值在 Ubuntu 16.04 上为 true。这可能因操作系统而异。

  • 在我填写错误报告后,现在记录了默认值。对于系统服务,它默认为“false”,但如果设置了某些其他指令,则对于用户管理的服务,它可以默认为 true。详细信息在这里:https://github.com/systemd/systemd/commit/74388c2d11acd9b638e33e09c7a99a9bc2c6292b (2认同)