Цикл: «Сетевая безопасность Kubernetes: от основ до практической защиты» · материал 9 из 12
Формат: практический разбор
Кратко
Нельзя строить NetworkPolicy по догадкам. Но и один network flow не объясняет инцидент: IP Pod быстро меняется, flow не показывает действие через Kubernetes API, а DNS-запрос не доказывает установление соединения. Нужна связка источников: сетевые потоки для фактической связности, Audit для действий через API, DNS для имён, runtime для процесса-инициатора и perimeter/proxy для внешнего направления.
Цель наблюдаемости не «собирать все логи». Она должна позволять ответить на конкретные вопросы: какой workload установил соединение, было ли оно разрешено политикой, кто изменил NetworkPolicy или RBAC, обращался ли Pod к новому имени и как это повлияло на бизнес-сценарий.
Пять источников — пять разных ответов
| Источник | На что отвечает | Чего не знает сам по себе |
|---|---|---|
| Network flow | кто с кем соединялся, протокол, порт, allow/deny | кто изменил Kubernetes-объект |
| Kubernetes Audit | кто и как обращался к API | проходил ли TCP-пакет между Pod |
| DNS | какое имя запрашивал workload | был ли затем успешный HTTPS/TCP-сеанс |
| Runtime telemetry | какой процесс в контейнере действовал | полную сетевую политику и API-авторизацию |
| Proxy/NGFW | куда ушёл внешний трафик | какой Pod стоит за source IP без Kubernetes metadata |
Именно поэтому строки вида 10.244.2.15 → 10.244.3.10 недостаточно. Через час IP может принадлежать другому Pod. В момент создания flow должны сохраняться namespace, имя Pod, workload, node, destination, порт, направление и verdict. Если CNI умеет связать flow с конкретной policy — сохраняйте и её имя, но не объявляйте это универсальной функцией Kubernetes.
Сначала определите вопросы, затем включайте сбор
Минимальный набор use cases для пилотного namespace:
- Показать реальные зависимости перед
default deny. - Найти поток, заблокированный после изменения policy.
- Обнаружить новый egress во внешний адрес или домен.
- Установить, кто создал, изменил или удалил NetworkPolicy, RoleBinding и Service.
- Сопоставить создание/обновление Deployment с новым Pod и его сетевым поведением.
Если для каждого случая нет ответственного, правила хранения и действия по сигналу, это не детектирование, а дорогой архив.
Kubernetes Audit: журнал API, а не сетевой лог
Kubernetes Audit создаётся в kube-apiserver: запрос может записываться на нескольких стадиях, а audit policy определяет, что именно попадёт в выбранный backend. Поэтому Audit не появляется «сам по себе в SIEM» только от факта работы Kubernetes.
Для ИБ в первую очередь нужны действия с networkpolicies, roles, rolebindings, clusterrolebindings, serviceaccounts, secrets, deployments, daemonsets, pods, services и ingresses/Gateway-объектами. Для чувствительных объектов чаще достаточно метаданных запроса; не включайте тела ответов к Secrets ради удобства расследования — это создаст новый канал раскрытия данных. Точную audit policy согласовывают с владельцем платформы и проверяют на тестовом изменении.
Проверочный сценарий прост: в учебном namespace создать или изменить одну именованную NetworkPolicy, затем найти в Audit время, пользователя/ServiceAccount, verb, URI ресурса, namespace и результат. Если записи нет, сначала исправляют policy, backend или доставку в SIEM; не утверждают, что «аудит включён».
DNS: контекст имени и отдельная зависимость
Kubernetes создаёт DNS-записи для Service и настраивает DNS Pod. После egress deny ошибка разрешения имени часто выглядит как недоступность backend. Поэтому в процессе изменения policy собирают не только flow, но и проверку nslookup из самого namespace.
Для внешнего egress DNS полезен как ранний сигнал: workload начал спрашивать неизвестный домен. Но DNS не равен соединению: запрос мог завершиться ошибкой, адрес мог быть кэширован, а приложение может обращаться к IP напрямую. Коррелируйте DNS с последующим flow и proxy/NGFW-событием по времени, workload и destination IP.
Не используйте Kubernetes Event как основной журнал. Официальная документация определяет их как best-effort информацию с ограниченным хранением; они полезны для оперативной диагностики, но не для доказательств инцидента.
Практический минимум для CNI с flow telemetry
Сначала проверьте возможности именно установленного CNI: формат, доступность verdict, metadata, экспорт и retention. Например, Hubble — средство наблюдаемости Cilium; оно не появляется в Calico, OVN или другом CNI автоматически.
В стенде из статьи 5 зафиксируйте одну разрешённую и одну запрещённую связь:
kubectl -n np-lab exec deploy/client -- \
curl -fsS --max-time 3 http://backend:8080
kubectl -n np-lab exec other -- \
curl -fsS --max-time 3 http://backend:8080 || echo "blocked as expected"
В консоли или экспортируемом потоке CNI должны различаться хотя бы source Pod, destination Pod/IP, TCP/8080, время и verdict. Если policy correlation доступна, дополнительно проверяется имя политики. Если telemetry не показывает deny, это не доказывает, что deny отсутствует, но означает, что этим источником нельзя подтверждать блокировку.
Корреляция, которая имеет смысл
Полезная цепочка расследования выглядит так:
Audit: изменён Deployment
→ Kubernetes: создан новый Pod
→ DNS: Pod запросил незнакомое имя
→ Flow: Pod открыл TLS-соединение наружу
→ Proxy/NGFW: подтверждено внешнее назначение
Это гипотеза, а не автоматическое доказательство компрометации. Проверяющий должен установить владельца Deployment, ожидаемость новой версии и назначение домена. Сильная корреляция не отменяет контекст.
Retention, доступ и стоимость
Хранение определяют для каждого источника отдельно. Audit может быть малым по объёму, но критичным для расследования изменений. Flow обычно объёмнее. DNS может содержать чувствительные сведения о сервисах и поведении пользователей. Нужно заранее определить срок хранения, защиту от изменения, экспорт, резервирование, доступ по ролям и способ поиска по namespace/workload.
Не включайте L7, packet capture и все debug-события навсегда. Сначала измерьте поток событий в пилоте, оцените CPU/память на node, пропускную способность collector и стоимость хранения. При перегрузке приоритетом остаются metadata и security use cases, а не бесконечная детализация.
Итог
Observability предшествует строгому enforcement. Сначала наблюдают реальные зависимости, затем формируют узкие policy, после чего отслеживают deny и новые исключения. Flow, Audit и DNS дают разные части картины; только их корреляция позволяет объяснить, что произошло и кто должен принять решение.
Следующая статья покажет, где нужен mTLS и service mesh, а где эти механизмы только усложняют простую L3/L4-сегментацию.
Официальные источники
- Kubernetes: Auditing
- Kubernetes: Controlling Access to the API
- Kubernetes: DNS for Services and Pods
- Kubernetes API: Event
- Cilium: Hubble
- Cilium: Inspecting network flows
Навигация по циклу:
← Ingress и egress в Kubernetes: почему закрыть вход недостаточно · Начало цикла · mTLS и service mesh: где заканчивается NetworkPolicy →