# Seccomp та Kubernetes

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

---

<!-- overview -->

Seccomp (secure computing mode) — це функція ядра Linux, яка існує з версії 2.6.12. Її можна використовувати для обмеження привілеїв процесу шляхом ізоляції, обмежуючи системні виклики, які він може здійснювати з простору користувача в ядро. Kubernetes дозволяє автоматично застосовувати профілі seccomp, завантажені на <a class='glossary-tooltip' title='Вузол — це робоча машина в Kubernetes.' data-bs-toggle='tooltip' data-bs-placement='top' href='/uk/docs/concepts/architecture/nodes/' target='_blank' aria-label='вузол'>вузол</a>, до ваших Podʼів і контейнерів.

## Поля Seccomp {#seccomp-fields}








  <div class="feature-state-notice feature-stable">
      <span class="feature-state-name">СТАН ФУНКЦІОНАЛУ:</span>
      <code>Kubernetes v1.19 [stable]</code>
    </div>
  



Існує чотири способи вказати профіль seccomp для <a class='glossary-tooltip' title='Pod є групою контейнерів, що запущені у вашому кластері.' data-bs-toggle='tooltip' data-bs-placement='top' href='/uk/docs/concepts/workloads/pods/' target='_blank' aria-label='Podʼа'>Podʼа</a>:

