CentOS Linux SELinux 安全上下文错误引起的宕机故障

在某些情况下,我们会用一些外部的文件复制替换系统中原有的文件,如文件损坏,或者安装了错误版本的软件、或者怀疑原文件被替换成含病毒的版本等。这里以 VirtualBox 虚拟机中的 CentOS 7 为例,演示的是在启用 SELinux 的情况下,错误的复制替换系统中 /lib64/libc-2.17.so 造成的宕机故障及修复。其它启用了 SELinux 的 Linux 系统也可作为参考。视频演示地址:https://www.bilibili.com/video/BV1vL4y1u7CU?share_source=copy_web

一、查看系统状态

为了方便查看系统的启动信息,我们修改一下 grub 启动配置文件 /boot/grub2/grub.cfg,把默认启动项 linux16 /vmlinuz-3.10.0* 开头那行中的 rhgb quiet 去掉。然后,我们查看一下系统中 SELinux 的状态,使用 getenforce 命令显示如下:

[root@centos ~]# getenforce
Enforcing

这表示系统是启用了 SELinux 的。查看 /lib64/libc-2.17.so 属性:

[root@centos ~]# ls -Z /lib64/libc-2.17.so
-rwxr-xr-x. root root system_u:object_r:lib_t:s0       /lib64/libc-2.17.so

以普通用户 test 的身份复制一份 libc-2.17.so 到家目录下备用:

[root@centos ~]# su - test
上一次登录:六 3月  5 11:46:21 CST 2022tty1 上
[test@centos ~]$ pwd
/home/test
[test@centos ~]$ cp /lib64/libc-2.17.so ./ -v
"/lib64/libc-2.17.so" -> "./libc-2.17.so"
[test@centos ~]$ ls -Z libc-2.17.so
-rwxr-xr-x. test test unconfined_u:object_r:user_home_t:s0 libc-2.17.so

可以看到,复制的文件 SELinux 安全上下文已经改变了。其中的类型由“lib_t”变成了“user_home_t”。

二、在 Live CD 环境下复制替换文件

我们用 /home/test/libc-2.17.so 复制替换 /lib64/libc-2.17.so 。在运行的系统下,一般情况是不能够完成的,系统会立刻重启,替换不会成功。但不排除在某些情况下,在系统运行的情况下是可以替换成功的。这里用 CentOS-7-livecd-x86_64.iso 启动系统,在 Live CD 的环境下用 /home/test/libc-2.17.so 替换 /lib64/libc-2.17.so:

[liveuser@localhost Desktop]$ sudo mount /dev/centos/root /mnt -v
mount: /dev/mapper/centos-root mounted on /mnt.
[liveuser@localhost Desktop]$ cd /mnt
[liveuser@localhost mnt]$ ls -Z home/test/libc-2.17.so lib64/libc-2.17.so
-rwxr-xr-x. liveuser liveuser unconfined_u:object_r:user_home_t:s0 home/test/libc-2.17.so
-rwxr-xr-x. root     root     system_u:object_r:lib_t:s0       lib64/libc-2.17.so
[liveuser@localhost mnt]$ sudo cp home/test/libc-2.17.so lib64/libc-2.17.so -av
‘home/test/libc-2.17.so’ -> ‘lib64/libc-2.17.so’
[liveuser@localhost mnt]$ ls -Z home/test/libc-2.17.so lib64/libc-2.17.so
-rwxr-xr-x. liveuser liveuser unconfined_u:object_r:user_home_t:s0 home/test/libc-2.17.so
-rwxr-xr-x. liveuser liveuser unconfined_u:object_r:user_home_t:s0 lib64/libc-2.17.so

这里因为使用了 cp -a 参数,所以 /lib64/libc-2.17.so 的 SELinux 安全上下文的类型变成了“user_home_t”。然后,我们重新从硬盘启动系统,就会发现已经不能启动成功。启动画面会报告 libc-2.17.so 相关的 SELinux 安全上下文相关错误信息,如:

[    38.204015] type=1400 audit(1646560498.018:43): avc:  denied  { read } for  pid=716 comm="systemd-logind" name ="libc-2.17.so" dev="dm-0" ino=550218 scontext=system_u:system_r:systemd_logind_t:s0 tcontext=unconfined_u:object_r:user_home_t:s0 tclass=file permissive=0

从上面的信息可以看出是 libc-2.17.so 的 SELinux 安全上下文有问题。

三、修复 libc-2.17.so 安全上下文

我们重启系统,在 grub 默认启动项 linux16 /vmlinuz-3.10.0* 开头那行的末尾加上一个空格,再加上 selinux=0 ,这样,临时禁止了 SELinux,我们就可以进入系统修复 libc-2.17.so 的安全上下文。进入系统,查看 SELinux 状态:

[root@centos ~]# getenforce
Disabled

然后,我们参照 /lib64/libcidn-2.17.so 这个动态链接库文件来修复 /lib64/libc-2.17.so 的 SELinux 安全上下文。如下:

[root@centos ~]# ls -Z /lib64/libc*.so
-rwxr-xr-x. test test unconfined_u:object_r:user_home_t:s0 /lib64/libc-2.17.so
-rwxr-xr-x. root root system_u:object_r:lib_t:s0       /lib64/libcidn-2.17.so
lrwxrwxrwx. root root system_u:object_r:lib_t:s0       /lib64/libcidn.so -> ../../lib64/libcidn.so.1
-rwxr-xr-x. root root system_u:object_r:lib_t:s0       /lib64/libcrypt-2.17.so
lrwxrwxrwx. root root system_u:object_r:lib_t:s0       /lib64/libcrypt.so -> ../../lib64/libcrypt.so.1
-rw-r--r--. root root system_u:object_r:lib_t:s0       /lib64/libc.so
[root@centos ~]# chcon -v --reference=/lib64/libcidn-2.17.so /lib64/libc-2.17.so
正在更改"/lib64/libc-2.17.so" 的安全环境
[root@centos ~]# ls -Z /lib64/libc-2.17.so
-rwxr-xr-x. test test system_u:object_r:lib_t:s0       /lib64/libc-2.17.so
[root@centos ~]# chown root:root /lib64/libc-2.17.so -v
changed ownership of "/lib64/libc-2.17.so" from test:test to root:root
[root@centos ~]# ls -Z /lib64/libc-2.17.so
-rwxr-xr-x. root root system_u:object_r:lib_t:s0       /lib64/libc-2.17.so
[root@centos ~]#

然后,重启系统。修复完毕。

还有一种修复方式,就是同样用上面在 grub 启动项后面加 selinux=0 的方法进入系统后,直接 touch /.autorelabel 就行。这样,重启系统后会进行整个文件系统的 relabel,修复错误的 SELinux 安全上下文。

发表评论

电子邮件地址不会被公开。 必填项已用*标注