Сегментация в облачных кластерах Kubernetes: изоляция команд и сервисов, сетевые политики и контроль доступа

Сегментация в облачных кластерах Kubernetes: изоляция команд и сервисов, сетевые политики и контроль доступа

Изображение: recraft

Сегментация сети – один из фундаментальных механизмов обеспечения безопасности информационных систем. В классических инфраструктурах, построенных на физических серверах или виртуальных машинах, для этих целей традиционно используются VLAN и межсетевые экраны. Однако с распространением контейнеров и систем оркестрации подходы к сетевой изоляции претерпели изменения. В среде Kubernetes невозможно напрямую применять VLAN или традиционные межсетевые экраны для управления трафиком между компонентами. Несмотря на это, потребность в сегментации сохраняется, и на смену классическим решениям пришли новые, адаптированные под динамическую инфраструктуру контейнеров. В этой статье мы рассмотрим такой инструмент и его расширенные возможности в составе платформы «Боцман».

В стандартном API Kubernetes предусмотрен встроенный ресурс для ограничения сетевого трафика — NetworkPolicy. Поскольку Kubernetes не выполняет сетевые функции самостоятельно, а лишь предоставляет соответствующий интерфейс, обработка сетевых политик делегируется компоненту, реализующему спецификацию CNI.

На сегодняшний день существует три наиболее популярных решения, обеспечивающих работу сети в Kubernetes: Flannel, Calico и Cilium. В платформе «Боцман» в мы выбрали Cilium.

В современных корпоративных ИТ-ландшафтах бизнес-сервисы всё чаще строятся на основе распределённых (микросервисных и близких к ним) архитектур. При таком подходе разработку одного сервиса может вести несколько команд, иногда достаточно больших. В результате возникает потребность в чётком разграничении их доступа в рамках общей инфраструктуры.

Для этого в «Боцмане» есть технология проектов, позволяющих объединять несколько неймспейсов. На уровне этих проектов обеспечиваются централизованное управление доступом (RBAC) и квотирование ресурсов.

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

Принятие решения о прохождении трафика основывается на достаточно понятном алгоритме:

  • Если существует любое запрещающее (deny) правило, под которое попал пакет, трафик будет отклонен.
  • Если нет запрещающих правил, система ищет разрешающие правила, и если они есть, пропускает трафик.
  • Если для выбранного трафика нет никаких правил, платформа проверяет глобальную политику (policy-enforcement). Если находит значения never или default, пропускает трафик, а в случае always блокирует.

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

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

В пространстве имен server находится просто http сервер, который мы будем использовать для проверки связанности. Так как политика выставлена в always, весь трафик блокируется:

```

echo-busybox # nc -vzw 1 echo.server 5678

nc: echo.server (172.16.245.175:5678): Operation timed out

non-echo-busybox # nc -vzw 1 echo.server 5678

nc: echo.server (172.16.245.175:5678): Operation timed out

```

Далее разрешаем общение сервисов внутри проекта, при этом создаются специальные политики. Вот пример для объекта echo:

```yaml

apiVersion: cilium.io/v2

kind: CiliumClusterwideNetworkPolicy

metadata:

  name: echo-project-allow-all

spec:

  egress:

  - toEndpoints:

    - matchLabels:

        k8s:io.cilium.k8s.namespace.labels.field.cattle.io/projectId: p-4p5pl

  endpointSelector:

    matchLabels:

      k8s:io.cilium.k8s.namespace.labels.field.cattle.io/projectId: p-4p5pl

  ingress:

  - fromEndpoints:

    - matchLabels:

        k8s:io.cilium.k8s.namespace.labels.field.cattle.io/projectId: p-4p5pl

```

Здесь задействуются механизмы Cilium, с которыми можно использовать расширенные метаданные эндпоинтов для фильтрации трафика. Внутренняя карта `k8s:io.cilium.k8s.namespace.labels` содержит все лейблы пространства имен.

Проверяем:

```

echo-busybox # nc -vzw 1 echo.server 5678

echo.server (172.16.245.175:5678) open

non-echo-busybox # nc -vzw 1 echo.server 5678

nc: echo.server (172.16.245.175:5678): Operation timed out

```

Дальнейшая фильтрация внутри проекта возможна с помощью мандатного разграничения доступа. Задаем уровень конфиденциальности так же, как и в ОС Astra Linux Special Edition, и фильтрация будет происходить на их основе.

Попробуем задать серверу 3-й уровень конфиденциальности, а клиенту – 4-й.

```

echo-busybox # nc -vzw 1 echo.server 5678

nc: echo.server (172.16.245.175:5678): Operation timed out

```

И теперь сетевая подсистема не пропускает пакеты, несмотря на разрешающее правило в политике.

Подведем итоги. Проекты «Боцмана» хорошо интегрируются с сетевыми политиками и позволяют использовать механизмы сегментации трафика совместно с проектами. Применение сетевых политик вместе с мандатным разграничением доступа еще сильнее повышает уровень безопасности внутри кластера.

Статью подготовил Масленников Федор, заместитель технического директора команды разработки платформы «Боцман» (входит в «Группу Астра»).

Группа Астра
Автор: Группа Астра
ГК «Астра» (ООО «РусБИТех-Астра») — один из лидеров российской IT-индустрии, ведущий производитель программного обеспечения, в том числе защищенных операционных систем и платформ виртуализации. Разработка флагманского продукта, ОС семейства Astra Linux, ведется с 2008 года. На сегодня в штате компании более 1000 высококвалифицированных разработчиков и специалистов технической поддержки.
Комментарии: