Systemd

如何執行想要從普通使用者的 systemd 服務成為 root 的程序?

  • October 10, 2016

我有一項服務,我開始使用 systemd。服務使用者和組更改為非特權使用者。

[Service]
...
User=regular_user
Group=regular_user
...

在某些時候,該服務需要啟動另一個程序,預計該程序將成為 root。另一個程序設置了它的“位”,它setuid()用來成為根。

如果我啟動它,這個過程就可以正常工作。但是,不知何故,當服務嘗試啟動它時,該setuid()函式返回錯誤:

不允許操作。

我已經看到了一些關於功能的選項,但我不知道是否需要使用這些選項來保持setuid()功能在我的服務中工作。我嘗試了一些事情,但到目前為止沒有任何幫助。

例如,我嘗試過:

AmbientCapabilities=CAP_SETGID CAP_SETUID
SecureBits=keep-caps

儘管該過程似乎不再產生錯誤,但它仍然沒有做它應該做的事情(同樣,如果我在我的控制台中執行該過程,它工作得很好!)

我實際上找到了NoNewPrivileges=選項,它允許我的程序子程序使用setuid().

從他們所說的來看,這當然不是一個應該輕易選擇使用的選項。但是,預設值為:不允許該setuid()功能。(他們所說的*“提升權限”*是什麼意思。)

對我有用的是這樣做:

NoNewPrivileges=false

請注意,文件沒有明確說明此選項的預設設置在 Ubuntu 16.04 上為 true。這可能因作業系統而異。

引用自:https://unix.stackexchange.com/questions/314868