根本原因

根本原因

SELinux 重新标记后,尝试在 Podman 上运行任何 pod 都会失败

$ podman run -ti alpine
Error relocating /lib/ld-musl-x86_64.so.1: RELRO protection failed: No error information
Error relocating /bin/sh: RELRO protection failed: No error information

并且您已将您的内容移至~/.local/share/containers其他地方,链接到那里:

$ ls -l ~/.local/share/containers
lrwxrwxrwx. 1 asdf asdf 32 Oct 13  2022 /home/asdf/.local/share/containers -> /x/y/z/containers/

在审核日志中,将记录 AVC 警报

答案1

根本原因

SELinux 的semanage fcontext数据库处理真实路径 [1]。如果您将其移动到~/.local/share/containers其他位置(在我的情况下,是为了管理磁盘空间)并创建了指向它的链接,那么在restorecon运行时,它将将其标签重置为实际位置对应的任何位置(最有可能default_t)。

你可以用[2]来检查:

ls -Z ~/.local/share/containers/storage/overlay{,-images,-layers} | less

这些文件的 SELinux 上下文应为container_ro_file_t.您将能够semanage fcontext使用以下命令查看原始规则:

# semanage fcontext -l | grep container | grep storage
/home/[^/]+/\.local/share/containers/storage/overlay(/.*)? all files          unconfined_u:object_r:container_ro_file_t:s0 
/home/[^/]+/\.local/share/containers/storage/overlay-images(/.*)? all files          unconfined_u:object_r:container_ro_file_t:s0 
/home/[^/]+/\.local/share/containers/storage/overlay-layers(/.*)? all files          unconfined_u:object_r:container_ro_file_t:s0 
/home/[^/]+/\.local/share/containers/storage/overlay2(/.*)? all files          unconfined_u:object_r:container_ro_file_t:s0 
/home/[^/]+/\.local/share/containers/storage/overlay2-images(/.*)? all files          unconfined_u:object_r:container_ro_file_t:s0 
/home/[^/]+/\.local/share/containers/storage/overlay2-layers(/.*)? all files          unconfined_u:object_r:container_ro_file_t:s0 
/home/[^/]+/\.local/share/containers/storage/volumes/[^/]*/.* all files          unconfined_u:object_r:container_file_t:s0 

使固定

您必须复制每条规则并使其适应您的环境。例如,对于上面的第一行:

semanage fcontext -a -t container_ro_file_t '/x/y/z/containers/storage/overlay(/.*)?'

当然,替换/x/y/z为您的环境位置并为每个原始规则执行命令。确保使用您系统的原始规则作为事实来源,因为它可能与我的不同。

请注意,该volumes线与其他线略有不同。

一旦所有规则就位,运行restorecon

restorecon -Rv /x/y/z/containers/

我不确定这是否是最好或最正确的方法,并且可能不受支持。但无论如何,首先创建该链接就已经是一种偏差。它确实对我有用:)

参考

答案2

发布的回复(由 caxcaxcoatl 提供)是正确的。

我找到了一个更直接的解决方案:

for item in $(ls -Z ~/.local/share/containers/storage/overlay{,-images,-layers} | grep home | sed 's/://g')
do
   sudo restorecon -Rv ${item}
done

相关内容