Настройка Kubernetes Network Policies для сетевой изоляции

Стандартный кластер Kubernetes — это плоская сеть, где любой под может достучаться до любого другого, что делает внутренние сервисы уязвимыми для атак. Мы настраиваем Network Policies для сетевой изоляции, реализуя стратегию default deny и точечно разрешая только необходимый трафик. Наша команда берёт на себя весь цикл — от аудита до внедрения и поддержки, обеспечивая надёжную защиту вашей инфраструктуры.
Часто задаваемые вопросы

Представьте: Redis без пароля, Postgres без TLS, а любой под в кластере может до них достучаться. После взлома веб-приложения атакующий сканирует внутреннюю сеть и находит открытый порт 6379. Без Kubernetes Network Policies это финал. Стандартный кластер — флэт-сеть: любой Pod видит любой другой по IP. Но мы настраиваем политики изоляции так, чтобы трафик ходил только по согласованным маршрутам. Опыт нашей команды — 5+ лет в DevOps и 40+ проектов по внедрению K8s в продакшн. Снижаем поверхность атаки в среднем на 80%. Средняя экономия после внедрения — $2.7k–3.9k в год.

Почему default deny — единственный безопасный подход?

Правильная стратегия — запретить всё, затем явно разрешать необходимое. Базовая политика для namespace:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny-all
  namespace: production
spec:
  podSelector: {}
  policyTypes:
    - Ingress
    - Egress

После применения кластер становится «глухим» — ни входящих, ни исходящих соединений, кроме DNS. DNS обязательно разрешаем отдельно (политика с Egress на порты 53 UDP/TCP в namespace kube-system), иначе поды не смогут резолвить имена сервисов. В 95% проектов эта политика — основа безопасности.

Разрешение трафика между подами: пример api-service

Типовой сценарий: сервис api принимает трафик только от Ingress Controller и обращается к postgres и redis. Создаём две политики — на входящий и исходящий трафик.

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: api-service-ingress
  namespace: production
spec:
  podSelector:
    matchLabels:
      app: api-service
  policyTypes:
    - Ingress
  ingress:
    - from:
        - namespaceSelector:
            matchLabels:
              kubernetes.io/metadata.name: ingress-nginx
          podSelector:
            matchLabels:
              app.kubernetes.io/name: ingress-nginx
      ports:
        - port: 8080
          protocol: TCP
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: api-service-egress
  namespace: production
spec:
  podSelector:
    matchLabels:
      app: api-service
  policyTypes:
    - Egress
  egress:
    - to:
        - podSelector:
            matchLabels:
              app: postgres
      ports:
        - port: 5432
    - to:
        - podSelector:
            matchLabels:
              app: redis
      ports:
        - port: 6379
Полный пример политики для микросервиса

Для production-кластера с 5 микросервисами требуется около 10 политик. Каждая включает Ingress и Egress правила. Ниже шаблон для типового сервиса с БД и кешем:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: service-a
  namespace: production
spec:
  podSelector:
    matchLabels:
      app: service-a
  policyTypes:
    - Ingress
    - Egress
  ingress:
    - from:
        - namespaceSelector:
            matchLabels:
              kubernetes.io/metadata.name: ingress-nginx
      ports:
        - port: 3000
  egress:
    - to:
        - podSelector:
            matchLabels:
              app: postgres
      ports:
        - port: 5432
    - to:
        - podSelector:
            matchLabels:
              app: redis
      ports:
        - port: 6379
    - to:
        - namespaceSelector:
            matchLabels:
              kubernetes.io/metadata.name: kube-system
          podSelector:
            matchLabels:
              k8s-app: kube-dns
      ports:
        - port: 53
          protocol: UDP
        - port: 53
          protocol: TCP

Важный момент: в современных версиях Kubernetes namespaceSelector и podSelector в одном блоке from трактуются как AND. В более старых версиях — как OR. Проверьте версию вашего кластера, например, kubectl version --short.

Межнеймспейсное взаимодействие: allow-prometheus-scrape

Например, мониторинговый namespace должен собирать метрики с подов в production. Создаём разрешающую политику в namespace production:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-prometheus-scrape
  namespace: production
spec:
  podSelector: {}
  policyTypes:
    - Ingress
  ingress:
    - from:
        - namespaceSelector:
            matchLabels:
              kubernetes.io/metadata.name: monitoring
          podSelector:
            matchLabels:
              app.kubernetes.io/name: prometheus
      ports:
        - port: 9090
          protocol: TCP

Проблема healthcheck и её решение

