SELinux 重置 root 密码

Jor*_*eno 12 password redhat selinux centos

免责声明:这个问题不是为了解决在 SELinux 处于活动状态时更改 root 密码的问题,因为已经有很多指南可以解决这个问题。这更多是关于 SELinux 在内部是如何做到的。

我最近是 SELinux 的用户,但最近我与它有更多的接触。有一段时间有人问我如何在忘记密码的情况下重置 root 密码。

所以我启动了我的 CentOS,将 grub 条目编辑为类似

linux16 <kernel_location> root=/dev/mapper/centos-root rw init=/bin/bash
Run Code Online (Sandbox Code Playgroud)

我跑了passwd然后跑了sync并强制重启。重新启动后,使用新密码和旧密码登录都被拒绝了。

再次重新启动并向内核传递参数以禁用 SELinux ( selinux=0)。尝试使用新密码登录,成功。之后我强制 fs 自动重新标记(通过文件.autorelabel),并且在 SELinux 处于活动状态时,现在可以登录了。

我的问题是:为什么会发生?当仅更改密码而不更改用户或对象时,为什么重新标记会影响登录?

感谢您的关注。

TL;DR:通常的 root 密码重置在 SELinux 中不起作用。为什么?

编辑:这是在运行 CentOS7 的虚拟机上测试的,KVM 作为管理程序。

Mic*_*ton 18

我能够在新安装的 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 提示符下,使用/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 密码登录。

一个此过程的更详细的解释可以从红帽(需要订阅)。

  • @JorgeHeleno SELinux 确实在内核启动时默认开启或关闭,但用户区负责决定加载哪些策略。内核无法决定这一点,因为某些安装可能需要不同的策略(例如targeted、strict、mls)。这发生在启动过程的早期,但是当你运行 `init=/bin/bash` 时你可以绕过它。 (4认同)
  • @Jorge Helen:您的解释已接近完成。重点是被`passwd`改变的文件,即`/etc/passwd`和`/etc/shadow`。如果在没有加载策略的情况下运行 `passwd`,它不会在正确的 selinux 上下文中运行,并且更改的文件最终会使用不同的 selinux 上下文。在启用 selinux 且策略处于活动状态的情况下启动时,密码检查失败是因为文件上下文不合适,而不是因为“密码错误”错误。在没有加载策略的情况下更改密码时,通过触摸 `/.autorelabel` 强制 selinux 关联文件上下文也可以解决该问题。 (2认同)