Systemd
systemd 以組中的非特權使用者身份啟動
我希望組
foogroup
中的使用者能夠:
systemctl start foo.service
,systemctl stop foo.service
,systemctl status foo.service
, 和journalctl -u foo.service
不使用提升的權限。那可能嗎?
我有一個 systemd 服務,它看起來像:
[Unit] Description=foo service [Service] Type=simple ExecStart=/bin/sleep infinity User=foobot Group=foogroup
foobot
系統使用者在哪裡。我知道我們可以安裝單元文件以
~/.config/systemd/user/
允許非特權使用者使用 systemd,但這並不能真正幫助一個組。注意:我計劃使用sd-bus API from
libsystem-dev
and cockpit,所以添加systemctl
到/etc/sudoers
不會有幫助。我不太在乎
systemctl enable
,如果我需要提升特權也沒關係。
這是我最終想出的解決方案。我建立:
/etc/polkit-1/localauthority/50-local.d/service-auth.pkla --- [Allow foogroup to start/stop/restart services] Identity=unix-group:foogroup Action=org.freedesktop.systemd1.manage-units ResultActive=yes
請注意,這特別適用於 Debian/Ubuntu 中使用的 polkit <106。其他發行版使用更新版本的 polkit,它會做這樣的事情:
/etc/polkit-1/rules.d/foogroup.rules --- polkit.addRule(function(action, subject) { if (action.id == "org.freedesktop.systemd1.manage-units" && subject.isInGroup("foogroup")) { return polkit.Result.YES; } });
如果您想將其限制為單個服務並且僅啟動/停止/重新啟動,請使用以下內容:
polkit.addRule(function(action, subject) { if (action.id == "org.freedesktop.systemd1.manage-units" && subject.isInGroup("foogroup")) { if (action.lookup("unit") == "foo.service") { var verb = action.lookup("verb"); if (verb == "start" || verb == "stop" || verb == "restart") { return polkit.Result.YES; } } } });