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.
UserNamespacesSupportフィーチャーゲートを有効にすることUserNamespacesStatelessPodsSupportという名前でした。
Kubernetes v1.25からv1.27のみがUserNamespacesStatelessPodsSupportを認識します。使用するクラスターには、Podでユーザー名前空間を使用するための要件を満たすノードが少なくとも1つ含まれている必要があります。
ノードが混在しており、一部のノードのみがPodのユーザー名前空間をサポートしている場合は、ユーザー名前空間を使用するPodが適切なノードにスケジュールされるようにする必要もあります。
Podのユーザー名前空間は、.specのhostUsersフィールドをfalseに設定することで有効になります。
例:
apiVersion: v1
kind: Pod
metadata:
name: userns
spec:
hostUsers: false
containers:
- name: shell
command: ["sleep", "infinity"]
image: debian
クラスター上にPodを作成します:
kubectl apply -f https://k8s.io/examples/pods/user-namespaces-stateless.yaml
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ウェブサイトのガイドラインをご覧ください。コンテンツガイドを読んでから、サードパーティリンクを追加する変更を提案してください。