- для всього Podʼа, використовуючи [`spec.securityContext.seccompProfile`](/docs/reference/kubernetes-api/workload-resources/pod-v1/#security-context)
- для окремого контейнера, використовуючи [`spec.containers[*].securityContext.seccompProfile`](/docs/reference/kubernetes-api/workload-resources/pod-v1/#security-context-1)
- для (перезапускного / sidecar) init-контейнера, використовуючи [`spec.initContainers[*].securityContext.seccompProfile`](/docs/reference/kubernetes-api/workload-resources/pod-v1/#security-context-1)
- для [ефемерного контейнера](/docs/concepts/workloads/pods/ephemeral-containers), використовуючи [`spec.ephemeralContainers[*].securityContext.seccompProfile`](/docs/reference/kubernetes-api/workload-resources/pod-v1/#security-context-2)


















<div class="highlight code-sample">
    <div class="copy-code-icon">
    <a href="https://raw.githubusercontent.com/kubernetes/website/main/content/uk/examples/pods/security/seccomp/fields.yaml" download="pods/security/seccomp/fields.yaml"><code>pods/security/seccomp/fields.yaml</code>
    </a><img src="/images/copycode.svg" class="icon-copycode" onclick="copyCode('pods-security-seccomp-fields-yaml')" title="Копіювати pods/security/seccomp/fields.yaml до буферу обміну"></img></div>
    <div class="includecode" id="pods-security-seccomp-fields-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">pod</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">securityContext</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">seccompProfile</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l">Unconfined</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="c"># ПРИМІТКА: ephemeralContainers не може бути вказаний під час створення Podʼа.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="c"># Його можна вказати лише під час оновлення Podʼа.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">ephemeralContainers</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">ephemeral-container</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><span class="line"><span class="cl"><span class="w">    </span><span class="nt">securityContext</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">seccompProfile</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l">RuntimeDefault</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">initContainers</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">init-container</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><span class="line"><span class="cl"><span class="w">    </span><span class="nt">securityContext</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">seccompProfile</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l">RuntimeDefault</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">container</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">docker.io/library/debian:stable</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">securityContext</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">seccompProfile</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l">Localhost</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">localhostProfile</span><span class="p">:</span><span class="w"> </span><span class="l">my-profile.json</span><span class="w">
</span></span></span></code></pre></div></div>
</div>

Pod у прикладі вище працює як `Unconfined`, тоді як `ephemeral-container` та `init-container` конкретно визначають `RuntimeDefault`. Якби ефемерний або init-контейнер не встановили явно поле `securityContext.seccompProfile`, тоді значення успадковується від Pod. Це ж стосується і контейнера, який використовує локальний профіль `my-profile.json`.

Загалом, поля контейнерів (включаючи ефемерні) мають вищий пріоритет, ніж значення на рівні Pod, а контейнери, які не задають поле seccomp, успадковують профіль від Pod.


<div class="alert alert-info" role="note"><h4 class="alert-heading">Примітка:</h4>Неможливо застосувати профіль seccomp до Podʼа або контейнера, що працює з налаштуванням <code>privileged: true</code> у <code>securityContext</code> контейнера. Привілейовані контейнери завжди працюють у режимі <code>Unconfined</code>.</div>


Наступні значення можливі для поля `seccompProfile.type`:

`Unconfined`
: Навантаження працює без будь-яких обмежень seccomp.

`RuntimeDefault`
: Застосовується стандартний профіль seccomp, визначений <a class='glossary-tooltip' title='Середовище виконання контейнера — це програмне забезпечення, яке відповідає за запуск та виконання контейнерів.' data-bs-toggle='tooltip' data-bs-placement='top' href='/uk/docs/setup/production-environment/container-runtimes' target='_blank' aria-label='середовищем виконання контейнерів'>середовищем виконання контейнерів</a>. Стандартні профілі прагнуть забезпечити надійний набір параметрів безпеки, зберігаючи функціональність навантаження. Можливо, що стандартні профілі відрізняються між різними середовищами виконання контейнерів та їх версіями, наприклад, порівнюючи профілі <a class='glossary-tooltip' title='CRI-O — це легке середовище виконання контейнерів, спеціально розроблене для Kubernetes.' data-bs-toggle='tooltip' data-bs-placement='top' href='https://cri-o.io/#what-is-cri-o' target='_blank' aria-label='CRI-O'>CRI-O</a> та <a class='glossary-tooltip' title='Середовище виконання контейнера з акцентом на простоту, надійність та переносимість.' data-bs-toggle='tooltip' data-bs-placement='top' href='https://containerd.io/docs/' target='_blank' aria-label='containerd'>containerd</a>.

`Localhost`
: Застосовується `localhostProfile`, який має бути доступний на диску вузла (у Linux це `/var/lib/kubelet/seccomp`). Доступність профілю seccomp перевіряється <a class='glossary-tooltip' title='Середовище виконання контейнера — це програмне забезпечення, яке відповідає за запуск та виконання контейнерів.' data-bs-toggle='tooltip' data-bs-placement='top' href='/uk/docs/setup/production-environment/container-runtimes' target='_blank' aria-label='середовищем виконання контейнерів'>середовищем виконання контейнерів</a> під час створення контейнера. Якщо профіль не існує, то створення контейнера завершиться з помилкою `CreateContainerError`.

### Профілі `Localhost` {#localhost-profiles}

Профілі Seccomp — це JSON-файли, що відповідають схемі, визначеній [специфікацією середовища виконання OCI](https://github.com/opencontainers/runtime-spec/blob/f329913/config-linux.md#seccomp). Профіль, як правило, визначає дії на основі відповідних системних викликів, але також дозволяє передавати конкретні значення як аргументи до системних викликів. Наприклад:

```json
{
  "defaultAction": "SCMP_ACT_ERRNO",
  "defaultErrnoRet": 38,
  "syscalls": [
    {
      "names": [
        "adjtimex",
        "alarm",
        "bind",
        "waitid",
        "waitpid",
        "write",
        "writev"
      ],
      "action": "SCMP_ACT_ALLOW"
    }
  ]
}
```

`defaultAction` у профілі вище визначено як `SCMP_ACT_ERRNO` і буде повернуто як резервне для дій, визначених у syscalls. Помилка визначена як код `38` через поле 'defaultErrnoRet'.

Наступні дії зазвичай можливі:

`SCMP_ACT_ERRNO`
: Повернення вказаного коду помилки.

`SCMP_ACT_ALLOW`
: Дозвіл на виконання системного виклику.

`SCMP_ACT_KILL_PROCESS`
: Завершення процесу.

`SCMP_ACT_KILL_THREAD` і `SCMP_ACT_KILL`
: Завершення тільки потоку.

`SCMP_ACT_TRAP`
: Генерація сигналу `SIGSYS`.

`SCMP_ACT_NOTIFY` і `SECCOMP_RET_USER_NOTIF`
: Сповіщення простору користувача.

`SCMP_ACT_TRACE`
: Сповіщення процесу трасування з вказаним значенням.

`SCMP_ACT_LOG`
: Дозвіл на виконання системного виклику після того, як дія була зареєстрована в syslog або auditd.

Деякі дії, такі як `SCMP_ACT_NOTIFY` або `SECCOMP_RET_USER_NOTIF`, можуть бути не підтримувані залежно від середовища виконання контейнера, середовища виконання OCI або версії ядра Linux. Можуть бути також додаткові обмеження, наприклад, що `SCMP_ACT_NOTIFY` не може використовуватися як `defaultAction` або для певних системних викликів, таких як `write`. Усі ці обмеження визначаються або середовищем виконання OCI ([runc](https://github.com/opencontainers/runc),
[crun](https://github.com/containers/crun)) або [libseccomp](https://github.com/seccomp/libseccomp).

Масив JSON `syscalls` містить список обʼєктів, що посилаються на системні виклики за їхніми відповідними `names`. Наприклад, дія `SCMP_ACT_ALLOW` може бути використана для створення білого списку дозволених системних викликів, як показано у прикладі вище. Також можна визначити інший список, використовуючи дію `SCMP_ACT_ERRNO`, але з іншим значенням повернення (`errnoRet`).

Також можливо вказати аргументи (`args`), що передаються до певних системних викликів. Більше інформації про ці розширені випадки використання можна знайти в [специфікації середовища виконання OCI](https://github.com/opencontainers/runtime-spec/blob/f329913/config-linux.md#seccomp) та [документації ядра Linux щодо Seccomp](https://www.kernel.org/doc/Documentation/prctl/seccomp_filter.txt).

## Додаткове читання

- [Обмеження системних викликів контейнера за допомогою seccomp](/docs/tutorials/security/seccomp/)
- [Стандарти безпеки Pod](/docs/concepts/security/pod-security-standards/)
