Systemd

systemd 以組中的非特權使用者身份啟動

  • February 25, 2022

我希望組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-devand 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;
           }
       }
   }
});

(來自https://wiki.archlinux.org/title/Polkit

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