Systemd

以使用者身份控制 systemd 系統服務

  • October 19, 2019

我有幾個需要使用者控制的服務,我不能將它們用作使用者服務(他們的要求是具有 root 訪問權限的系統服務),另外還有一個奇怪的 GROUP/216 錯誤,我無法修復不管我怎麼嘗試。

我創建了名為 my-daemon@.service 的模板服務,因此它必須以systemctl start my-daemon@<parameter>.service. 參數為字母數字字元串,不能有空格、製表符、特殊字元等。

只作為特定使用者閱讀了重新啟動 systemd 服務?並嘗試了“sudo 方法”,但是當我使用模板服務時,它會產生相當大的安全問題。

允許使用者使用者名停止一項服務的範例 sudo 行:

username ALL= NOPASSWD: /bin/systemctl stop my-daemon@*.service

但是,我完全清楚這條線是安全噩夢,因為它也讓我可以執行以下命令:

sudo systemctl stop my-daemon@xyz firewalld.service

這裡有兩個範例 polkit 文件,一個是靜態服務名稱,第二個是模板。兩者都在 /etc/polkit-1/rules.d/ :

polkit.addRule(function(action, subject) { if (action.id == "org.freedesktop.systemd1.manage-units" && action.lookup("unit") == "my-daemon2.service" && subject.user == "username") { return polkit.Result.YES; } });

polkit.addRule(function(action, subject) { if (action.id == "org.freedesktop.systemd1.manage-units" && action.lookup("unit") == "my-daemon@.service" && subject.user == "username") { return polkit.Result.YES; } });

問題:

  1. 如何修復 sudo 語句,使其僅允許我以使用者名執行選定的服務?我讀過這個人,嘗試過自己修復它,但失敗了。
  2. 我更喜歡使用 polkit,我有 polkit 版本 0.112,通過 journalctl 我可以看到 polkit 添加了新規則,但我無法正確設置規則,即使我嘗試使用靜態服務名稱它也不允許我控制它。我究竟做錯了什麼?

經過多次測試和研究,我終於可以回答自己了。

  1. 本身不可能。沒辦法寫出類似的東西

$$ a-zA-Z0-9_- $$* 正則表達式。如果我確切地知道字元串應該有多少個字元,那將是可能的,但它會有所不同。 2) 正如我在評論中所說,選項 2 也已退出,我的 systemd 版本不需要 systemd 支持。升級所需的系統包是可能的,但不是在我有的時候。

所以我選擇了一個扭曲的選項。我不允許使用者直接控制服務,我允許啟動腳本來執行我在 sudo 中無法執行的所有檢查。如果一切正常,呼叫該服務。

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