昨天,我在 Centos6 VM 盒中添加了一个驱动器,在该驱动器上创建了一个 /home 挂载点,然后将一个用户(在本例中为 jenkins)移动到该驱动器以释放 / 挂载点的空间。
这似乎工作正常,权限和标签看起来都正确,但今天早些时候我开始发现问题,我无法以 jenkins 用户身份从任何机器通过 SSH 连接到机器。以 root 身份通过 SSH 连接到机器并su
连接到 jenkins 工作正常。最重要的是,如果我执行了 a service sshd stop
,然后/usr/sbin/sshd
我就可以直接以 jenkins 用户身份连接到机器。
经过大量调试后,我最终发现 SELinux 拒绝/var/log/audit/audit.log
如下:
type=AVC msg=audit(1428584552.564:187): avc: denied { search } for pid=1798 comm="sshd" name="/" dev=sdd1 ino=2 scontext=system_u:system_r:sshd_t:s0-s0:c0.c1023 tcontext=system_u:object_r:file_t:s0 tclass=dir
type=AVC msg=audit(1428584552.567:188): avc: denied { getattr } for pid=1798 comm="sshd" path="/home" dev=sdd1 ino=2 scontext=system_u:system_r:sshd_t:s0-s0:c0.c1023 tcontext=system_u:object_r:file_t:s0 tclass=dir
将 SELinux 设置为允许后,我就能够以 jenkins 用户身份远程重新连接。
我对 SELinux 不太熟悉,但读完之后(再次)Gentoo 的 SELinux 教程我将这些错误视为 sshd 尝试使用 的系统上下文访问 / 和 /home system_u:system_r:sshd_t:s0
。相反,这些端点被标记为,system_u:object_r:file_t:s0
至少是 /home 目录的标签(不太确定如何查看 / 的标签)。
对我来说,这些标签看起来适合这些目录,但我不太清楚为什么它要尝试在目录树中寻找 sshd_t 标签。
运行 ls -laZ 来获取重要部分(.ssh 文件夹和authorized_keys)得到:
drwx------. jenkins jenkins unconfined_u:object_r:ssh_home_t:s0 .ssh
和
-rw-------. jenkins jenkins unconfined_u:object_r:ssh_home_t:s0 authorized_keys
它看起来与我正在检查的其他盒子一样并且它们运行良好。
我需要做什么才能让 SELinux 合作,以便我可以重新执行?
编辑:我尝试卸载 /home 并使用 restorecon 尝试重新标记目录,这要归功于Michael Hampton 的建议但这并没有改变目录上的标签,并且如上所述,system_u:object_r:file_t:s0
与运行良好的其他盒子相比,/home 的标签看起来是正确的。
有没有办法在尝试访问该目录时更改 sshd 的系统上下文?
答案1
您没有查看正确的目录。
/
您的 AVC 拒绝具体抱怨的是和上的上下文/home
,而不是其中的任何文件。
这让我怀疑您不只是错误标记了那些目录条目。
我的恢复方法如下:
- 卸载
/home
。这是必要的,因为我们想要恢复父文件系统中挂载点上的文件上下文以及子文件系统内的文件上下文。 恢复挂载点的文件上下文
/home
。restorecon -v /home
重新挂载
/home
。恢复整个系统的文件上下文,以确保万无一失。可以通过以下两种方式之一完成此操作:
touch /.autorelabel
然后重新启动。系统将在启动过程中重新标记。restorecon -r -v /
完成后重新启动。我通常使用此方法,因为它会为您提供已更改文件上下文的完整列表。
重新标记并重新启动后,您就可以安全地返回 SELinux 强制执行。