systemd-nspawn OS 容器无法使用,因为我无法设置 root 密码

sou*_*edi 5 fedora selinux container systemd-nspawn

我结合了原始博客文章中的详细说明和手册页中的最新说明(使用 dnf 而不是 yum)。

# sudo dnf -y --releasever=24 --installroot=$HOME/fedora-24 --disablerepo='*' --enablerepo=fedora --enablerepo=updates install systemd passwd dnf fedora-release vim-minimal

# sudo systemd-nspawn -D fedora-24
Spawning container fedora-24 on /home/alan-sysop/fedora-24
Press ^] three times within 1s to kill container.
-bash-4.3# passwd
Changing password for user root.
New password:
Retype new password:
Run Code Online (Sandbox Code Playgroud)

结果:

passwd: Authentication token manipulation error
Run Code Online (Sandbox Code Playgroud)

和 AVC 弹出窗口,即 SELinux 错误。它说passwd不允许取消链接(替换)/etc/passwd。“疑难解答”按钮的建议之一是我可以将标签分配passwd_file_t/etc/passwd.

怎么了,我该如何解决?

sou*_*edi 6

出于某种原因,dnf 没有在 /etc/passwd 上设置“正确的”SELinux 标签。但它确实在 /bin/passwd 上设置了标签。这种不匹配是导致问题的原因。欢迎进一步解释:)。

$ ls -Z fedora-24/etc/passwd
unconfined_u:object_r:etc_t:s0 fedora-24/etc/passwd
$ ls -Z /etc/passwd
system_u:object_r:passwd_file_t:s0 /etc/passwd

$ ls -Z fedora-24/bin/passwd
system_u:object_r:passwd_exec_t:s0 fedora-24/bin/passwd
$ ls -Z /usr/bin/passwd
system_u:object_r:passwd_exec_t:s0 /usr/bin/passwd
Run Code Online (Sandbox Code Playgroud)

尝试restorecon -Rv /在容器内运行没有任何作用。IIRC libselinux 检测它何时在容器中运行,并且不会做任何事情。

解决方案

我们需要从容器外部运行:

restorecon -Rv fedora-24/
Run Code Online (Sandbox Code Playgroud)

它确保所有SELinux 标签都被重置。(容器主机期望的值,即未标记)。然后我们就可以成功设置root密码了。