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

FEATURE STATE: Kubernetes v1.33 [beta](enabled by default)

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

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

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

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

始める前に

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

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

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

🛇 This item links to a third party project or product that is not part of Kubernetes itself. More information
  • ノードの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ウェブサイトのガイドラインをご覧ください。第三者のリンクを追加するような変更を提案する前に、コンテンツガイドを読むべきです。