Можно идеально ограничить сетевые соединения pod, но оставить приложению право менять Kubernetes API.
Тогда сетевой контроль будет неполным.
Поэтому Kubernetes нужно защищать минимум в двух плоскостях:
сеть
+
API управления
Что такое ServiceAccount
ServiceAccount — идентичность для workload.
Это не пользователь приложения и не системный администратор.
Он нужен, чтобы pod мог аутентифицироваться в Kubernetes API.
Default ServiceAccount
В каждом namespace существует default ServiceAccount.
Если pod не указал другой, он может использовать его.
Это удобно, но не означает, что всем приложениям действительно нужен API token.
ServiceAccount token
Современный Kubernetes использует краткоживущие bound tokens.
Но даже короткоживущий credential остаётся credential.
Если приложение Kubernetes API не использует, разумно отключить автоматическое монтирование:
automountServiceAccountToken: false
RBAC
RBAC расшифровывается Role-Based Access Control.
ServiceAccount определяет кто.
RBAC определяет что ему разрешено.
Основные объекты:
- Role;
- ClusterRole;
- RoleBinding;
- ClusterRoleBinding.
Пример минимального права
Приложению нужно читать только ConfigMap в своём namespace.
Ему не требуется:
- читать Secrets всего кластера;
- создавать pods;
- менять NetworkPolicy;
- создавать RoleBinding;
- удалять namespaces.
Именно это и есть least privilege.
Почему широкий RBAC опасен
Представим:
уязвимость frontend
↓
ServiceAccount token
↓
широкий RBAC
↓
Kubernetes API
Если ServiceAccount может создавать pods, нарушитель потенциально может запустить собственный workload.
Если может читать Secrets — получить credentials.
Если может менять NetworkPolicy — изменить сетевую модель.
Если может создавать ClusterRoleBinding — последствия ещё серьёзнее.
NetworkPolicy не заменяет RBAC
NetworkPolicy отвечает:
может ли workload установить сетевое соединение?
RBAC отвечает:
может ли identity выполнить действие через Kubernetes API?
Это разные уровни.
Ограничение доступа к API
Кроме RBAC полезно контролировать:
- каким workload API вообще доступен;
- используется ли API через штатный endpoint;
- есть ли telemetry обращений;
- какие ServiceAccount обращаются к API;
- соответствует ли это назначению приложения.
Необычный доступ обычного web-приложения к Kubernetes API — полезный detection signal.
Кто может менять NetworkPolicy
Это важный аудиторский вопрос.
Допустим, ИБ создала строгие NetworkPolicy.
Если обычный DevOps pipeline может бесконтрольно удалить их, архитектура неустойчива.
Необходимо определить:
- кто владелец policy;
- кто утверждает изменения;
- где хранится policy;
- есть ли GitOps;
- кто имеет права
create/update/delete.
Кто может менять labels
NetworkPolicy часто опирается на labels.
Например:
role=backend
Если приложение или пользователь может произвольно присвоить себе security-sensitive label, он может попасть под другое правило.
Поэтому labels, используемые в политике, тоже являются частью security boundary.
RoleBinding vs ClusterRoleBinding
По возможности права следует ограничивать namespace.
Cluster-wide permissions нужны не всем.
Особенно внимательно стоит относиться к:
cluster-admin;- wildcard actions;
- wildcard resources;
- доступу к Secrets;
- правам impersonate;
- bind/escalate;
- созданию privileged workloads.
Что проверять
Для критичных namespace:
- какие ServiceAccount существуют;
- какой используется каждым Deployment;
- где включён automount token;
- какие RoleBinding и ClusterRoleBinding привязаны;
- есть ли wildcard permissions;
- кто читает Secrets;
- кто меняет NetworkPolicy;
- кто может создавать privileged pod.
Практическая модель
workload
|
ServiceAccount
|
RBAC
|
Kubernetes API
И отдельно:
workload
|
NetworkPolicy
|
network
Компрометация одного уровня не должна автоматически давать полный контроль над другим.
Главное
В Kubernetes identity становится такой же важной частью безопасности, как IP и firewall.
Поэтому зрелая микросегментация — это не только frontend → backend, но и минимальные API-полномочия конкретного ServiceAccount.
Следующая статья посвящена ingress и особенно egress — исходящим соединениям, которые часто остаются полностью открытыми.