Стандарти безпеки Podʼів

Стандарти безпеки Podʼів

Докладний огляд різних рівнів політики, визначених у стандартах безпеки Podʼів.

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

ПрофільОпис
PrivilegedНеобмежена політика, яка забезпечує найширший можливий рівень дозволів. Ця політика дозволяє відомі підвищення привілеїв.
BaselineМінімально обмежувальна політика, яка запобігає відомим підвищенням привілеїв. Дозволяє стандартну (мінімально визначену) конфігурацію Podʼа.
RestrictedДуже обмежувальна політика, що відповідає поточним рекомендаціям зі зміцнення Podʼів.

Докладно про профілі

Privileged

Політика Privileged навмисно відкрита й повністю необмежена. Цей тип політики зазвичай призначений для робочих навантажень системного та інфраструктурного рівня, якими керують привілейовані, довірені користувачі.

Політика Privileged визначається відсутністю обмежень. Якщо ви визначаєте Pod, до якого застосовується політика безпеки Privileged, цей Pod може обходити типові механізми ізоляції контейнерів. Наприклад, ви можете визначити Pod, який має доступ до мережі хоста вузла.

Baseline

Політика Baseline спрямована на легке впровадження для поширених контейнеризованих робочих навантажень із запобіганням відомим підвищенням привілеїв. Ця політика призначена для операторів застосунків і розробників некритичних застосунків. Наведені нижче засоби контролю слід застосовувати або забороняти:

Примітка:

У цій таблиці символи підстановки (*) позначають усі елементи списку. Наприклад, spec.containers[*].securityContext стосується обʼєкта контексту безпеки для усіх визначених контейнерів. Якщо будь-який із перелічених контейнерів не відповідає вимогам, весь Pod не пройде перевірку.
Специфікація політики Baseline
Засіб контролюПолітика
HostProcess

Podʼи Windows дають змогу запускати контейнери HostProcess, що надають привілейований доступ до хост-машини Windows. Привілейований доступ до хоста заборонено в політиці Baseline.

СТАН ФУНКЦІОНАЛУ: GA since Kubernetes v1.26

Обмежені поля

  • spec.securityContext.windowsOptions.hostProcess
  • spec.containers[*].securityContext.windowsOptions.hostProcess
  • spec.initContainers[*].securityContext.windowsOptions.hostProcess
  • spec.ephemeralContainers[*].securityContext.windowsOptions.hostProcess

Дозволені значення

  • Undefined/nil
  • false
Простори імен хоста

Спільне використання просторів імен хоста має бути заборонене.

Обмежені поля

  • spec.hostNetwork
  • spec.hostPID
  • spec.hostIPC

Дозволені значення

  • Undefined/nil
  • false
Привілейовані контейнери

Привілейовані Podʼи вимикають більшість механізмів безпеки й мають бути заборонені.

Обмежені поля

  • spec.containers[*].securityContext.privileged
  • spec.initContainers[*].securityContext.privileged
  • spec.ephemeralContainers[*].securityContext.privileged

Дозволені значення

  • Undefined/nil
  • false
Capabilities

Додавання capabilities, крім перелічених нижче, має бути заборонене.

Обмежені поля

  • spec.containers[*].securityContext.capabilities.add
  • spec.initContainers[*].securityContext.capabilities.add
  • spec.ephemeralContainers[*].securityContext.capabilities.add

Дозволені значення

  • Undefined/nil
  • AUDIT_WRITE
  • CHOWN
  • DAC_OVERRIDE
  • FOWNER
  • FSETID
  • KILL
  • MKNOD
  • NET_BIND_SERVICE
  • SETFCAP
  • SETGID
  • SETPCAP
  • SETUID
  • SYS_CHROOT
Томи HostPath

Томи HostPath мають бути заборонені.

Обмежені поля

  • spec.volumes[*].hostPath

Дозволені значення

  • Undefined/nil
Порти хоста

HostPorts слід повністю заборонити (рекомендовано) або обмежити відомим списком

Обмежені поля

  • spec.containers[*].ports[*].hostPort
  • spec.initContainers[*].ports[*].hostPort
  • spec.ephemeralContainers[*].ports[*].hostPort

Дозволені значення

Проби хоста / хуки життєвого циклу (v1.34+)

Поле Host у пробах і хуках життєвого циклу має бути заборонене.

