Создание 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-запись для домена.
- Проверьте результат.
Если созданные ресурсы вам больше не нужны, удалите их.
Перед началом работы
-
Подготовьте необходимую инфраструктуру:
Вручную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, если такие ресурсы будут позднее добавлены в группу.Подробнее об аннотациях см. в разделе Поля и аннотации ресурса Ingress.
-
Создайте ресурс Ingress:
kubectl apply -f demo-ingress.yaml
Ingress-контроллер Application Load Balancer запустит процесс создания целевых групп, групп бэкендов, HTTP-роутеров и балансировщика нагрузки.
-
Периодически проверяйте статус ресурса Ingress, пока в столбце
ADDRESS
не появится IP-адрес балансировщика:kubectl get ingress demo-ingress
Это будет означать, что балансировщик создан успешно и может принимать трафик.
Пример результата выполнения команды
NAME CLASS HOSTS ADDRESS PORTS AGE demo-ingress <none> demo.example.com <IP_адрес> 80 ...
-
Создайте DNS-запись для домена
-
Создайте A-запись для домена
demo.example.com
в зонеexample.com
. В значении укажите IP-адрес балансировщика, который был создан ранее. -
Дождитесь, пока завершится распространение DNS-записей (DNS propagation).
Проверить, что DNS-записи распространились, можно либо с помощью онлайн-сервисов, либо с помощью запросов вручную к разным DNS-серверам:
nslookup -type=a demo.example.com <IP_адрес_DNS_сервера>
Проверьте результат
Запросы к приложению, развернутому в кластере Kubernetes, проходят через балансировщик нагрузки Application Load Balancer. Виртуальные хосты, на которые направляются запросы, защищены с помощью профиля безопасности. Этот профиль был настроен так, чтобы разрешать трафик только с определенного IP-адреса (например, с 203.0.113.200
).
Проверьте, что балансировщик работает корректно с учетом настроенного профиля безопасности:
-
Проверьте с хоста с разрешенным IP-адресом
203.0.113.200
, что выполняется маршрутизация трафика по правилу, заданному в ресурсе Ingress:curl http://demo.example.com/app1
Ожидаемый результат:
This is demo-app1
-
Проверьте с хоста с другим IP-адресом, который не входит в список разрешенных (например
203.0.113.100
), что маршрутизация трафика не выполняется:curl http://demo.example.com/app1
Ожидаемый результат: ответ от балансировщика с кодом HTTP 403 Forbidden
и сообщением об ограничении доступа к ресурсу.
Если маршрутизация трафика не выполняется так, как ожидается, то убедитесь, что заданы необходимые настройки:
- Сервисному аккаунту для Ingress-контроллера должны быть назначены необходимые роли, в том числе для работы с сервисом Smart Web Security.
- Группы безопасности для кластера Managed Service for Kubernetes и его групп узлов должны быть настроены корректно. Если отсутствует какое-либо из правил — добавьте его.
- Профиль безопасности должен быть настроен корректно, чтобы разрешать трафик с нужного адреса.
Совет
После подтверждения работоспособности профиля добавьте нужные правила, если это необходимо.
Удалите созданные ресурсы
Некоторые ресурсы платные. Чтобы за них не списывалась плата, удалите ресурсы, которые вы больше не будете использовать:
-
Удалите созданный ресурс Ingress:
kubectl delete ingress demo-ingress
Будет удален балансировщик нагрузки, а также HTTP-роутер, связанный с балансировщиком.
Профиль безопасности Smart Web Security будет отключен от виртуальных хостов, указанных в ресурсе Ingress.
-
Удалите кластер Managed Service for Kubernetes и связанную с ним инфраструктуру:
ВручнуюTerraformУдалите кластер Managed Service for Kubernetes.
При необходимости удалите сервисные аккаунты и группы безопасности, созданные перед началом работы.
-
В терминале перейдите в директорию с планом инфраструктуры.
Важно
Убедитесь, что в директории нет Terraform-манифестов с ресурсами, которые вы хотите сохранить. Terraform удаляет все ресурсы, которые были созданы с помощью манифестов в текущей директории.
-
Удалите ресурсы:
-
Выполните команду:
terraform destroy
-
Подтвердите удаление ресурсов и дождитесь завершения операции.
Все ресурсы, которые были описаны в Terraform-манифестах, будут удалены.
-
-