昨天我将一个驱动器添加到 Centos6 VM 框,在驱动器上创建了一个 /home 挂载点,然后将一个用户(在本例中为 jenkins)移动到它以从 / 挂载点释放空间。
这似乎工作正常,权限和标签看起来都正确,但今天早些时候我开始看到我无法以 jenkins 用户身份从任何盒子通过 SSH 连接到盒子的问题。以 root 身份su
通过SSH 连接到该框并连接到 jenkins 工作正常。最重要的是,如果我做了一个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
Run Code Online (Sandbox Code Playgroud)
将 SELinux 设置为 permissive 然后允许我以 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
Run Code Online (Sandbox Code Playgroud)
和
-rw-------. jenkins jenkins unconfined_u:object_r:ssh_home_t:s0 authorized_keys
Run Code Online (Sandbox Code Playgroud)
这看起来与我正在检查的其他框相同,并且它们工作正常。
我需要做什么才能让 SELinux 合作,以便我可以重新执行?
编辑:由于迈克尔汉普顿的建议,我已经尝试卸载 /home 并使用 restorecon 尝试重新标记目录,但这并没有改变目录上的system_u:object_r:file_t:s0
标签,如上所述,与其他框相比,/home的标签看起来是正确的运行良好。
有没有办法在尝试访问此目录时更改 sshd 的系统上下文?
您没有查看正确的目录。
您的 AVC 拒绝是专门针对/
和/home
分别抱怨上下文,而不是针对其中的任何文件。
这让我怀疑您不仅仅是那些被错误标记的目录条目。
这是我将如何恢复:
/home
。这是必要的,因为我们要恢复父文件系统中挂载点上的文件上下文以及子文件系统中的文件上下文。恢复/home
挂载点的文件上下文。
restorecon -v /home
Run Code Online (Sandbox Code Playgroud)重新安装/home
。
为整个系统恢复文件上下文,只是为了确定。这可以通过以下两种方式之一完成:
touch /.autorelabel
并重新启动。系统将在启动期间重新标记。restorecon -r -v /
并在完成后重新启动。我通常使用这种方法,因为它为您提供了已更改文件上下文的完整列表。重新标记并重新启动后,您应该可以安全地返回 SELinux 强制执行。