首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用PolicyKit允许非根用户启动和停止服务。

使用PolicyKit允许非根用户启动和停止服务。
EN

Stack Overflow用户
提问于 2020-04-28 13:06:30
回答 3查看 5K关注 0票数 4

我有一个要求允许非根用户启动和停止服务.有人建议我使用PolicyKit,而不是我熟悉的sudoers.d

由于我没有使用PolicyKit的经验,我想我应该尝试并创建一个规则,允许非根用户启动和停止Docker服务。我已经创建了一个文件,/etc/polkit-1/rules.d/10-docker.rules包含:

代码语言:javascript
复制
polkit.addRule(function(action, subject) {
    if (action.id == "org.freedesktop.systemd1.manage-units" &&
        action.lookup("unit") == "docker.service")
    {
        return polkit.Result.YES;
    }
})

但是,每当我执行systemctl start|stop|restart docker.service时,都会被提示输入密码。我遗漏了什么?

此外,我想限制非根用户控制这个服务谁是在一个特定的组,例如blah。我如何将这一点纳入我的规则?

我的目标操作系统是RHEL7.7。

EN

回答 3

Stack Overflow用户

发布于 2020-06-18 12:56:31

在CentOS7上,action无法访问unit信息。这是在后来的systemd版本v226中引入的。

https://github.com/systemd/systemd/commit/88ced61bf9673407f4b15bf51b1b408fd78c149d

我也被这个击中了。您需要允许用户管理所有单元,或者回到在sudoers上拥有shell脚本的石器时代。

此外,我还想限制非根用户控制这个服务谁是在一个特定的组,例如,blah。我如何将这一点纳入我的规则?

使用subject.isInGroup("group")

请参见:

票数 1
EN

Stack Overflow用户

发布于 2020-09-03 18:27:28

/etc/polkit-1/rules.d.d/10-polkit.规则

代码语言:javascript
复制
polkit.addRule(function(action, subject) {
  if (action.id == "org.freedesktop.systemd1.manage-units" &&
    action.lookup("unit") == "docker.service")  &&
    subject.isInGroup("mygroup"))
    {
      return polkit.Result.YES;
    }
})

此外,您还需要运行visudo并添加以下行

代码语言:javascript
复制
%mygroup ALL= NOPASSWD: /usr/bin/systemctl restart docker.service
%mygroup ALL= NOPASSWD: /usr/bin/systemctl stop docker.service
%mygroup ALL= NOPASSWD: /usr/bin/systemctl start docker.service
%mygroup ALL= NOPASSWD: /usr/bin/systemctl status docker.servicee

教程:https://keshavarzreza.ir/create-linux-systemd-service-runable-for-non-root-users/

票数 1
EN

Stack Overflow用户

发布于 2022-03-19 02:17:19

正如Sim o所指出的,RHEL 7上的systemd没有向polkit提供单元信息。解决问题的方法之一是使用pkexec包装对systemctl的调用。您需要一个特定服务的包装脚本,然后将规则应用于pkexec。用户将执行以下命令

代码语言:javascript
复制
pkexec /path/to/script

polkit规则看起来是这样的:

代码语言:javascript
复制
  polkit.addRule( 
  function(action,subject)
  {
    if ( (action.id == "org.freedesktop.policykit.exec") &&
         (action.lookup("user") == "root") &&
         (action.lookup("program") == "/path/to/script") &&
         (subject.isInGroup("someGroup") ) )
      return polkit.Result.YES;

    return polkit.Result.NOT_HANDLED;
  }
);

在实际意义上,这只是重新创建sudo和脚本使用polkit框架。这是否“更好”比使用sudo是一个价值判断,我将留给其他人。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61480914

复制
相关文章

相似问题

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