Linux

systemd:授予非特權使用者更改一項特定服務的權限

  • April 20, 2022

我在無頭 linux 機器上執行私人遊戲伺服器。因為我不是白痴,所以說伺服器作為自己的非特權使用者執行,具有下載更新和修改世界數據庫所需的最低訪問權限。

我還創建了一個 systemd 單元文件,以便在需要時正確啟動、停止和重新啟動伺服器(例如,對於上述更新)。

但是,為了真正打電話systemctlservice <game> start/stop/restart我仍然需要以 root 或有sudo能力的使用者身份登錄。

有沒有辦法告訴 systemd 對於該服務,允許<game>非特權使用者執行啟動/停止/重啟命令?gamesrv

我可以想到兩種方法來做到這一點:


一種是使服務成為使用者服務而不是系統服務。

systemd 單元將放置在服務使用者的主目錄下,而不是創建系統單元$HOME/.config/systemd/user/daemon-name.service。然後,同一使用者可以使用管理服務systemctl --user <action> daemon-name.service

要允許使用者單元在啟動時啟動,root 必須為該帳戶啟用 linger,即sudo loginctl enable-linger username. 單位也必須是WantedBy=default.target


另一種方式是允許使用者通過 PolicyKit 訪問管理系統單元。這需要 systemd 226 或更高版本(對於 JavaScript rules.d 文件,PolicyKit >= 0.106 - 檢查pkaction --version)。請注意,Debian 故意將 PolicyKit 保留到近十年前的 0.105 版本,該版本不支持此功能,顯然是因為一個人的個人觀點,並且它和派生自它的發行版(如 Ubuntu)都不能使用此方法。

您將創建一個新的 PolicyKit 配置文件,例如/etc/polkit-1/rules.d/57-manage-daemon-name.rules檢查您想要允許的屬性。例如:_

// Allow alice to manage example.service;
// fall back to implicit authorization otherwise.
polkit.addRule(function(action, subject) {
   if (action.id == "org.freedesktop.systemd1.manage-units" &&
       action.lookup("unit") == "example.service" &&
       subject.user == "alice") {
       return polkit.Result.YES;
   }
});

然後,命名使用者可以使用systemctl和不使用sudo.

引用自:https://serverfault.com/questions/841099