Безопасность в Kubernetes постоянно эволюционирует. Одним из самых значимых изменений за последние годы стал полный отказ от Pod Security Policies (PSP) в пользу более простой и надежной системы — Pod Security Admission (PSA).
Важное изменение: Лейблы узлов (Node Labels)
При настройке размещения подов (например, через nodeSelector) важно помнить, что в новых версиях Kubernetes (1.24+) лейбл управляющего узла изменился:
- Старый вариант:
node-role.kubernetes.io/master: "" - Новый вариант:
node-role.kubernetes.io/control-plane: ""
Всегда проверяйте версию вашего кластера перед использованием этих меток в манифестах.
Эволюция безопасности: PSP → PSS → PSA
Раньше для контроля безопасности использовались сложные объекты PodSecurityPolicy. Начиная с версии 1.25, они полностью удалены. На их место пришла связка PSA и PSS.
Основные понятия:
- PSA (Pod Security Admission): Контроллер в Kubernetes, который проверяет поды при создании.
- PSS (Pod Security Standards): Три готовых набора правил (профиля) безопасности.
- Namespace Labels: Метод активации проверки через метки на пространстве имен.
Три уровня политик (PSS):
| Политика | Описание |
| Privileged | Полностью неограниченная. Разрешает всё (root, доступ к хосту). |
| Baseline | «Золотая середина». Запрещает самые явные дыры в безопасности, но не требует сложной настройки. |
| Restricted | Максимально жесткая. Соответствует лучшим практикам безопасности (Best Practices). |
Как включить и настроить PSA
В отличие от PSP, вам не нужно создавать сложные роли. Достаточно добавить метку на Namespace.
Режимы работы PSA:
- enforce: Блокирует запуск пода, если он нарушает правила.
- audit: Разрешает запуск, но пишет о нарушениях в аудит-лог.
- warn: Разрешает запуск, но выводит предупреждение пользователю в консоль.
Пример активации самого строгого режима:
kubectl label namespace my-apps pod-security.kubernetes.io/enforce=restricted
Capabilities и SecurityContext
Capabilities позволяют давать контейнеру только часть привилегий root, не давая полного доступа к системе. Например, NET_ADMIN позволяет настраивать сеть, но не дает доступа к файлам на хосте.
Согласно стандарту Restricted, хороший тон — это сбросить все привилегии (drop: ["ALL"]).
Пример безопасного пода (соответствует Restricted)
Этот под не запустится под пользователем root, не сможет повысить свои привилегии и использует стандартный профиль безопасности среды выполнения.
apiVersion: v1
kind: Pod
metadata:
name: secure-busybox
namespace: my-apps
spec:
containers:
- image: busybox:1.35.0
name: busybox
command: ["sh", "-c", "sleep 1h"]
securityContext:
allowPrivilegeEscalation: false # Запрет повышения прав
runAsNonRoot: true # Запрет запуска от root
runAsUser: 2000 # ID пользователя
runAsGroup: 3000 # ID группы
capabilities:
drop: ["ALL"] # Сброс всех системных привилегий
seccompProfile:
type: RuntimeDefault # Использование стандартного профиля защиты