Обмежені поля

  • spec.containers[*].livenessProbe.httpGet.host
  • spec.containers[*].readinessProbe.httpGet.host
  • spec.containers[*].startupProbe.httpGet.host
  • spec.containers[*].livenessProbe.tcpSocket.host
  • spec.containers[*].readinessProbe.tcpSocket.host
  • spec.containers[*].startupProbe.tcpSocket.host
  • spec.containers[*].lifecycle.postStart.tcpSocket.host
  • spec.containers[*].lifecycle.preStop.tcpSocket.host
  • spec.containers[*].lifecycle.postStart.httpGet.host
  • spec.containers[*].lifecycle.preStop.httpGet.host
  • spec.initContainers[*].livenessProbe.httpGet.host
  • spec.initContainers[*].readinessProbe.httpGet.host
  • spec.initContainers[*].startupProbe.httpGet.host
  • spec.initContainers[*].livenessProbe.tcpSocket.host
  • spec.initContainers[*].readinessProbe.tcpSocket.host
  • spec.initContainers[*].startupProbe.tcpSocket.host
  • spec.initContainers[*].lifecycle.postStart.tcpSocket.host
  • spec.initContainers[*].lifecycle.preStop.tcpSocket.host
  • spec.initContainers[*].lifecycle.postStart.httpGet.host
  • spec.initContainers[*].lifecycle.preStop.httpGet.host

Дозволені значення

  • Undefined/nil
  • ""
AppArmor

На підтримуваних хостах стандартно застосовується профіль AppArmor RuntimeDefault. Політика Baseline має запобігати перевизначенню або вимкненню стандартного профілю AppArmor чи обмежувати перевизначення дозволеним набором профілів.

Обмежені поля

  • spec.securityContext.appArmorProfile.type
  • spec.containers[*].securityContext.appArmorProfile.type
  • spec.initContainers[*].securityContext.appArmorProfile.type
  • spec.ephemeralContainers[*].securityContext.appArmorProfile.type

Дозволені значення

  • Undefined/nil
  • RuntimeDefault
  • Localhost

  • metadata.annotations["container.apparmor.security.beta.kubernetes.io/*"]

Дозволені значення

  • Undefined/nil
  • runtime/default
  • localhost/*
SELinux

Встановлення типу SELinux обмежено, а встановлення власного користувача або ролі SELinux заборонено.

Обмежені поля

  • spec.securityContext.seLinuxOptions.type
  • spec.containers[*].securityContext.seLinuxOptions.type
  • spec.initContainers[*].securityContext.seLinuxOptions.type
  • spec.ephemeralContainers[*].securityContext.seLinuxOptions.type

Дозволені значення

  • Undefined/""
  • container_t
  • container_init_t
  • container_kvm_t
  • container_engine_t (з Kubernetes 1.31)

Обмежені поля

  • spec.securityContext.seLinuxOptions.user
  • spec.containers[*].securityContext.seLinuxOptions.user
  • spec.initContainers[*].securityContext.seLinuxOptions.user
  • spec.ephemeralContainers[*].securityContext.seLinuxOptions.user
  • spec.securityContext.seLinuxOptions.role
  • spec.containers[*].securityContext.seLinuxOptions.role
  • spec.initContainers[*].securityContext.seLinuxOptions.role
  • spec.ephemeralContainers[*].securityContext.seLinuxOptions.role

Дозволені значення

  • Undefined/""
Тип монтування /proc

Стандартні маски /proc налаштовані для зменшення поверхні атаки, і їх використання має бути обовʼязковим.

Обмежені поля

  • spec.containers[*].securityContext.procMount
  • spec.initContainers[*].securityContext.procMount
  • spec.ephemeralContainers[*].securityContext.procMount

Дозволені значення

  • Undefined/nil
  • Default
Seccomp

Профіль Seccomp не можна явно встановлювати в значення Unconfined.

Обмежені поля

  • spec.securityContext.seccompProfile.type
  • spec.containers[*].securityContext.seccompProfile.type
  • spec.initContainers[*].securityContext.seccompProfile.type
  • spec.ephemeralContainers[*].securityContext.seccompProfile.type

Дозволені значення

  • Undefined/nil
  • RuntimeDefault
  • Localhost
Sysctls

Sysctls можуть вимикати механізми безпеки або впливати на всі контейнери на хості, тому їх слід заборонити, крім дозволеної «безпечної» підмножини. Sysctl вважається безпечним, якщо він обмежений простором імен контейнера або Podʼа й ізольований від інших Podʼів або процесів на тому самому вузлі.

Обмежені поля

  • spec.securityContext.sysctls[*].name

Дозволені значення

  • Undefined/nil
  • kernel.shm_rmid_forced
  • net.ipv4.ip_local_port_range
  • net.ipv4.ip_unprivileged_port_start
  • net.ipv4.tcp_syncookies
  • net.ipv4.ping_group_range
  • net.ipv4.ip_local_reserved_ports (з Kubernetes 1.27)
  • net.ipv4.tcp_keepalive_time (з Kubernetes 1.29)
  • net.ipv4.tcp_fin_timeout (з Kubernetes 1.29)
  • net.ipv4.tcp_keepalive_intvl (з Kubernetes 1.29)
  • net.ipv4.tcp_keepalive_probes (з Kubernetes 1.29)
  • net.ipv4.tcp_rmem (з Kubernetes 1.32)
  • net.ipv4.tcp_wmem (з Kubernetes 1.32)
  • net.ipv4.tcp_slow_start_after_idle (з Kubernetes 1.37)
  • net.ipv4.tcp_notsent_lowat (з Kubernetes 1.37)

Restricted

Політика Restricted спрямована на застосування поточних рекомендацій зі зміцнення Podʼів ціною певної втрати сумісності. Вона призначена для операторів і розробників критичних для безпеки застосунків, а також для користувачів із нижчим рівнем довіри. Наведені нижче засоби контролю слід застосовувати або забороняти:

Примітка:

У цій таблиці символи підстановки (*) позначають усі елементи списку. Наприклад, spec.containers[*].securityContext стосується обʼєкта контексту безпеки для усіх визначених контейнерів. Якщо будь-який із перелічених контейнерів не відповідає вимогам, весь Pod не пройде перевірку.
Специфікація політики Restricted
Засіб контролюПолітика
Усе з політики Baseline
Типи томів

Політика Restricted дозволяє лише такі типи томів.

Обмежені поля

  • spec.volumes[*]

Дозволені значення

Кожен елемент списку spec.volumes[*] повинен встановлювати одне з наведених нижче полів у значення, відмінне від null:
  • spec.volumes[*].configMap
  • spec.volumes[*].csi
  • spec.volumes[*].downwardAPI
  • spec.volumes[*].emptyDir
  • spec.volumes[*].ephemeral
  • spec.volumes[*].persistentVolumeClaim
  • spec.volumes[*].projected
  • spec.volumes[*].secret
Підвищення привілеїв (v1.8+)

Підвищення привілеїв (наприклад, через режим файлів set-user-ID або set-group-ID) не слід дозволяти. Це політика лише для Linux у v1.25+ (spec.os.name != windows)

Обмежені поля

  • spec.containers[*].securityContext.allowPrivilegeEscalation
  • spec.initContainers[*].securityContext.allowPrivilegeEscalation
  • spec.ephemeralContainers[*].securityContext.allowPrivilegeEscalation

Дозволені значення

  • false
Запуск не від імені root

Контейнери мають працювати від імені користувачів, відмінних від root.

Обмежені поля

  • spec.securityContext.runAsNonRoot
  • spec.containers[*].securityContext.runAsNonRoot
  • spec.initContainers[*].securityContext.runAsNonRoot
  • spec.ephemeralContainers[*].securityContext.runAsNonRoot

Дозволені значення

  • true
Поля контейнера можуть бути undefined/nil, якщо на рівні Podʼа spec.securityContext.runAsNonRoot встановлено в true.
Запуск від імені користувача, відмінного від root (v1.23+)

Контейнери не повинні встановлювати runAsUser у 0

Обмежені поля

  • spec.securityContext.runAsUser
  • spec.containers[*].securityContext.runAsUser
  • spec.initContainers[*].securityContext.runAsUser
  • spec.ephemeralContainers[*].securityContext.runAsUser

Дозволені значення

  • будь-яке ненульове значення
  • undefined/null
Seccomp (v1.19+)

Профіль Seccomp має бути явно встановлений в одне з дозволених значень. Заборонено як профіль Unconfined, так і відсутність профілю. Це політика лише для Linux у v1.25+ (spec.os.name != windows)

Обмежені поля

  • spec.securityContext.seccompProfile.type
  • spec.containers[*].securityContext.seccompProfile.type
  • spec.initContainers[*].securityContext.seccompProfile.type
  • spec.ephemeralContainers[*].securityContext.seccompProfile.type

Дозволені значення

  • RuntimeDefault
  • Localhost
Поля контейнера можуть бути undefined/nil, якщо на рівні Podʼа spec.securityContext.seccompProfile.type встановлено відповідне значення. Навпаки, поле на рівні Podʼа може бути undefined/nil, якщо встановлено _всі_ поля на рівні контейнера.
Capabilities (v1.22+)

Контейнери повинні скидати всі capabilities (ALL), і їм дозволено додавати назад лише capability NET_BIND_SERVICE. Це політика лише для Linux у v1.25+ (.spec.os.name != "windows")

Обмежені поля

  • spec.containers[*].securityContext.capabilities.drop
  • spec.initContainers[*].securityContext.capabilities.drop
  • spec.ephemeralContainers[*].securityContext.capabilities.drop

Дозволені значення

  • Будь-який список capabilities, що містить ALL

Обмежені поля

  • spec.containers[*].securityContext.capabilities.add
  • spec.initContainers[*].securityContext.capabilities.add
  • spec.ephemeralContainers[*].securityContext.capabilities.add

Дозволені значення

  • Undefined/nil
  • NET_BIND_SERVICE

Втілення політики

Відокремлення визначення політики від її втілення дає змогу мати спільне розуміння й узгоджену мову політик у всіх кластерах незалежно від базового механізму застосування.

Коли механізми стануть зрілішими, їх буде описано нижче окремо для кожної політики. Способи застосування окремих політик тут не визначено.

Контролер Pod Security Admission

Альтернативи

Примітка: Цей розділ містить посилання на проєкти сторонніх розробників, які надають функціонал, необхідний для Kubernetes. Автори проєкту Kubernetes не несуть відповідальності за ці проєкти. Проєкти вказано в алфавітному порядку. Щоб додати проєкт до цього списку, ознайомтеся з посібником з контенту перед надсиланням змін. Докладніше.

Інші альтернативи застосування політик розробляються в екосистемі Kubernetes, зокрема:

Поле OS Podʼа

Kubernetes дозволяє використовувати вузли, що працюють під керуванням Linux або Windows. Ви можете поєднувати обидва типи вузлів в одному кластері. Windows у Kubernetes має певні обмеження й відмінності від робочих навантажень на базі Linux. Зокрема, багато полів securityContext Podʼа не діють у Windows.

Примітка:

kubelet версій до v1.24 не застосовує поле OS Podʼа, і якщо в кластері є вузли з версіями до v1.24, політики Restricted слід закріпити на версії до v1.25.

Зміни в стандарті безпеки Podʼів Restricted

Ще одна важлива зміна, внесена в Kubernetes v1.25, полягає в тому, що політику Restricted оновлено для використання поля pod.spec.os.name. Залежно від назви ОС певні політики, специфічні для конкретної ОС, можна послабити для іншої ОС.

Засоби контролю політики, специфічні для ОС

Обмеження на наведені нижче засоби контролю потрібні лише тоді, коли .spec.os.name не дорівнює windows:

  • Підвищення привілеїв
  • Seccomp
  • Linux Capabilities

Простори імен користувачів

Простори імен користувачів — це можливість лише для Linux, що дозволяє запускати робочі навантаження з підвищеною ізоляцією. Як вони працюють разом зі стандартами безпеки Podʼів, описано в документації для Podʼів, що використовують простори імен користувачів.

ЧаП

Чому немає профілю між Privileged та Baseline?

Три визначені тут профілі мають чітку лінійну прогресію від найбезпечнішого (Restricted) до найменш безпечного (Privileged) і охоплюють широкий набір робочих навантажень. Привілеї, потрібні понад політику Baseline, зазвичай дуже специфічні для застосунку, тому ми не пропонуємо стандартного профілю в цій ніші. Це не означає, що в такому разі завжди слід використовувати профіль Privileged, але політики в цій області потрібно визначати окремо для кожного випадку.

SIG Auth може переглянути цю позицію в майбутньому, якщо зʼявиться чітка потреба в інших профілях.

У чому різниця між профілем безпеки та контекстом безпеки?

Контексти безпеки налаштовують Podʼи та контейнери під час виконання. Контексти безпеки визначаються як частина специфікацій Podʼа й контейнера в маніфесті Podʼа та є параметрами для середовища виконання контейнерів.

Профілі безпеки — це механізми панелі управління для застосування певних налаштувань у контексті безпеки, а також інших повʼязаних параметрів поза контекстом безпеки. Станом на липень 2021 року політики безпеки Podʼів визнано застарілими на користь вбудованого контролера Pod Security Admission.

А як щодо Podʼів у пісочниці?

Наразі немає стандарту API, який визначає, чи вважається Pod ізольованим у пісочниці. Podʼи в пісочниці можна визначити за використанням середовища виконання в пісочниці (такого як gVisor або Kata Containers), але стандартного визначення такого середовища немає.

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

Крім того, захист робочих навантажень у пісочниці значною мірою залежить від методу ізоляції в пісочниці. Тому немає єдиного профілю, рекомендованого для всіх робочих навантажень у пісочниці.

Елементи на цій сторінці відносяться до сторонніх продуктів чи проєктів, які надають функціонал, необхідний для Kubernetes. Автори проєкту Kubernetes не несуть відповідальності за ці проєкти. Ознайомтесь з настановами на вебсайті CNCF для отримання докладної інформації.

Ознайомтесь з посібником з контенту перед тим, як пропонувати додавання посилання на стороні компоненти.