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

LLMS index: [llms.txt](/llms.txt)

---

<!-- overview -->







  <div class="feature-state-notice feature-stable" title="フィーチャーゲート: UserNamespacesSupport">
              <span class="feature-state-name">FEATURE STATE:</span> 
              <code>Kubernetes v1.36 [stable]</code>(デフォルトで有効)</div>


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

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

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

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

[KEP-vulns]: https://github.com/kubernetes/enhancements/tree/217d790720c5aef09b8bd4d6ca96284a0affe6c2/keps/sig-node/127-user-namespaces#motivation

## 始める前に

<p>Kubernetesクラスターが必要、かつそのクラスターと通信するためにkubectlコマンドラインツールが設定されている必要があります。
このチュートリアルは、コントロールプレーンのホストとして動作していない少なくとも2つのノードを持つクラスターで実行することをおすすめします。
まだクラスターがない場合、<a href="https://minikube.sigs.k8s.io/docs/tutorials/multi_node/">minikube</a>を使って作成するか、
以下のいずれかのKubernetesプレイグラウンドも使用できます:</p>
<ul>
<li><a href="https://labs.iximiuz.com/playgrounds?category=kubernetes&filter=all">iximiuz Labs</a></li>
<li><a href="https://killercoda.com/playgrounds/scenario/kubernetes">Killercoda</a></li>
<li><a href="https://kodekloud.com/public-playgrounds">KodeKloud</a></li>
</ul>
 
 
 作業するKubernetesサーバーは次のバージョン以降のものである必要があります: v1.25.
  <p>バージョンを確認するには次のコマンドを実行してください:  <code>kubectl version</code>.</p>


<div class="alert alert-secondary callout third-party-content" role="note">&#128711; この項目は、Kubernetes自体の一部ではないサードパーティのプロジェクトまたは製品にリンクしています。<a class="alert-more-info" href="#third-party-content-disclaimer">詳細情報</a></div>

<!-- if adding another runtime in the future, omit the single setting -->

* ノードのOSがLinuxであること
* ホスト上でコマンドを実行できること
* Podにexecで入れること
* `UserNamespacesSupport`[フィーチャーゲート](/docs/reference/command-line-tools-reference/feature-gates/)を有効にすること


<div class="alert alert-info" role="note"><h4 class="alert-heading">備考:</h4>ユーザー名前空間を有効にするフィーチャーゲートは、ステートレスなPodのみがサポートされていた頃は<code>UserNamespacesStatelessPodsSupport</code>という名前でした。
Kubernetes v1.25からv1.27のみが<code>UserNamespacesStatelessPodsSupport</code>を認識します。</div>


使用するクラスターには、Podでユーザー名前空間を使用するための[要件](/docs/concepts/workloads/pods/user-namespaces/#before-you-begin)を満たすノードが少なくとも1つ含まれている**必要があります**。

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

<!-- steps -->

## ユーザー名前空間を使用するPodを実行する {#create-pod}

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























<div class="highlight code-sample">
    <div class="copy-code-icon">
    <a href="https://raw.githubusercontent.com/kubernetes/website/main/content/en/examples/pods/user-namespaces-stateless.yaml" download="pods/user-namespaces-stateless.yaml"><code>pods/user-namespaces-stateless.yaml</code>
    </a><img src="/images/copycode.svg" class="icon-copycode" onclick="copyCode('pods-user-namespaces-stateless-yaml')" title="pods/user-namespaces-stateless.yamlをクリップボードにコピー"></img></div>
    <div class="includecode" id="pods-user-namespaces-stateless-yaml"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l">v1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">Pod</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">metadata</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">userns</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">spec</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">hostUsers</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">containers</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">shell</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">command</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;sleep&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;infinity&#34;</span><span class="p">]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">debian</span><span class="w">
</span></span></span></code></pre></div></div>
</div>

1. クラスター上にPodを作成します:

   ```shell
   kubectl apply -f https://k8s.io/examples/pods/user-namespaces-stateless.yaml
   ```

1. Pod内でexecし、`readlink /proc/self/ns/user`を実行します:

   ```shell
   kubectl exec -ti userns -- bash
   ```

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

```shell
readlink /proc/self/ns/user
```

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

```shell
user:[4026531837]
```

さらに次を実行します:

```shell
cat /proc/self/uid_map
```

出力は次のようになります:
```shell
0  833617920      65536
```

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

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

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

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

```shell
readlink /proc/$pid/ns/user
```

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