SELinux 重置 root 密码

SELinux 重置 root 密码

免责声明:这个问题不是要解决 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 密码,您需要遵循以下步骤:

  1. 像之前一样,添加init=/bin/bash到 grub 中的内核命令行末尾。
  2. 在 bash 提示符下,使用 加载 SELinux 策略/usr/sbin/load_policy -i
  3. 使用 以读写方式挂载根文件系统mount -o remount,rw /
  4. 现在修改密码,就成功了。passwd root
  5. 以只读方式重新挂载文件系统以提交更改,并在下次启动时使用 获得干净的文件系统mount -o remount,ro /
  6. 退出 shell 或使用 重新启动系统exec /sbin/init 6

现在您可以使用更改后的root密码登录。

A此过程的更详细说明可从 Red Hat 获得(需要订阅)。

相关内容