簡體   English   中英

使用 PolicyKit 允許非 root 用戶啟動和停止服務

[英]Using PolicyKit to allow non-root users to start and stop a service

我需要允許非根用戶啟動和停止服務。 建議我使用PolicyKit而不是我熟悉的sudoers.d

由於我沒有使用PolicyKit的經驗,我想我會嘗試並創建一個規則來允許非 root 用戶啟動和停止 Docker 服務。 我創建了一個文件/etc/polkit-1/rules.d/10-docker.rules包含:

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時,我都會收到輸入密碼的提示。 我錯過了什么?

另外,我想限制非 root 用戶控制特定組中的此服務,例如blah 我如何將其納入我的規則?

我的目標操作系統是 RHEL 7.7。

在 CentOS7 上, action無權訪問unit信息。 這是在后來的 systemd 版本 v226 中引入的。

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

我也被這個擊中了。 您將需要允許用戶管理所有單元或 go 回到在 sudoers 上擁有 shell 腳本的石器時代。

此外,我想限制非 root 用戶控制特定組中的此服務,例如 blah。 如何將其納入我的規則?

使用subject.isInGroup("group")

看:

/etc/polkit-1/rules.d/10-docker.rules

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並添加這些行

%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/

正如 Simão 所指出的,RHEL 7 上的 systemd 沒有向 polkit 提供單元信息。解決該問題的一種方法是使用 pkexec 包裝對 systemctl 的調用。 您需要一個用於特定服務的包裝腳本,然后將規則應用於 pkexec。 用戶將執行命令

pkexec /path/to/script

polkit 規則看起來像這樣:

  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;
  }
);

在實際意義上,這只是使用 polkit 框架重新創建 sudo 和腳本。 這是否比使用 sudo “更好”是我將留給其他人的價值判斷。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM