В Kubernetes v1.36 поддержка User Namespaces для подов получила статус General Availability. Это только Linux-функция, но она закрывает давнюю проблему безопасности контейнерных workload'ов.
Что за проблема
Когда контейнер работает от root-пользователя, при побеге из sandbox он получает root-привилегии на хост-ноде. Это значит, что один скомпрометированный под потенциально открывает доступ ко всему узлу. Десятки уязвимостей класса HIGH и CRITICAL можно было эксплуатировать именно через это.
Что делает User Namespaces
User Namespaces изолируют пользователя внутри контейнера от пользователя на хосте. Процесс, который видит себя как
root (UID 0) внутри контейнера, на хосте отображается в непривилегированного пользователя. Так, даже при побеге из контейнера, атакующий не получит прав на ноде.Второй важный момент: с
hostUsers: false возможности вроде CAP_NET_ADMIN становятся namespaced. Это значит, что они дают административные права только над ресурсами внутри контейнера, не затрагивая хост. Раньше такой сценарий требовал запуска полностью привилегированного контейнера.Как включить
Одно поле в манифесте пода:
apiVersion: v1
kind: Pod
metadata:
name: my-app
spec:
hostUsers: false
containers:
- name: app
image: my-app:latest
Этого достаточно, чтобы под получил собственное изолированное пространство UID/GID.
Что важно учитывать
Требования к среде: Linux-нода с поддержкой user namespaces в ядре, а также совместимый container runtime (
containerd >= 1.7, CRI-O >= 1.25).Диапазон UID/GID для каждого пода должен быть кратен 65536 и начинаться с числа >= 65536. Начиная с v1.33 это можно настроить через
KubeletConfiguration:apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
userNamespaces:
idsPerPod: 65536
До v1.33 значение было жёстко задано и равно 65536.
Изменения в Pod Security Standards
Для подов с
hostUsers: false Kubernetes ослабляет ряд ограничений PSS. Поля, которые обычно блокируются в Baseline и Restricted, становятся допустимыми, потому что root внутри такого пода никогда не отображается в реальный root на хосте.Работа над этой функцией началась около 10 лет назад. В alpha она вошла в v1.25, в v1.33 была включена по умолчанию, а в v1.36 получила статус стабильной.
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека devops'a
#арсенал_инженера
