Поиск по сайту:

Защита трафика кластера Kubernetes с помощью сетевых политик Pod


Поды Kubernetes по умолчанию могут свободно взаимодействовать друг с другом. Это создает угрозу безопасности, когда ваш кластер используется для нескольких приложений или групп. Ошибочное поведение или злонамеренный доступ в одном модуле могут направить трафик на другие модули в вашем кластере.

Эта статья научит вас, как избежать этого сценария, настроив сетевые политики. Эти правила позволяют управлять потоками трафика между модулями на уровне IP-адресов (уровень 3 или 4 OSI). Вы можете точно определить источники входа и выхода, разрешенные для каждого пода.

Создание сетевой политики

Сетевые политики создаются путем добавления объектов NetworkPolicy в ваш кластер. Каждая политика определяет модули, к которым она применяется, а также одно или несколько правил входа и выхода. Вот базовый манифест политики:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: network-policy
  namespace: app
spec:
  podSelector:
    matchLabels:
      component: database
  policyTypes:
    - Ingress
    - Egress
  ingress:
    - from:
      - podSelector:
          matchLabels:
            component: api
  egress:
    - to:
        - podSelector:
            matchLabels:
              component: api

Эта сетевая политика применяется к любому поду с меткой component: database в пространстве имен app. В нем указано, что входящий (входящий) и исходящий (исходящий) трафик разрешен только от и к модулям с меткой component: api. Любые запросы, исходящие от других модулей, таких как component: web-frontend, будут заблокированы.

Сетевые политики можно применять, как и любой другой объект, с помощью Kubectl. Они вступят в силу сразу после создания. Вы можете добавить сетевую политику перед запуском выбранных модулей.

$ kubectl apply -f policy.yaml
networkingpolicy.networking.k8s.io/network-policy created

Как работают сетевые политики

Сетевые политики реализуются активным сетевым плагином вашего кластера. Ваши политики не будут иметь никакого эффекта, если ваш плагин не поддерживает эту функцию. Большинство популярных опций, таких как Calico и Cilium, поставляются с включенной поддержкой сетевых политик.

Когда сетевая политика применяется к поду, плагин проверяет его трафик, чтобы убедиться, что он соответствует требованиям политики. Любые соединения, не соответствующие критериям, будут запрещены. Под, который пытался инициировать соединение, обнаружит, что удаленный хост недоступен, либо потому, что он пытался получить доступ к ресурсу, заблокированному правилом выхода, либо потому, что удаленный модуль отклонил входящее соединение с помощью правила входа.

Успешное соединение между двумя модулями может быть установлено только в том случае, если это разрешено сетевыми политиками обоих. Соединение может быть запрещено правилом выхода инициирующего пода или правилом входа в целевом устройстве.

Сетевые политики всегда имеют дополнительный характер. Когда несколько политик выбирают один и тот же модуль, список разрешенных источников входящего и исходящего трафика будет представлять собой комбинацию всех политик.

Пример сетевых политик

Сетевые политики поддерживают множество различных параметров для настройки целевых модулей и разрешенных типов подключения. Следующие примеры демонстрируют несколько распространенных вариантов использования.

Примените политику к каждому поду в пространстве имен, разрешив входящий трафик только с определенного блока IP-адресов.

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: network-policy
  namespace: app
spec:
  podSelector: {}
  policyTypes:
    - Ingress
  ingress:
    - from:
        - ipBlock:
            cidr: 172.17.0.0/16

Пустой блок podSelector означает, что политика нацелена на все поды пространства имен. Правило ipBlock ограничивает входящий трафик модулями с IP-адресами в указанном диапазоне. Исходящий трафик не блокируется.

Разрешить входящий трафик с блока IP-адресов, но исключить некоторые определенные IP-адреса.

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: network-policy
  namespace: app
