Podでユーザー名前空間を使用する

Podでユーザー名前空間を使用する

FEATURE STATE: GA since Kubernetes v1.36
More information about this feature

This is a stable feature in Kubernetes, and has been since version v1.36. It was first available in the v1.28 release. You can no longer disable or opt out of this feature or behavior (it is locked); if you explicitly set a value for the associated feature gate UserNamespacesSupport, Kubernetes ignores it but does not report any error.

このページでは、Podにユーザー名前空間を設定する方法について説明します。 これにより、コンテナ内で実行されるユーザーをホスト上のユーザーから分離できます。

コンテナ内でrootとして実行されているプロセスは、ホスト上では別の(root以外の)ユーザーとして実行できます。 つまり、そのプロセスはユーザー名前空間内の操作に対しては完全な権限を持ちますが、名前空間外の操作に対しては権限を持ちません。

この機能を使うことで、コンテナが侵害された場合にホストや同じノード上の他のPodへの被害を軽減できます。 ユーザー名前空間が有効であれば悪用できなかったとされる、HIGHまたはCRITICALと評価されたセキュリティ脆弱性がいくつかあります。 ユーザー名前空間は将来の脆弱性の一部も軽減することが期待されています。

ユーザー名前空間を使用しない場合、rootとして実行されているコンテナが侵害されてホストに到達すると、ノード上でroot権限を持つことになります。 また、コンテナに何らかのケーパビリティが付与されていた場合、そのケーパビリティはホスト上でも有効です。 ユーザー名前空間を使用する場合、これらはいずれも当てはまりません。

始める前に

Kubernetesクラスターが必要、かつそのクラスターと通信するためにkubectlコマンドラインツールが設定されている必要があります。 このチュートリアルは、コントロールプレーンのホストとして動作していない少なくとも2つのノードを持つクラスターで実行することをおすすめします。 まだクラスターがない場合、minikubeを使って作成するか、 以下のいずれかのKubernetesプレイグラウンドも使用できます:

作業するKubernetesサーバーは次のバージョン以降のものである必要があります: v1.25.

バージョンを確認するには次のコマンドを実行してください: kubectl version.

🛇 この項目は、Kubernetes自体の一部ではないサードパーティのプロジェクトまたは製品にリンクしています。詳細情報
  • ノードのOSがLinuxであること
  • ホスト上でコマンドを実行できること
  • Podにexecで入れること
  • UserNamespacesSupportフィーチャーゲートを有効にすること

備考:

ユーザー名前空間を有効にするフィーチャーゲートは、ステートレスなPodのみがサポートされていた頃はUserNamespacesStatelessPodsSupportという名前でした。 Kubernetes v1.25からv1.27のみがUserNamespacesStatelessPodsSupportを認識します。

使用するクラスターには、Podでユーザー名前空間を使用するための要件を満たすノードが少なくとも1つ含まれている必要があります

ノードが混在しており、一部のノードのみがPodのユーザー名前空間をサポートしている場合は、ユーザー名前空間を使用するPodが適切なノードにスケジュールされるようにする必要もあります。

ユーザー名前空間を使用するPodを実行する

Podのユーザー名前空間は、.spechostUsersフィールドをfalseに設定することで有効になります。 例:

apiVersion: v1
kind: Pod
metadata:
  name: userns
spec:
  hostUsers: false
  containers:
  - name: shell
    command: ["sleep", "infinity"]
    image: debian
  1. クラスター上にPodを作成します:

    kubectl apply -f https://k8s.io/examples/pods/user-namespaces-stateless.yaml
    
  2. Pod内でexecし、readlink /proc/self/ns/userを実行します:

    kubectl exec -ti userns -- bash
    

次のコマンドを実行します:

readlink /proc/self/ns/user

出力は次のようになります:

user:[4026531837]

さらに次を実行します:

cat /proc/self/uid_map

出力は次のようになります:

0  833617920      65536

次に、ホスト上でシェルを開き、同じコマンドを実行します。

readlinkコマンドは、プロセスが実行されているユーザー名前空間を表示します。 ホスト上とコンテナ内で実行した場合、異なる値になるはずです。

コンテナ内のuid_mapファイルの最後の数値は65536である必要があります。 ホスト上ではそれより大きい数値になります。

kubeletをユーザー名前空間内で実行している場合は、Pod内でコマンドを実行した出力を、ホスト上で次のコマンドを実行した出力と比較する必要があります:

readlink /proc/$pid/ns/user

$pidはkubeletのPIDに置き換えてください。

このページの項目は、Kubernetesが必要とする機能を提供するサードパーティ製品またはプロジェクトです。Kubernetesプロジェクトの作者は、それらのサードパーティ製品またはプロジェクトに責任を負いません。詳しくは、CNCFウェブサイトのガイドラインをご覧ください。コンテンツガイドを読んでから、サードパーティリンクを追加する変更を提案してください。