root 权限时 systemctl 访问被拒绝

root 权限时 systemctl 访问被拒绝

当我跑步时

sudo systemctl disable avahi-daemon.socket

我明白了

Failed to execute operation: Access denied

但它以 root 身份运行,怎么会拒绝访问?(CentOS 7)

答案1

我也在 CentOS 7 上工作,遇到了类似的问题:

# systemctl unmask tmp.mount
Failed to execute operation: Access denied

拒绝与 SELinux 有关。如果您在enforcing以下模式下运行 SELinux,则可能遇到这种情况:

# getenforce
Enforcing

就我的情况而言,该错误在 SELinux 日志文件中systemctl产生了拒绝:USER_AVC/var/log/audit/audit.log

type=USER_AVC msg=audit(1475497680.859:2656): pid=1 uid=0 auid=4294967295 ses=4294967295 subj=system_u:system_r:init_t:s0 msg='avc:  denied  { enable } for auid=0 uid=0 gid=0 path="/dev/null" cmdline="systemctl unmask tmp.mount" scontext=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 tcontext=system_u:object_r:null_device_t:s0 tclass=service  exe="/usr/lib/systemd/systemd" sauid=0 hostname=? addr=? terminal=?'

解决方案

本文指出这是由于 systemd 中的一个错误造成的,并提供了一种解决方法:

systemctl daemon-reexec

二次解决方案

如果上述方法不起作用,您可以将 SELinux 模式设置为permissive

setenforce 0

并且它应该可以正常工作。但是,第二种解决方案存在安全隐患。

答案2

就我的情况来说,我刚刚升级systemd,所有systemctl命令都失败了:

# systemctl daemon-reexec
Failed to reload daemon: Access denied
# systemctl status
Failed to read server status: Access denied

但是根据手册页,您可以通过向作为 PID 1 运行的守护进程发送命令来init执行相同的操作,该方法有效:SIGTERM

kill -TERM 1

这将重新加载守护进程,之后所有systemctl命令都将重新开始工作。

答案3

这两种解决方案对我来说都不起作用。结果发现我的 .service 文件中的其中一行缺少一个 = 符号。我通过查看 /var/log/messages 发现了这一点,并在那里看到了一个更具描述性的错误。因此,拒绝访问具有误导性。这实际上不是一个安全问题。

相关内容