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总线API来自libsystem-dev座舱所以添加systemctl/etc/sudoers不会有帮助。

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

答案1

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

/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

答案2

我一直在寻找解决方案,但找不到真正令我满意的解决方案。一个令人满意的解决方案是在 中提供组支持systemd。但我找到了这个解决方法。假设您要授予访问权限的用户是annbenchris。他们都应属于一个组awesomeproject

  1. 创建一个新用户awesomeproject并将用户添加到 组中awesomeproject
sudo adduser awesomeproject
sudo usermod -a -G awesomeproject ann
sudo usermod -a -G awesomeproject ben
sudo usermod -a -G awesomeproject chris
  1. systemctl将组中的所有用户添加到该新用户的sudoers 中。
sudo visudo

这些条目必须如下所示:

ann    ALL=(awesomeproject) NOPASSWD: /bin/systemctl
ben    ALL=(awesomeproject) NOPASSWD: /bin/systemctl
chris  ALL=(awesomeproject) NOPASSWD: /bin/systemctl

与其将它们放入/etc/sudoers,根据发行版的不同,最好将它们放入/etc/sudoers.d/awesomeproject而不是使用sudo visudo -f /etc/sudoers.d/awesomeproject

  1. 相应地管理文件和目录的权限,以便组成员awesomeproject可以访问~awesomeproject.

  2. 以下命令现在应该适用于annbenchris

sudo awesomeproject systemctl ...

相关内容