systemd:授予非特權使用者更改一項特定服務的權限
我在無頭 linux 機器上執行私人遊戲伺服器。因為我不是白痴,所以說伺服器作為自己的非特權使用者執行,具有下載更新和修改世界數據庫所需的最低訪問權限。
我還創建了一個 systemd 單元文件,以便在需要時正確啟動、停止和重新啟動伺服器(例如,對於上述更新)。
但是,為了真正打電話
systemctl
,service <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
.