我的一个朋友在使用 SELinux 时遇到了麻烦。服务器使用目标策略在强制模式下配置 SELinux。
使用 Puppet 时,restorecon
或chcon
,即使 SELinux 未处于强制模式,他也会出现这样的错误
# chcon -t oddjob_t /etc/tt
chcon: failed to change context of `/etc/oddjobd.conf.d' to `unconfined_u:object_r:oddjob_t:s0': Permission denied
其中/var/log/audit/audit.log
包含:
type=AVC msg=audit(1429628369.080:338935): avc: denied { relabelto } for pid=3629 comm="chcon" name="oddjobd.conf.d" dev=dm-0 ino=39413 scontext=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 tcontext=unconfined_u:object_r:oddjob_t:s0 tclass=dir
type=SYSCALL msg=audit(1429628369.080:338935): arch=c000003e syscall=188 success=no exit=-13 a0=12f20e0 a1=3edf0162d9 a2=12f3620 a3=22 items=0 ppid=1206 pid=3629 auid=2006 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=25771 comm="chcon" exe="/usr/bin/chcon" subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 key=(null)
用类似的方法,restorecon
失败了:
# restorecon -Rv /etc
restorecon reset /etc/oddjobd.conf.d context system_u:object_r:etc_t:s0->system_u:object_r:oddjob_t:s0
restorecon set context /etc/oddjobd.conf.d->system_u:object_r:oddjob_t:s0 failed:'Permission denied'
其中/var/log/audit/audit.log
包含:
type=AVC msg=audit(1429628361.258:338934): avc: denied { relabelto } for pid=3627 comm="restorecon" name="oddjobd.conf.d" dev=dm-0 ino=39409 scontext=unconfined_u:unconfined_r:setfiles_t:s0-s0:c0.c1023 tcontext=system_u:object_r:oddjob_t:s0 tclass=dir
type=SYSCALL msg=audit(1429628361.258:338934): arch=c000003e syscall=189 success=no exit=-13 a0=7fdb4b1d5190 a1=7fdb49e762d9 a2=7fdb4b1d50f0 a3=1e items=0 ppid=1206 pid=3627 auid=2006 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=25771 comm="restorecon" exe="/sbin/setfiles" subj=unconfined_u:unconfined_r:setfiles_t:s0-s0:c0.c1023 key=(null)
他以 root 身份登录。 bash shell 不受限制 ( id -Z
)。
那么到底出了什么问题呢?
答案1
好吧,事实证明我的朋友只是试图使用无效的文件类型(oddjob_t
是进程上下文,而不是文件上下文!)
将该目录的上下文类型更改为任何其他类型都可以正常工作(例如chcon -t etc_t /etc/oddjobd.conf.d
)。
可以用来seinfo
检查存在哪些文件类型:
# seinfo -afile_type -x | grep "oddjob"
oddjob_var_run_t
oddjob_exec_t
oddjob_mkhomedir_exec_t
运行restorecon
也失败,因为我的朋友插入了无效的文件上下文,其中:
semanage fcontext --add -t oddjob_t "/etc/oddjobd.conf.d(/.*)?"
所以我删除了那个不正确的规则(根本不需要该规则):
semanage fcontext --list | grep "oddjob_t"
semanage fcontext -d -t oddjob_t "/etc/oddjobd.conf.d(/.*)?"
PS 我发现这篇博文对于解决这个问题非常有用 Dan Walsh 的博客:SELinux 类型重新审视。