Создание L7-балансировщика с профилем безопасности Smart Web Security через Ingress-контроллер Application Load Balancer
Приложения в кластере Yandex Managed Service for Kubernetes можно защитить от DDoS-атак и ботов с помощью сервиса Yandex Smart Web Security. Для этого опубликуйте приложения через ресурс Ingress, которому назначен профиль безопасности Smart Web Security и который использует Ingress-контроллер Application Load Balancer.
Опираясь на ресурс Ingress будет развернут L7-балансировщик с профилем безопасности, подключенным к виртуальным хостам балансировщика. Бэкенды приложений, которые указаны в ресурсе Ingress, будут защищены с помощью Smart Web Security: все поступающие к бэкендам HTTP-запросы будут обработаны в соответствии с правилами в профиле безопасности.
Чтобы через Ingress создать L7-балансировщик с подключенным профилем безопасности:
- Установите Ingress-контроллер Application Load Balancer.
- Создайте тестовое приложение.
- Создайте профиль безопасности.
- Создайте ресурс Ingress.
- Создайте DNS-запись для домена.
- Проверьте результат.
Если созданные ресурсы вам больше не нужны, удалите их.
Необходимые платные ресурсы
В стоимость поддержки описываемого решения входят:
- Плата за DNS-зону и DNS-запросы (см. тарифы Cloud DNS).
- Плата за кластер Managed Service for Kubernetes: использование мастера и исходящий трафик (см. тарифы Managed Service for Kubernetes).
- Плата за узлы кластера (ВМ): использование вычислительных ресурсов, операционной системы и хранилища (см. тарифы Compute Cloud).
- Плата за использование вычислительных ресурсов L7-балансировщика (см. тарифы Application Load Balancer).
- Плата за публичные IP-адреса для узлов кластера и L7-балансировщика (см. тарифы Virtual Private Cloud).
- Плата за количество запросов в сервис Smart Web Security (см. тарифы Virtual Private Cloud).
Перед началом работы
-
Подготовьте необходимую инфраструктуру:
ВручнуюTerraform-
Создайте сервисный аккаунт, который будет использоваться Ingress-контроллером Application Load Balancer.
Назначьте аккаунту следующие роли на каталог, в котором будет создан кластер:
-
Важно
Эта роль необходима для корректной интеграции L7-балансировщика Application Load Balancer с профилем безопасности.
-
Создайте сервисный аккаунт, который будет использоваться кластером и группой узлов.
Назначьте аккаунту следующие роли на каталог, в котором будет создан кластер:
-
Создайте группы безопасности для кластера Managed Service for Kubernetes и входящих в него групп узлов.
Также настройте группы безопасности, необходимые для работы Application Load Balancer.
Важно
От настройки групп безопасности зависит работоспособность и доступность кластера, а также запущенных в нем сервисов и приложений.
-
Создайте кластер. При создании кластера выберите:
- Cозданный ранее сервисный аккаунт. Используйте его для ресурсов и для узлов.
- Созданные ранее группы безопасности, которые должны быть назначены кластеру.
- Опцию, которая назначает кластеру публичный адрес. Такой адрес нужен, чтобы можно было использовать Kubernetes API из интернета.
-
Создайте группу узлов в кластере. При создании группы узлов выберите:
- Созданные ранее группы безопасности, которые должны быть назначены группе узлов.
- Опцию, которая назначает узлам публичный адрес. Такой адрес нужен, чтобы можно было скачивать образы из интернета.
-
Если у вас еще нет Terraform, установите его.
-
Получите данные для аутентификации. Вы можете добавить их в переменные окружения или указать далее в файле с настройками провайдера.
-
Настройте и инициализируйте провайдер. Чтобы не создавать конфигурационный файл с настройками провайдера вручную, скачайте его
. -
Поместите конфигурационный файл в отдельную рабочую директорию и укажите значения параметров. Если данные для аутентификации не были добавлены в переменные окружения, укажите их в конфигурационном файле.
-
Скачайте в ту же рабочую директорию файл конфигурации кластера alb-ready-k8s-cluster.tf
. В файле описаны:-
Сеть.
-
Кластер Kubernetes.
-
Сервисный аккаунт, необходимый для работы кластера и группы узлов Managed Service for Kubernetes.
-
Сервисный аккаунт, необходимый для работы Ingress-контроллера Application Load Balancer.
-
Группы безопасности, которые содержат необходимые правила для кластера Managed Service for Kubernetes и входящих в него групп узлов.
Часть правил необходима для работы Application Load Balancer.
Важно
От настройки групп безопасности зависит работоспособность и доступность кластера, а также запущенных в нем сервисов и приложений.
-
Профиль безопасности Smart Web Security с правилом Smart Protection и простым правилом для проверки работы профиля, которое будет разрешать трафик только с определенного IP-адреса.
Базовое правило по умолчанию не указывается в манифесте и создается автоматически.
-
-
Укажите в файле конфигурации:
- Идентификатор каталога.
- Версию Kubernetes для кластера и групп узлов Kubernetes.
- CIDR кластера Kubernetes, CIDR сервисов.
- Имя сервисного аккаунта кластера Managed Service for Kubernetes.
- Имя сервисного аккаунта Application Load Balancer.
- Имя профиля безопасности Smart Web Security.
- IP-адрес, трафик с которого будет разрешен.
-
Проверьте корректность файлов конфигурации Terraform с помощью команды:
terraform validate
Если в файлах конфигурации есть ошибки, Terraform на них укажет.
-
Создайте необходимую инфраструктуру:
-
Выполните команду для просмотра планируемых изменений:
terraform plan
Если конфигурации ресурсов описаны верно, в терминале отобразится список изменяемых ресурсов и их параметров. Это проверочный этап: ресурсы не будут изменены.
-
Если вас устраивают планируемые изменения, внесите их:
-
Выполните команду:
terraform apply
-
Подтвердите изменение ресурсов.
-
Дождитесь завершения операции.
-
В указанном каталоге будут созданы все требуемые ресурсы. Проверить появление ресурсов и их настройки можно в консоли управления
. -
Примечание
Если вы развернули инфраструктуру с помощью Terraform, выполнять шаг с Созданием профиля безопасности не нужно.
-
-
Убедитесь, что у вас есть домен и вы можете управлять ресурсными записями в зоне DNS для этого домена. Тестовое приложение будут доступно через Ingress на поддомене этого домена.
Если у вас еще нет домена, зарегистрируйте домен у любого регистратора доменных имен. Чтобы управлять ресурсными записями домена с помощью Yandex Cloud DNS, создайте публичную зону DNS и делегируйте домен.
Примечание
В качестве примера используется домен
example.com
и поддоменdemo.example.com
.Используйте ваши домены при прохождении этого практического руководства.
-
Установите kubectl
и настройте его на работу с созданным кластером.
Установите Ingress-контроллер Application Load Balancer
-
Установите Ingress-контроллер Application Load Balancer в пространство имен
yc-alb
.При установке укажите сервисный аккаунт, который был создан ранее для использования с контроллером.
Использование отдельного пространства имен
yc-alb
позволит отделить ресурсы контроллера от ресурсов тестового приложения и Ingress. -
Убедитесь, что контроллер был успешно установлен:
kubectl logs deployment.apps/yc-alb-ingress-controller -n yc-alb
В логах должны содержаться сообщения об успешном старте Ingress-контроллера.
Пример части результата выполнения команды
... INFO Starting EventSource {"controller": "ingressgroup", ...} ... INFO Starting Controller {"controller": "ingressgroup"} ... INFO Starting EventSource {"controller": "grpcbackendgroup", "controllerGroup": "alb.yc.io", ...} ... INFO Starting Controller {"controller": "grpcbackendgroup", "controllerGroup": "alb.yc.io", ...} ... INFO Starting EventSource {"controller": "httpbackendgroup", "controllerGroup": "alb.yc.io", ...} ... INFO Starting Controller {"controller": "httpbackendgroup", "controllerGroup": "alb.yc.io", ...} ... ... INFO Starting workers {"controller": "ingressgroup", ...} ... INFO Starting workers {"controller": "grpcbackendgroup", "controllerGroup": "alb.yc.io", ...} ... INFO Starting workers {"controller": "httpbackendgroup", "controllerGroup": "alb.yc.io", ...}
Создайте тестовое приложение
Создайте приложение и соответствующий ему сервис, который будет опубликован (exposed) с помощью Ingress:
-
Создайте манифест
demo-app1.yaml
для развертывания приложения:demo-app1.yaml
apiVersion: v1 kind: ConfigMap metadata: name: demo-app1 labels: tutorial: sws data: nginx.conf: | worker_processes auto; events { } http { server { listen 80 ; location = /_healthz { add_header Content-Type text/plain; return 200 'ok'; } location / { add_header Content-Type text/plain; return 200 'Index'; } location = /app1 { add_header Content-Type text/plain; return 200 'This is APP#1'; } } } --- apiVersion: apps/v1 kind: Deployment metadata: name: demo-app1 labels: app: demo-app1 tutorial: sws version: v1 spec: replicas: 2 selector: matchLabels: app: demo-app1 strategy: type: RollingUpdate rollingUpdate: maxSurge: 1 maxUnavailable: 0 template: metadata: labels: app: demo-app1 version: v1 spec: terminationGracePeriodSeconds: 5 volumes: - name: demo-app1 configMap: name: demo-app1 containers: - name: demo-app1 image: nginx:latest ports: - name: http containerPort: 80 livenessProbe: httpGet: path: /_healthz port: 80 initialDelaySeconds: 3 timeoutSeconds: 2 failureThreshold: 2 volumeMounts: - name: demo-app1 mountPath: /etc/nginx readOnly: true resources: limits: cpu: 250m memory: 128Mi requests: cpu: 100m memory: 64Mi --- apiVersion: v1 kind: Service metadata: name: demo-app1 labels: tutorial: sws spec: selector: app: demo-app1 type: NodePort ports: - name: http port: 80 targetPort: 80 protocol: TCP
-
Разверните приложение:
kubectl apply -f demo-app1.yaml
Будут созданы объекты
ConfigMap
,Deployment
иService
для приложенияdemo-app1
. -
Убедитесь, что все объекты были созданы успешно:
kubectl get configmap,deployment,svc -l tutorial=sws
Пример результата выполнения команды
NAME DATA AGE configmap/demo-app1 1 ... NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/demo-app1 2/2 2 2 ... NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/demo-app1 NodePort ... <none> 80:.../TCP ...
Создайте профиль безопасности
Создайте профиль безопасности с простым правилом, чтобы работу профиля было легко проверить. Правила в профиле будут разрешать трафик только с определенного IP-адреса.
Создайте профиль безопасности:
-
В консоли управления
выберите каталог, в котором вы хотите создать профиль. -
В списке сервисов выберите Smart Web Security.
-
Нажмите кнопку Создать профиль и выберите По преднастроенному шаблону.
Профиль будет содержать несколько преднастроенных правил безопасности:
-
Правило Smart Protection с полной защитой для всего трафика. Это правило является приоритетным по отношению к базовому правилу по умолчанию.
-
Базовое правило по умолчанию, которое запрещает весь трафик, не попавший под более приоритетные правила.
Совет
Создание преднастроенного профиля с полной защитой Smart Protection является предпочтительным. Рекомендуем использовать его, чтобы обеспечить наибольшую безопасность защищаемого ресурса.
-
-
Задайте данные профиля:
-
Имя — имя профиля, например
test-sp1
. -
Действие для базового правила по умолчанию — действие, которое должно выполнять базовое правило.
Оставьте выбранным действие
Запретить
, чтобы базовое правило запрещало весь трафик.
-
-
Добавьте правило безопасности:
-
Нажмите кнопку
Добавить правило. -
Укажите основные настройки правила:
-
Имя — имя правила, например
test-rule1
. -
Приоритет — укажите такое значение, чтобы правило имело приоритет над преднастроенными правилами. Например, можно указать значение
999800
.Примечание
Чем меньше значение параметра, тем больший приоритет у правила. Приоритеты преднастроенных правил:
- базовое правило по умолчанию —
1000000
; - правило Smart Protection с полной защитой —
999900
.
- базовое правило по умолчанию —
-
Тип правила — выберите
Базовое
. -
Действие — выберите
Разрешить
.
-
-
В блоке Условия настройте условия так, чтобы разрешался трафик только с определенного IP-адреса:
- Выберите область действия правила на трафик
При условии
. - Выберите условие
IP
. - Выберите условие на IP
Совпадает или принадлежит диапазону
. - Укажите публичный IP-адрес, например
203.0.113.200
.
- Выберите область действия правила на трафик
-
Нажмите кнопку Добавить.
В списке правил безопасности появится созданное правило.
-
-
Нажмите кнопку Создать.
В списке профилей безопасности появится созданный профиль. Запишите идентификатор этого профиля безопасности — он потребуется позднее.
Создайте ресурс Ingress
В этом ресурсе Ingress будут описаны параметры балансировщика Application Load Balancer. Ingress-контроллер, установленный ранее, развернет балансировщик с указанными параметрами после создания ресурса Ingress.
Согласно правилам Ingress, трафик к виртуальному хосту demo.example.com
по пути /app1
будет направляться к бэкенду service/demo-app1. Созданный ранее профиль безопасности будет использоваться, чтобы защитить этот бэкенд.
Чтобы создать ресурс Ingress:
-
Создайте файл
demo-ingress.yaml
с описанием ресурса Ingress:apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: demo-ingress annotations: ingress.alb.yc.io/subnets: "<список_идентификаторов_подсетей>" ingress.alb.yc.io/security-groups: "<идентификатор_группы_безопасности>" ingress.alb.yc.io/external-ipv4-address: "auto" ingress.alb.yc.io/group-name: "demo-sws" ingress.alb.yc.io/security-profile-id: "<идентификатор_профиля_безопасности>" spec: rules: - host: demo.example.com http: paths: - path: /app1 pathType: Exact backend: service: name: demo-app1 port: number: 80
Где:
-
ingress.alb.yc.io/subnets — список идентификаторов подсетей, в которых будет расположен балансировщик.
Если вы создали инфраструктуру с помощью Terraform, используйте идентификатор подсети, которая имеет имя
subnet-a
. -
ingress.alb.yc.io/security-groups — идентификатор группы, созданной ранее для балансировщика.
Если вы создали инфраструктуру с помощью Terraform, укажите идентификатор группы, которая имеет имя
alb-traffic
. -
ingress.alb.yc.io/security-profile-id — идентификатор профиля безопасности, созданного ранее в сервисе Smart Web Security.
Примечание
Профиль безопасности будет применен только к виртуальным хостам для ресурса Ingress, в котором задана аннотация. Для ресурса Ingress, который описан выше, профиль будет применен к единственному виртуальному хосту
demo.example.com
.Этот ресурс Ingress — единственный в группе Ingress
demo-sws
. Профиль безопасности не будет применен к виртуальным хостам других ресурсов Ingress, если такие ресурсы будут позднее добавлены в группу.
-