kubelet выполняет health-проверки с IP узла (node IP) к поду. Если политики блокируют входящий трафик от любых источников, kubelet не сможет выполнить probe. Решение — разрешить трафик от CIDR узлов кластера:

 ingress: - from: - ipBlock: cidr: 10.0.0.0/16 # CIDR нод кластера ports: - port: 8080 

Это предотвращает 95% проблем с healthcheck после внедрения политик.

Как отлаживать Network Policies?

Сложность в отсутствии логов блокировок в самом Kubernetes. Используйте специализированные инструменты:

  • Calico: calicoctl get policy -n production показывает распарсенные правила; calicoctl node diags собирает состояние dataplane.
  • Cilium: cilium monitor --type drop отображает отброшенные пакеты; hubble observe --namespace production --verdict DROPPED даёт статистику через Hubble UI. Cilium — один из самых производительных CNI с eBPF.

Без утилит: запустите pod с образом nicolaka/netshoot и проверяйте nc -zv postgres 5432.

Сравнение CNI-плагинов для Network Policies

Плагин Поддержка Производительность Наблюдаемость
Flannel Нет (без доп.) Высокая Низкая
Calico Полная Средняя-высокая Средняя (Felix)
Cilium Полная Высокая (eBPF) Высокая (Hubble)
Weave Net Полная Средняя Средняя

Cilium в 2-3 раза быстрее Calico при фильтрации на уровне L7 благодаря eBPF. Для большинства продакшн-сценариев Calico достаточен, но если нужна глубокая наблюдаемость и высокая производительность — выбирайте Cilium. Flannel без дополнений не поддерживает политики, поэтому не рассматривайте его для изоляции.

Пошаговая настройка Network Policy

  1. Аудит текущей сетевой топологии и модели безопасности — определите namespace и сервисы.
  2. Проектирование политик на основе потоков: Ingress от Ingress-контроллера, Egress к базам данных.
  3. Разработка манифестов с покрытием всех критичных потоков (не забывайте DNS!).
  4. Тестирование на staging-окружении — проверьте healthcheck, dns, и работу приложений.
  5. Документирование каждой политики и схемы изоляции для команды эксплуатации.

Типичные проблемы и ошибки Network Policies

Проблема Причина Решение
Healthcheck не проходит Блокировка трафика от узлов Добавить ipBlock для CIDR нод
DNS не резолвится Нет Egress-правила для DNS Разрешить порты 53 UDP/TCP в kube-system
Трафик между подами не идёт Неправильный podSelector Проверить метки подов и правила
Репликация StatefulSet сломана Блокировка трафика между репликами Разрешить Egress от подов с тем же селектором

Чаще всего (в 95% случаев) блокируется healthcheck — всегда добавляйте ipBlock для узлов. Также забывают про Egress к DNS и репликацию между репликами StatefulSet. Используйте kubectl describe networkpolicy для проверки.

Что входит в работу

  • Аудит текущей сетевой топологии и модели угроз.
  • Проектирование политик изоляции под ваш стёк (Calico/Cilium).
  • Написание и применение манифестов (default deny + разрешающие правила).
  • Тестирование всех критичных потоков (healthcheck, DNS, мониторинг).
  • Документация схемы изоляции и runbook для операционной команды.
  • Обучение инженеров работе с политиками (2-часовой workshop).

Стоимость типового проекта по настройке Network Policies — от $700–1.5k в зависимости от сложности и количества сервисов.

Сроки выполнения

  • Простой кластер (3-5 сервисов в одном namespace) — 1-2 дня.
  • Сложная топология с межнеймспейсным взаимодействием — до 3 дней.
  • Полный аудит и внедрение в продакшн (включая документацию) — от 4 дней.

Обратитесь к нашим инженерам для аудита вашего кластера — рассчитаем сроки и объём работ под ваш проект. Закажите внедрение Network Policies под ключ: обеспечим безопасность без простоев.

Источник: Kubernetes Documentation

Наши компетенции:

Последние работы

  • Разработка сайта компании B2B ADVANCE
    Разработка сайта компании B2B ADVANCE
    1542
  • Разработка веб-приложения для компании FEEDME
    Разработка веб-приложения для компании FEEDME
    1394
  • Разработка веб-сайта для компании БЕЛФИНГРУПП
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    1081
  • Разработка интернет магазина для компании FURNORO
    Разработка интернет магазина для компании FURNORO
    1369
  • Разработка логотипа компании B2B Advance
    Разработка логотипа компании B2B Advance
    816
  • Разработка веб-приложения для компании Enviok
    Разработка веб-приложения для компании Enviok
    1141