コンテナ内でSELinuxを有効化する
こんなことをしたい人は私以外にいないかもしれませんが、コンテナ内でSELinuxを有効化する方法を記します。
Podmanで作業していますが、Dockerでも同様の手順で実行できます。
ホストマシン
Hyper-Vで作成したRocky Linux 9.3の仮想マシンを使用します。
$ cat /etc/redhat-release
Rocky Linux release 9.3 (Blue Onyx)
$ uname -a
Linux rocky9 5.14.0-362.24.1.el9_3.x86_64 #1 SMP PREEMPT_DYNAMIC Wed Mar 13 17:33:16 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux
ホストマシンのSELinuxの状態を確認する
SELinuxの状態を確認するには、以下のコマンドを実行します。
getenforceコマンドを実行してEnforcing
と表示されていれば、SELinuxが有効になっています。
$ getenforce
Enforcing
コンテナ内でSELinuxを有効化するには、ホストマシンのSELinuxの状態がEnforcing
(有効)である必要があります。
SELinuxを有効化する
SELinuxを有効化するには、コンテナ起動時に--privileged
と--security-opt label=nested
を指定します。
nested
と指定している通り、ホストマシンのSELinuxの状態をコンテナ内に引き継ぎます。
そのため、ホストマシンがDisabled
だったらコンテナ内もDisabled
になり、ホストマシンがPermissive
だったらコンテナ内もPermissive
になります。
以下は、Red Hat Universal Base Image 9を使用して、コンテナ内のSELinuxを有効化する例です。
コンテナを起動する
podman run -it --privileged --security-opt label=nested redhat/ubi9:latest
コンテナ内のSELinuxを有効化するのに必要なパッケージをインストールする
dnf install -y container-selinux
コンテナ内でSELinuxの状態を確認する
$ getenforce
Enforcing
まとめ
コンテナ内でSELinuxを有効化する方法を記しました。
私はコンテナ内でcpコマンドの--preserve=context
を付けたスクリプトがエラーになることから、SELinuxを有効化する必要がありました。
SELinuxの状況に応じて--preserve=context
を付けないようにする方法もありますが、後学のためにコンテナ内でSELinuxを有効化する方法を知りたく、調査しました。
同じような状況になった方の参考になれば幸いです。
Discussion