免责声明:这个问题不是要解决 SELinux 处于活动状态时更改 root 密码的问题,因为已经有很多指南可以解决这个问题。这更多的是关于 SELinux 内部如何做到这一点。
我是 SELinux 的新用户,但最近我接触得更多了。曾经有人问我,如果忘记了 root 密码,如何重置它。
所以我启动了我的 CentOS,将 grub 条目编辑为类似
linux16 <kernel_location> root=/dev/mapper/centos-root rw init=/bin/bash
我运行了一遍passwd
又一遍,然后sync
强制重启。重启后,使用新密码登录被拒绝,当然使用旧密码登录也被拒绝。
再次重新启动并向内核传递禁用 SELinux 的参数(selinux=0
)。尝试使用新密码登录,成功了。之后我强制 fs 自动重新标记(通过文件.autorelabel
),在 SELinux 处于活动状态时,现在可以登录了。
我的问题是:为什么会发生这种情况?为什么当仅更改密码而不是更改用户或对象时,重新标记会影响登录?
感谢您的关注。
TL;DR:通常的 root 密码重置在 SELinux 中不起作用。为什么?
编辑:这是在运行 CentOS7 并以 KVM 作为虚拟机管理程序的虚拟机上测试的。
答案1
我能够在新安装的 CentOS 7.5 系统中复制此问题。
事情的经过如下:
启动时init=/bin/bash
可能会遇到两个问题:
根文件系统可能以只读方式挂载。在这种情况下,
passwd
会出现Authentication token manipulation error
。这是非常明显的:如果文件系统没有以读写方式安装,就不可能对其进行写入。
SELinux 策略可能未加载。在这种情况下,
passwd
您将成功更改密码,但您会遇到上述原始问题中描述的问题:没有人能够登录。密码哈希存储在
/etc/shadow
文件中。此文件通常具有 SELinux 类型shadow_t
。但是,在未加载 SELinux 策略的情况下更改文件会导致 SELinux 类型从文件中删除,使其保留为unlabeled_t
。因此,尝试读取文件以验证登录的服务将无法再读取它。
因此,要更改 RHEL/CentOS 7 上的 root 密码,您需要遵循以下步骤:
- 像之前一样,添加
init=/bin/bash
到 grub 中的内核命令行末尾。 - 在 bash 提示符下,使用 加载 SELinux 策略
/usr/sbin/load_policy -i
。 - 使用 以读写方式挂载根文件系统
mount -o remount,rw /
。 - 现在修改密码,就成功了。
passwd root
- 以只读方式重新挂载文件系统以提交更改,并在下次启动时使用 获得干净的文件系统
mount -o remount,ro /
。 - 退出 shell 或使用 重新启动系统
exec /sbin/init 6
。
现在您可以使用更改后的root密码登录。
A此过程的更详细说明可从 Red Hat 获得(需要订阅)。