🛡️

コンテナ内でSELinuxを有効化する

2024/05/04に公開

こんなことをしたい人は私以外にいないかもしれませんが、コンテナ内でSELinuxを有効化する方法を記します。

Podmanで作業していますが、Dockerでも同様の手順で実行できます。

ホストマシン

Hyper-Vで作成したRocky Linux 9.3の仮想マシンを使用します。

host
$ 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が有効になっています。

host
$ 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を有効化する例です。

コンテナを起動する

host
podman run -it --privileged --security-opt label=nested redhat/ubi9:latest

コンテナ内のSELinuxを有効化するのに必要なパッケージをインストールする

container
dnf install -y container-selinux

コンテナ内でSELinuxの状態を確認する

container
$ getenforce
Enforcing

まとめ

コンテナ内でSELinuxを有効化する方法を記しました。

私はコンテナ内でcpコマンドの--preserve=contextを付けたスクリプトがエラーになることから、SELinuxを有効化する必要がありました。

SELinuxの状況に応じて--preserve=contextを付けないようにする方法もありますが、後学のためにコンテナ内でSELinuxを有効化する方法を知りたく、調査しました。

同じような状況になった方の参考になれば幸いです。

GitHubで編集を提案

Discussion