root时拒绝systemctl访问


16

当我跑步

sudo systemctl disable avahi-daemon.socket

我懂了

Failed to execute operation: Access denied

但是它以root身份运行,如何拒绝访问?(CentOS 7)


您是否在Docker,LXC或LXD等容器中运行?您确定知道您是否在容器中吗?
allquixotic

我正在VirtualBox中运行全新的CentOS安装。那算作一个容器吗?
spraff

不,VirtualBox不是容器,而是虚拟机。它们根本不同。您最有可能需要journalctl -xe找出原因。
allquixotic

1
请注意,当尝试以强制模式访问不存在的服务时,也会出现此错误消息(“无法执行操作:访问被拒绝”)。在许可模式下,您将得到“无法执行操作:没有这样的文件或目录”。
danmichaelo '16

Answers:


23

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

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

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

# getenforce
Enforcing

就我而言,该systemctl错误USER_AVC在SELinux日志文件中产生了拒绝/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

它应该可以正常工作。但是,此第二种解决方案具有安全隐患。


我没有得到任何输出,而不是Removed symlink事后systemctl disable avahi-daemon.socket的前发生故障,生产同一行audit.log
spraff

您可以尝试禁用selinux强制模式吗?setenforce 0
Elouan Keryell-Even

1
systemctl disable avahi-daemon.socketsetenforce 0如果没有systemctl daemon-reexec(我现在意识到这unmask是您的命令,而不是我的:-) 成功了,那么就可以这样做setenforce 1吗?
spraff

@spraff我不知道,我是SELinux新手,哈哈。依玛setenforce 0在我的回答中提及。
Elouan Keryell-Even,2013年

1
请不要setenforce 0。这是生产环境中的不良做法。请systemctl daemon-reexec改用。
Younes

10

就我而言,我刚刚升级systemd,所有systemctl命令都失败了:

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

但是,根据手册init页,您可以通过发送SIGTERM给以PID 1运行的守护程序来执行相同的操作:

kill -TERM 1

这将重新加载守护程序,然后所有systemctl命令再次开始工作。


1
谢谢。解决了我的问题,很长一段时间后升级了archlinux发行版。
布尔吉'19

1
在Ubuntu 18.10上工作-谢谢!
Roy Shilkrot

1

两种解决方案都不适合我。原来,我的.service文件中的其中一行中缺少一个=号。我通过查看/ var / log / messages发现了这一点,并在那里看到了一个更具描述性的错误。因此,“拒绝访问”具有误导性。这并不是一个真正的安全问题。


3
您应该提供有关如何解决此问题的更多详细信息。例如,您谈论的是更详细的错误消息,但没有指出错误消息的确切含义。如果没有此信息,则最好将其用作注释,因为没有此信息的答案是不完整的。
Ramhound

哪个日志文件显示了该消息?
rogerdpack
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.