根本原因

根本原因

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_tsemanage 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

関連情報