管理系统服务或单元需要身份验证。

管理系统服务或单元需要身份验证。

我遇到一个奇怪的问题,每当尝试以普通用户身份停止/启动守护进程时,它都会要求使用另一个普通用户的凭据进行身份验证 - 例如:

[bob@server ~]$ systemctl stop some-daemon.service
==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ===
Authentication is required to manage system services or units.
Authenticating as: alice
Password: 

为什么要求爱丽丝何时进行验证鲍勃已登录,我该如何修复此问题?

答案1

您的系统正在使用polkit授权管理器,并且消息来自文件/usr/share/polkit-1/actions/org.freedesktop.systemd1.policypolkit可以在/etc/polkit-1/usr/share/polkit-1目录中配置,更具体地说是在rules.dactions子目录中配置。请参阅Polkit 手册页了解更多信息。

简而言之,正在进行的调用正在接收以管理员身份进行身份验证的响应(auth_admin,auth_admin_keep手册页)。

在 CentOS 7 中,该/etc/polkit-1/rules.d/50-default.rules文件指定添加管理规则返回 wheel 组中要验证身份的用户的定义。当需要验证身份时,wheel 组中的所有用户都将显示为用户以供选择。如果 Alice 是 wheel 组中唯一的用户,则将根据规则自动显示 Alice。

假设 Alice 不在 wheel 组中,这将表明规则文件路径中会有一些其他 addAdminRule 定义,允许 Alice 作为管理员进行身份验证,就像请求返回 AUTH_ADMIN/AUTH_ADMIN_KEEP 响应时一样。

答案2

管理系统服务时,需要以 root 身份而不是普通用户身份进行操作。这通过$shell 提示符末尾的字符来指示。

您可以使用sudo command或者切换到 root(root shell 通常用 char 表示#)。

答案3

作为已经回答,此消息来自Polkit 授权管理器简单来说,这是一种系统化的方式来控制谁可以做什么,包括管理系统化服务。


对于 OP 来说,正确的解决方案是将服务配置为用户级systemd 服务。


但如果系统级服务您应该执行以下操作:

为 Polkit 添加一条规则,允许您的用户管理服务,如下所示:

cat > /etc/polkit-1/rules.d/10-some-daemon.rules << POLKIT
polkit.addRule(function(action, subject) {
    if (action.id == "org.freedesktop.systemd1.manage-units" &&
        action.lookup("unit") == "some-daemon.service" &&
        subject.user == "bob") {
        return polkit.Result.YES;
    }
});
POLKIT

...但是使用 Centos 7 中的 systemd v219,action无法访问unit!这已在 v226 中添加...因此,您需要允许用户管理所有单元,这很可能不是您应该做的...


因此我建议您切换到普通旧版本sudo以允许您的用户管理服务,例如:

cat > /etc/sudoers.d/some-daemon << SUDO
bob ALL= NOPASSWD: /bin/systemctl restart some-daemon.service
bob ALL= NOPASSWD: /bin/systemctl stop some-daemon.service
bob ALL= NOPASSWD: /bin/systemctl start some-daemon.service
SUDO

主要来源:

答案4

检查 /etc/groups 和 sudoers 规则。如果某人将自己添加到 wheel 组并以此方式成为 root,则可能会发生这种情况。

相关内容