spec:
  podSelector: {}
  policyTypes:
    - Ingress
  ingress:
    - from:
        - ipBlock:
            cidr: 172.17.0.0/16
            except:
              - 172.17.0.1/24
              - 172.17.0.2/24
              - 172.17.0.3/24

Правила ipBlock поддерживают поле except для исключения трафика, исходящего от определенных IP-адресов или направленного на них.

Разрешить входящий трафик со всех модулей в пространстве имен, но только с определенного порта.

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: network-policy
  namespace: app
spec:
  podSelector: {}
  policyTypes:
    - Ingress
  ingress:
    - from:
        - podSelector: {}
          ports:
            - protocol: TCP
              port: 443

Поле ports доступно в правилах входа и выхода. Он определяет порты, с которых может приниматься и отправляться трафик. При желании вы можете указать диапазон портов, например 3000–3500, установив поле endPort (3500) в дополнение к port (3000).

Разрешить трафик от модулей с определенной меткой, которые существуют в другом пространстве имен.

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: network-policy
  namespace: database
spec:
  podSelector: {}
  policyTypes:
    - Ingress
  ingress:
    - from:
        - namespaceSelector:
            matchLabels:
              application: demo-app
          podSelector:
            matchLabels:
              component: database

Политика гласит, что любой модуль с пометкой component: database может получить доступ ко всем модулям в пространстве имен database, если его собственное пространство имен помечено как demo-app. .

Вы можете разрешить трафик от всех модулей во внешнем пространстве имен, создав правило, которое включает только поле namespaceSelector.

Явно разрешить весь трафик

Иногда вам может понадобиться явно разрешить весь трафик определенного типа в пространстве имен. Включите тип в свою политику, но укажите пустой селектор Pod и никаких правил:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: network-policy
  namespace: app
spec:
  podSelector: {}
  policyTypes:
    - Ingress
    - Egress
  ingress:
    - {}
  egress:
    - {}

Все поды в пространстве имен могут свободно взаимодействовать, как если бы не было никакой политики. В любом случае создание политики позволяет указать ваши намерения другим пользователям кластера. Они могут усомниться в наличии пространства имен с неограниченной сетью в кластере, который в противном случае был бы защищен.

Когда использовать сетевые политики

Сетевые политики должны быть созданы для каждого из пространств имен и подов в вашем кластере. Это лучше изолирует ваши модули и позволяет вам контролировать поток трафика.

Постарайтесь сделать свои политики как можно более детализированными. Слишком сильное расширение доступа, например, разрешение доступа между всеми подами в пространстве имен, подвергает вас риску, если один из ваших контейнеров будет скомпрометирован. Рассмотрите возможность использования точных селекторов для идентификации отдельных удаленных входов и выходов для конфиденциальных модулей, таких как службы проверки подлинности, базы данных и обработчики платежей.

Kubernetes по умолчанию не включает какие-либо сетевые политики, что может привести к надзору, даже если вы хотите, чтобы все поды были защищены политикой. Вы можете уменьшить этот риск, добавив политику охвата всех пространств имен. Эта политика выбирает каждый Pod в пространстве имен и применяет правило, запрещающее все сетевые коммуникации:

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

Сетевые политики всегда привязаны к пространствам имен, поэтому для каждого из них необходимо создать отдельный комплекс.

Краткое содержание

Kubernetes позволяет всем модулям в вашем кластере взаимодействовать друг с другом. Это слишком допустимо для реальных приложений, работающих в многоцелевых кластерах. Сетевые политики решают эту проблему, предоставляя систему, подобную брандмауэру, для управления источниками входа и целями выхода, которые принимает каждый модуль.

Рекомендуется настроить сетевую политику на всех ваших модулях. Это защитит ваш кластер, поэтому будут разрешены только законные потоки трафика. Однако сетевые политики — это только часть безопасности Kubernetes: другие механизмы защиты, такие как контексты безопасности RBAC и Pod, также являются важными инструментами для повышения безопасности вашей среды.




Все права защищены. © Linux-Console.net • 2019-2024