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,但这对团体并没有真正的帮助。

注意:我计划使用座舱所以添加systemctl/etc/sudoers不会有帮助的。

答案1

在 /etc/polkit-1/rules.d/10-myservice.rules 中

polkit.addRule(function(action, subject) {
    if (action.id == "org.freedesktop.systemd1.manage-units" && subject.isInGroup("somegroup")) {
        if (action.lookup("unit") == "foo.service") {
            var verb = action.lookup("verb");
            if (verb == "start" || verb == "stop" || verb == "restart") {
                return polkit.Result.YES;
            }
        }
    }
});

答案2

如果我没有使用 Debian 发行版,我会接受 Tollef Fog Heen 的回答,但是由于 debian 使用 polkit (<0.106),因此 *.rules 不可用。Debian 中的等效文件是:

/etc/polkit-1/localauthority/50-local.d/manage-units.pkla
----
[Allow users to manage services]
Identity=unix-group:somegroup
Action=org.freedesktop.systemd1.manage-units
ResultActive=yes

但是,请注意,这并不完全等同。它允许一个组管理服务,但没有指定允许该组管理哪些服务。此外,它也没有限制允许使用哪些“动词”。但是我注意到,虽然systemd start允许,但诸如systemd enable受文件权限保护的内容仍然不可用。

我还有另一个未解决的问题,关于这个答案的功能*.rules和文件之间的差异*.pkla这里

相关内容