ウェブサイト検索

Podman カスタム グラフルート ディレクトリの SELinux コンテキスト ラベルを設定する |


Podman で作成したコンテナのデータを保存するカスタム ディレクトリを設定したいのですが、ディレクトリのファイル タイプ (およびその内容) を Podman で使用されるコンテキスト タイプに変更するにはどうすればよいですか? SELinux を実行しているシステムでは、すべてのプロセスとファイルには、セキュリティ関連の情報を表す方法でラベルが付けられます。 /var/lib/containers 以外のディレクトリにデータが保存されたコンテナを作成しようとすると、アクセス許可が拒否されます。

CentOS 8 サーバーでこれをデモします。 SELinux を Enforcing モードにしてみましょう。

$ sudo setenforce 1
$ sestatus
SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   enforcing
Mode from config file:          enforcing
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Memory protection checking:     actual (secure)
Max kernel policy version:      31

podmanを提供するコンテナツールをインストールします。

sudo dnf module install container-tools

helloworld コンテナを実行して、podman が期待どおりに動作していることを確認しましょう。

$ podman run --rm hello-world

Trying to pull docker.io/library/hello-world...
Getting image source signatures
Copying blob 0e03bdcc26d7 done
Copying config bf756fb1ae done
Writing manifest to image destination
Storing signatures

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

コンテナの現在のルートディレクトリ設定を確認します。

$ podman info | grep -i root
  rootless: false
  GraphRoot: /var/lib/containers/storage
  RunRoot: /var/run/containers/storage

データを保存するためのカスタム ディレクトリを作成しましょう。

sudo mkdir -p /data/containers

設定を更新し、ディレクトリを上記で作成したディレクトリに変更します。

$ sudo vi /etc/containers/storage.conf
# Primary Read/Write location of container storage
#graphroot = "/var/lib/containers/storage"
graphroot = "/data/containers"

コンテナを実行してみてください。

# podman run --rm -it  ubuntu bash
Getting image source signatures
Copying blob 0f3630e5ff08 done
Copying blob d72e567cc804 done
Copying blob b6a83d81d1f4 done
Copying config 9140108b62 done
Writing manifest to image destination
Storing signatures
bash: error while loading shared libraries: libc.so.6: cannot change memory protections

出力から、次のようなエラー メッセージが表示されました。

bash: error while loading shared libraries: libc.so.6: cannot change memory protections

ディレクトリ /data/containers に正しい SELinux ラベルを設定して、再試行してみましょう。

sudo semanage fcontext -a -e /var/lib/containers /data/containers
sudo restorecon -R -vv /data/containers

semanage コマンドが見つからない場合は、以下のコマンドを使用してインストールします。

sudo yum install policycoreutils-python-utils -y

SELinuxコンテキストタイプを確認します。

$ ls -dZ /data/containers/
unconfined_u:object_r:container_var_lib_t:s0 /data/containers/

タイプが container_var_lib_t に設定されているかどうかを確認します。

コンテナを再実行します。

# podman run --rm -it  ubuntu bash
root@615b27ff4e87:/# cat /etc/os-release
NAME="Ubuntu"
VERSION="20.04.1 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.1 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal
root@615b27ff4e87:/# exit
exit

コンテナは正常に起動されました。

ポッドマンに関するその他の記事:

OpenShift 内部レジストリを外部に公開し、Docker/Podman CLI でログインする

Windows 10 で Podman を実行する | WSL2 を搭載した Windows Server 2019

Docker/Podman コンテナを Systemd サービスとして実行する方法

関連記事: