systemd 以组中的非特权用户身份启动

Ste*_*art 6 systemd non-root-user

我希望群组中的用户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
Run Code Online (Sandbox Code Playgroud)

foobot系统用户在哪里。

我知道我们可以安装单元文件以~/.config/systemd/user/允许非特权用户使用 systemd,但这并不能真正帮助组。

注意:我计划在 cockpit 中使用sd - bus API ,因此添加不会有帮助。libsystem-devsystemctl/etc/sudoers

我不太关心systemctl enable,如果我需要更高的特权也没关系。

Ste*_*art 4

这是我最终想出的解决方案。我创建:

/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
Run Code Online (Sandbox Code Playgroud)

请注意,这特别适用于 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;
    } });
Run Code Online (Sandbox Code Playgroud)

如果您想将其限制为单个服务并且仅启动/停止/重新启动,请使用如下内容:

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;
            }
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

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