2.14. Linux ユーザー名前空間での Pod の実行
Linux ユーザー名前空間を使用すると、管理者はコンテナーのユーザーおよびグループ識別子 (UID および GID) を分離できるため、実行されているホストシステムとは異なる権限セットを、ユーザー名前空間でコンテナーに付与できます。これにより、ユーザー名前空間内で完全な権限を使用してプロセスを実行することをコンテナーに許可する一方で、ホストマシンに対する操作の権限をプロセスに与えないことが可能になります。
デフォルトでは、コンテナーはホストシステムの root ユーザー名前空間で実行されます。コンテナーをホストのユーザー名前空間で実行することは、そのユーザー名前空間でのみ使用可能な機能がコンテナーに必要な場合に便利です。しかし、コンテナーブレイクアウトの問題など、セキュリティー上の懸念が生じます。コンテナーブレイクアウトが発生すると、コンテナー内のプロセスがホストに脱出し、プロセスがホストや他のコンテナー上のファイルにアクセスしたり、ファイルを変更したりできるようになります。
個々のユーザー名前空間でコンテナーを実行すると、コンテナーブレイクアウトや、侵害されたコンテナーから他の Pod やノード自体に及ぶ可能性のあるその他のいくつかの脆弱性を軽減できます。
次の手順に示すように、Pod 仕様で hostUsers パラメーターを false に設定することで、Linux ユーザー名前空間の使用を設定できます。
Linux ユーザー名前空間のサポートは、テクノロジープレビュー機能です。テクノロジープレビュー機能は、Red Hat 製品のサービスレベルアグリーメント (SLA) の対象外であり、機能的に完全ではないことがあります。Red Hat は、実稼働環境でこれらを使用することを推奨していません。テクノロジープレビュー機能は、最新の製品機能をいち早く提供して、開発段階で機能のテストを行い、フィードバックを提供していただくことを目的としています。
Red Hat のテクノロジープレビュー機能のサポート範囲に関する詳細は、以下のリンクを参照してください。
2.14.1. Linux ユーザー名前空間のサポートの設定 リンクのコピーリンクがクリップボードにコピーされました!
前提条件
clusterという名前のFeatureGateCR を編集して、クラスターに必要なテクノロジープレビュー機能を有効にした。$ oc edit featuregate clusterFeatureGateCR の例apiVersion: config.openshift.io/v1 kind: FeatureGate metadata: name: cluster spec: featureSet: TechPreviewNoUpgrade1 - 1
- 必要な
UserNamespacesSupportおよびProcMountType機能を有効にします。
警告クラスターで
TechPreviewNoUpgrade機能セットを有効にすると、元に戻すことができず、マイナーバージョンの更新が妨げられます。この機能セットを使用すると、該当するテクノロジープレビュー機能をテストクラスターで有効にして、完全にテストすることができます。実稼働クラスターではこの機能セットを有効にしないでください。変更を保存すると、新規マシン設定が作成され、マシン設定プールが更新され、変更が適用されている間に各ノードのスケジューリングが無効になります。
crun コンテナーランタイムはワーカーノード上に存在します。現在、crun は OpenShift Container Platform にパッケージ化され、ユーザー namespace をサポートする唯一の OCI ランタイムです。crun はデフォルトでアクティブです。
apiVersion: machineconfiguration.openshift.io/v1 kind: ContainerRuntimeConfig metadata: name: enable-crun-worker spec: machineConfigPoolSelector: matchLabels: pools.operator.machineconfiguration.openshift.io/worker: ""1 containerRuntimeConfig: defaultRuntime: crun2
手順
次のコマンドを実行して、Pod がデプロイされている OpenShift Container Platform の namespace のデフォルトユーザー ID (UID) およびグループ ID (GID) の範囲を編集します。
$ oc edit ns/<namespace_name>namespace の例
apiVersion: v1 kind: Namespace metadata: annotations: openshift.io/description: "" openshift.io/display-name: "" openshift.io/requester: system:admin openshift.io/sa.scc.mcs: s0:c27,c24 openshift.io/sa.scc.supplemental-groups: 1000/100001 openshift.io/sa.scc.uid-range: 1000/100002 # ... name: userns # ...注記範囲 1000/10000 は、ID 1000 から始まる 10,000 個の値を意味するため、1000 から 10,999 までの範囲の ID を指定します。
restrictedプロファイルで動作するように設定した Pod を作成し、hostUsersパラメーターをfalseに設定することで、Linux ユーザー名前空間の使用を有効にします。以下のような YAML ファイルを作成します。
Pod 仕様の例
apiVersion: v1 kind: Pod metadata: name: userns-pod # ... spec: containers: - name: userns-container image: registry.access.redhat.com/ubi9 command: ["sleep", "1000"] securityContext: capabilities: drop: ["ALL"] allowPrivilegeEscalation: false1 runAsNonRoot: true2 seccompProfile: type: RuntimeDefault runAsUser: 10003 runAsGroup: 10004 hostUsers: false5 # ...- 1
- Pod が権限昇格を要求できないことを指定します。これは
restricted-v2Security Context Constraints (SCC) に必要です。 - 2
- UID が 0 以外のユーザーでコンテナーが実行されるように指定します。
- 3
- コンテナーの実行に使用する UID を指定します。
- 4
- コンテナーの実行に使用するプライマリー GID を指定します。
- 5
- Pod をユーザー名前空間で実行するように要求します。
trueの場合、Pod はホストのユーザー名前空間で実行されます。falseの場合、Pod は Pod 用に作成した新しいユーザー名前空間で実行されます。デフォルトはtrueです。
以下のコマンドを実行して Pod を作成します。
$ oc create -f <file_name>.yaml
検証
作成した Pod コンテナーで使用されている Pod ユーザー ID とグループ ID を確認します。Pod は Linux ユーザー名前空間内にあります。
Pod 内のコンテナーでシェルセッションを開始します。
$ oc rsh -c <container_name> pod/<pod_name>コマンドの例
$ oc rsh -c userns-container_name pod/userns-podコンテナー内で使用されているユーザー ID とグループ ID を表示します。
sh-5.1$ id出力例
uid=1000(1000) gid=1000(1000) groups=1000(1000)コンテナーのユーザー名前空間で使用されているユーザー ID を表示します。
sh-5.1$ lsns -t user出力例
NS TYPE NPROCS PID USER COMMAND 4026532447 user 3 1 1000 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 10001 - 1
- プロセスの UID は
1000です。これは Pod 仕様で設定したものと同じです。
Pod が作成されたノードで使用されている Pod ユーザー ID を確認します。ノードは Linux ユーザー名前空間の外部にあります。このユーザー ID がコンテナーで使用されている UID と異なっている必要があります。
そのノードのデバッグセッションを開始します。
$ oc debug node/ci-ln-z5vppzb-72292-8zp2b-worker-c-q8sh9コマンドの例
$ oc debug node/ci-ln-z5vppzb-72292-8zp2b-worker-c-q8sh9/hostをデバッグシェル内のルートディレクトリーとして設定します。sh-5.1# chroot /hostノードのユーザー名前空間で使用されているユーザー ID を表示します。
sh-5.1# lsns -t userコマンドの例
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 10001 - 1
- プロセスの UID は
2908816384です。これは Pod 仕様で設定したものと異なります。