# Використання простору імен користувача з Podʼом

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

---

<!-- overview -->








  <div class="feature-state-notice feature-stable" title="Функціональна можливість: UserNamespacesSupport">
              <span class="feature-state-name">СТАН ФУНКЦІОНАЛУ:</span> 
              <code>Kubernetes v1.36 [stable]</code>(стандартно увімкнено)</div>


Ця сторінка показує, як налаштувати простір імен користувача для Podʼів. Це дозволяє ізолювати користувача, що працює всередині контейнера, від того, який працює на хості.

Процес, що працює як root у контейнері, може працювати як інший (не root) користувач на хості; іншими словами, процес має повні привілеї для операцій всередині простору імен користувача, але не має привілеїв для операцій за межами простору імен.

Ви можете використовувати цю функцію, щоб зменшити шкоду, яку скомпрометований контейнер може завдати хосту або іншим Podʼам на тому ж вузлі. Є [кілька уразливостей безпеки][KEP-vulns], оцінених як **ВИСОКІ** або **КРИТИЧНІ**, які не були використовні при активному використанні просторів імен користувача. Очікується, що простори імен користувача захистять від деяких майбутніх уразливостей також.

Без використання просторів імен користувача контейнер, що працює як root, у випадку втечі з контейнера має привілеї root на вузлі. І якщо деякі можливості були надані контейнеру, то ці можливості також дійсні на хості. Цього не відбувається, коли використовуються простори імен користувача.

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

## Перш ніж ви розпочнете

<p>Вам треба мати кластер Kubernetes, а також інструмент командного рядка kubectl має бути налаштований для роботи з вашим кластером. Рекомендується виконувати ці настанови у кластері, що має щонайменше два вузли, які не виконують роль вузлів управління. Якщо у вас немає кластера, ви можете створити його, за допомогою <a href="https://minikube.sigs.k8s.io/docs/tutorials/multi_node/">minikube</a> або використовувати одну з цих пісочниць:</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>


<!-- якщо в майбутньому додається ще один рантайм, то опустити параметр single -->

* ОС вузла повинна бути Linux
* Ви повинні мати можливість виконувати команди на хості
* Ви повинні мати можливість виконувати команди у подах

Кластер, який ви використовуєте, **обовʼязково** повинен містити принаймні один вузол, який відповідає [вимогам](/docs/concepts/workloads/pods/user-namespaces/#before-you-begin) щодо використання просторів імен користувача з Podʼами.

Якщо у вас є суміш вузлів і лише деякі з них надають підтримку просторів імен користувача для
Podʼів, вам також потрібно забезпечити те, що Podʼи з просторами імен користувача будуть
[заплановані](/docs/concepts/scheduling-eviction/assign-pod-node/) на відповідні вузли.

<!-- steps -->

## Запуск Podʼа, що використовує простір імен користувача {#create-pod}

Простір імен користувача для Podʼа вмикається, встановленням поля `hostUsers` в `.spec`
на `false`. Наприклад:


















<div class="highlight code-sample">
    <div class="copy-code-icon">
    <a href="https://raw.githubusercontent.com/kubernetes/website/main/content/uk/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ʼа і виконайте `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` на PID kubelet.
