使用polkit实现普通用户管理systemctl服务

本文最后更新于 2025年1月26日 上午

1. 背景

默认情况下,普通用户无法直接使用 systemctl 管理系统服务(如 nginx),因为需要管理员权限(rootsudo)。通过 polkit,可以为普通用户授权管理特定服务。


2. 实现步骤

2.1 创建 polkit 规则文件

  1. 进入 polkit 规则目录:

    1
    cd /etc/polkit-1/rules.d/
  2. 创建一个新的规则文件(例如 20-nginx.rules):

    1
    sudo vi 20-nginx.rules
  3. 添加以下内容(假设普通用户名为 user1):

    1
    2
    3
    4
    5
    6
    7
    polkit.addRule(function(action, subject) {
    if (action.id == "org.freedesktop.systemd1.manage-units" &&
    action.lookup("unit") == "nginx.service" &&
    subject.user == "user1") {
    return polkit.Result.YES;
    }
    });
    • **action.id**:指定操作类型,这里是管理 systemd 服务。
    • **action.lookup("unit")**:指定服务名称(如 nginx.service)。
    • **subject.user**:指定允许的用户(如 user1)。
    • **polkit.Result.YES**:允许用户执行操作。
  4. 保存并退出。


2.2 验证规则文件

  1. 确保规则文件权限正确:

    1
    sudo chmod 644 /etc/polkit-1/rules.d/10-nginx.rules
  2. 检查规则文件是否加载:

    1
    sudo systemctl restart polkit

2.3 测试普通用户权限

  1. 切换到普通用户:

    1
    su - user1
  2. 尝试管理 nginx 服务:

    1
    2
    3
    4
    systemctl start nginx
    systemctl stop nginx
    systemctl restart nginx
    systemctl status nginx
    • 如果规则生效,普通用户可以直接执行这些命令,而无需 sudo

3. 注意事项

3.1 规则文件命名

  • 规则文件的命名格式为 数字编号-描述.rules(如 10-nginx.rules)。
  • 数字编号越小,优先级越高。
  • 确保数字编号唯一,避免冲突。

3.2 规则文件路径

  • 系统范围的规则文件放在 /etc/polkit-1/rules.d/
  • 软件包安装的规则文件放在 /usr/share/polkit-1/rules.d/

3.3 调试规则

  • 如果规则未生效,检查以下内容:
    • 规则文件是否正确。
    • 规则文件是否加载(重启 polkit 服务)。
    • 用户是否匹配(subject.user)。

4. 扩展功能

4.1 授权多个用户

如果需要授权多个用户,可以修改规则文件:

1
2
3
4
5
6
7
polkit.addRule(function(action, subject) {
if (action.id == "org.freedesktop.systemd1.manage-units" &&
action.lookup("unit") == "nginx.service" &&
(subject.user == "user1" || subject.user == "user2")) {
return polkit.Result.YES;
}
});

4.2 授权用户组

如果需要授权整个用户组,可以使用 subject.isInGroup

1
2
3
4
5
6
7
polkit.addRule(function(action, subject) {
if (action.id == "org.freedesktop.systemd1.manage-units" &&
action.lookup("unit") == "nginx.service" &&
subject.isInGroup("nginx-admins")) {
return polkit.Result.YES;
}
});

5. 总结

通过 polkit,可以为普通用户授权管理特定的 systemctl 服务(如 nginx),而无需使用 sudo。关键步骤包括:

  1. 创建规则文件。
  2. 定义允许的用户和服务。
  3. 验证规则文件并测试权限。

这种方法既灵活又安全,适合在多用户环境中使用。


使用polkit实现普通用户管理systemctl服务
https://xinhaojin.github.io/2025/01/26/使用polkit实现普通用户管理systemctl服务/
作者
xinhaojin
发布于
2025年1月26日
更新于
2025年1月26日
许可协议