2.14. Linux ユーザー namespace での Pod の実行
Linux ユーザー namespace を使用すると、管理者はコンテナーのユーザーおよびグループ識別子 (UID および GID) を分離できるため、実行されているホストシステムとは異なる権限セットを、ユーザー namespace でコンテナーに付与できます。これにより、ユーザー namespace 内で完全な権限を使用してプロセスを実行することをコンテナーに許可する一方で、ホストマシンに対する操作の権限をプロセスに与えないことが可能になります。
デフォルトでは、コンテナーはホストシステムの root ユーザー namespace で実行されます。コンテナーをホストのユーザー namespace で実行することは、そのユーザー namespace でのみ使用可能な機能がコンテナーに必要な場合に便利です。しかし、コンテナーブレイクアウトの問題など、セキュリティー上の懸念が生じます。コンテナーブレイクアウトが発生すると、コンテナー内のプロセスがホストに脱出し、プロセスがホストや他のコンテナー上のファイルにアクセスしたり、ファイルを変更したりできるようになります。
個々のユーザー namespace でコンテナーを実行すると、コンテナーブレイクアウトや、侵害されたコンテナーから他の Pod やノード自体に及ぶ可能性のあるその他のいくつかの脆弱性を軽減できます。
次の手順に示すように、Pod 仕様で hostUsers
パラメーターを false
に設定することにより、Linux ユーザー namespace の使用を設定できます。
Linux ユーザー namespace のサポートは、テクノロジープレビュー機能です。テクノロジープレビュー機能は、Red Hat 製品のサービスレベルアグリーメント (SLA) の対象外であり、機能的に完全ではないことがあります。Red Hat は、実稼働環境でこれらを使用することを推奨していません。テクノロジープレビュー機能は、最新の製品機能をいち早く提供して、開発段階で機能のテストを行い、フィードバックを提供していただくことを目的としています。
Red Hat のテクノロジープレビュー機能のサポート範囲に関する詳細は、テクノロジープレビュー機能のサポート範囲 を参照してください。
2.14.1. Linux ユーザー namespace のサポートの設定 リンクのコピーリンクがクリップボードにコピーされました!
前提条件
cluster
という名前のFeatureGate
CR を編集して、クラスターに必要なテクノロジープレビュー機能を有効にした。oc edit featuregate cluster
$ oc edit featuregate cluster
Copy to Clipboard Copied! Toggle word wrap Toggle overflow FeatureGate
CR の例Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 必要な
UserNamespacesSupport
およびProcMountType
機能を有効にします。
警告クラスターで
TechPreviewNoUpgrade
機能セットを有効にすると、元に戻すことができず、マイナーバージョンの更新が妨げられます。この機能セットを使用すると、該当するテクノロジープレビュー機能をテストクラスターで有効にして、完全にテストすることができます。実稼働クラスターではこの機能セットを有効にしないでください。変更を保存すると、新規マシン設定が作成され、マシン設定プールが更新され、変更が適用されている間に各ノードのスケジューリングが無効になります。
ワーカーノードで crun コンテナーランタイムを有効にした。現在、crun はユーザー名前空間をサポートする唯一のリリース済み OCI ランタイムです。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
手順
次のコマンドを実行して、Pod がデプロイされている OpenShift Container Platform の namespace のデフォルトユーザー ID (UID) およびグループ ID (GID) の範囲を編集します。
oc edit ns/<namespace_name>
$ oc edit ns/<namespace_name>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow namespace の例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注記範囲 1000/10000 は、ID 1000 から始まる 10,000 個の値を意味するため、1000 から 10,999 までの範囲の ID を指定します。
restricted
プロファイルで動作するように設定した Pod を作成し、hostUsers
パラメーターをfalse
に設定することで、Linux ユーザー namespace の使用を有効にします。以下のような YAML ファイルを作成します。
Pod 仕様の例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- Pod が権限昇格を要求できないことを指定します。これは
restricted-v2
Security Context Constraints (SCC) に必要です。 - 2
- UID が 0 以外のユーザーでコンテナーが実行されるように指定します。
- 3
- コンテナーの実行に使用する UID を指定します。
- 4
- コンテナーの実行に使用するプライマリー GID を指定します。
- 5
- Pod をユーザー namespace で実行するように要求します。
true
の場合、Pod はホストのユーザー namespace で実行されます。false
の場合、Pod は Pod 用に作成した新しいユーザー namespace で実行されます。デフォルトはtrue
です。
以下のコマンドを実行して Pod を作成します。
oc create -f <file_name>.yaml
$ oc create -f <file_name>.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
作成した Pod コンテナーで使用されている Pod ユーザー ID とグループ ID を確認します。Pod は Linux ユーザー namespace 内にあります。
Pod 内のコンテナーでシェルセッションを開始します。
oc rsh -c <container_name> pod/<pod_name>
$ oc rsh -c <container_name> pod/<pod_name>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow コマンドの例
oc rsh -c userns-container_name pod/userns-pod
$ oc rsh -c userns-container_name pod/userns-pod
Copy to Clipboard Copied! Toggle word wrap Toggle overflow コンテナー内で使用されているユーザー ID とグループ ID を表示します。
id
sh-5.1$ id
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
uid=1000(1000) gid=1000(1000) groups=1000(1000)
uid=1000(1000) gid=1000(1000) groups=1000(1000)
Copy to Clipboard Copied! Toggle word wrap Toggle overflow コンテナーのユーザー namespace で使用されているユーザー ID を表示します。
lsns -t user
sh-5.1$ lsns -t user
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
NS TYPE NPROCS PID USER COMMAND 4026532447 user 3 1 1000 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1000
NS TYPE NPROCS PID USER COMMAND 4026532447 user 3 1 1000 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1000
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- プロセスの UID は
1000
です。これは Pod 仕様で設定したものと同じです。
Pod が作成されたノードで使用されている Pod ユーザー ID を確認します。ノードは Linux ユーザー namespace の外部にあります。このユーザー ID がコンテナーで使用されている UID と異なっている必要があります。
そのノードのデバッグセッションを開始します。
oc debug node/ci-ln-z5vppzb-72292-8zp2b-worker-c-q8sh9
$ oc debug node/ci-ln-z5vppzb-72292-8zp2b-worker-c-q8sh9
Copy to Clipboard Copied! Toggle word wrap Toggle overflow コマンドの例
oc debug node/ci-ln-z5vppzb-72292-8zp2b-worker-c-q8sh9
$ oc debug node/ci-ln-z5vppzb-72292-8zp2b-worker-c-q8sh9
Copy to Clipboard Copied! Toggle word wrap Toggle overflow /host
をデバッグシェル内のルートディレクトリーとして設定します。chroot /host
sh-5.1# chroot /host
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ノードのユーザー namespace で使用されているユーザー ID を表示します。
lsns -t user
sh-5.1# lsns -t user
Copy to Clipboard Copied! Toggle word wrap Toggle overflow コマンドの例
NS TYPE NPROCS PID USER COMMAND 4026531837 user 233 1 root /usr/lib/systemd/systemd --switched-root --system --deserialize 28 4026532447 user 1 4767 2908816384 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1000
NS TYPE NPROCS PID USER COMMAND 4026531837 user 233 1 root /usr/lib/systemd/systemd --switched-root --system --deserialize 28 4026532447 user 1 4767 2908816384 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1000
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- プロセスの UID は
2908816384
です。これは Pod 仕様で設定したものと異なります。