我遇到一个奇怪的问题,每当尝试以普通用户身份停止/启动守护进程时,它都会要求使用另一个普通用户的凭据进行身份验证 - 例如:
[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.policy
。polkit
可以在/etc/polkit-1
和/usr/share/polkit-1
目录中配置,更具体地说是在rules.d
和actions
子目录中配置。请参阅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
主要来源:
- https://unix.stackexchange.com/a/497011/53245- 我的回答很大程度上基于此,所以如果你赞同我的回答,也请赞同它,
- https://stackoverflow.com/a/62450509/2693875
unit
- 有关Centos 7 的 systemd缺乏支持的信息来源,也请点赞!
答案4
检查 /etc/groups 和 sudoers 规则。如果某人将自己添加到 wheel 组并以此方式成为 root,则可能会发生这种情况。