首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >系统从组中的非特权用户开始

系统从组中的非特权用户开始
EN

Unix & Linux用户
提问于 2019-03-06 21:19:12
回答 2查看 3.9K关注 0票数 5

我希望foogroup组的用户能够:

  • systemctl start foo.service
  • systemctl stop foo.service
  • systemctl status foo.service,和
  • journalctl -u foo.service

而不使用提升的特权。这有可能吗?

我有一个系统服务,它看起来像:

代码语言:javascript
复制
[Unit]
Description=foo service

[Service]
Type=simple
ExecStart=/bin/sleep infinity
User=foobot
Group=foogroup

其中foobot是系统用户。

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

注意:我计划使用来自libsystem-dev座舱systemctl API,因此将D21添加到/etc/sudoers不会有帮助。

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

EN

回答 2

Unix & Linux用户

回答已采纳

发布于 2019-12-17 07:19:16

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

代码语言:javascript
复制
/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,该版本将执行如下操作:

代码语言:javascript
复制
/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;
    } });

如果希望将其限制为单个服务,并且仅启动/停止/重新启动,请使用如下所示:

代码语言:javascript
复制
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)

票数 3
EN

Unix & Linux用户

发布于 2019-11-26 09:43:00

我在寻找一个解决方案,但没有找到一个真正满足我。一个令人满意的解决方案是在systemd中获得组支持。但我找到了解决办法。让我们假设要授予访问权限的用户是annbenchris。他们都应该是一组awesomeproject

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

条目必须如下所示:

代码语言:javascript
复制
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
代码语言:javascript
复制
sudo awesomeproject systemctl ...
票数 2
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/504806

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档