Создание L7-балансировщика Application Load Balancer с профилем безопасности Smart Web Security с помощью Terraform
Чтобы создать L7-балансировщик с профилем безопасности Smart Web Security с помощью Terraform:
Если созданные ресурсы вам больше не нужны, удалите их.
Подготовьте облако к работе
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVE
илиTRIAL_ACTIVE
. Если платежного аккаунта нет, создайте его и привяжите к нему облако.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
Необходимые платные ресурсы
В стоимость поддержки инфраструктуры для L7-балансировщика с профилем безопасности Smart Web Security входят:
- плата за постоянно запущенные ВМ (см. тарифы Yandex Compute Cloud);
- плата за использование вычислительных ресурсов L7-балансировщика (см. тарифы Application Load Balancer);
- плата за запросы, обработанные правилами профиля безопасности (см. тарифы Yandex Smart Web Security).
Создайте инфраструктуру
Terraform
Terraform распространяется под лицензией Business Source License
Подробную информацию о ресурсах провайдера смотрите в документации на сайте Terraform
Для создания инфраструктуры c помощью Terraform:
-
Установите Terraform, получите данные для аутентификации и укажите источник для установки провайдера Yandex Cloud (раздел Настройте провайдер, шаг 1).
-
Подготовьте файлы с описанием инфраструктуры:
Готовая конфигурацияВручную-
Клонируйте репозиторий с конфигурационными файлами.
git clone https://github.com/yandex-cloud-examples/yc-alb-with-sws-profile.git
-
Перейдите в директорию с репозиторием. В ней должны появиться файлы:
alb-smartwebsecurity-config.tf
— конфигурация создаваемой инфраструктуры.alb-smartwebsecurity.auto.tfvars
— файл с пользовательскими данными.
- Создайте папку для конфигурационных файлов.
- Создайте в папке:
-
Конфигурационный файл
alb-smartwebsecurity-config.tf
:alb-smartwebsecurity-config.tf
# Объявление переменных для конфиденциальных параметров variable "folder_id" { type = string } variable "vm_user" { type = string } variable "ssh_key_path" { type = string } variable "allowed_ip" { type = string } # Добавление прочих переменных locals { zone = "ru-central1-a" network_name = "web-network" subnet_name = "subnet1" sg_vm_name = "sg-web" vm_name = "test-vm1" vm_image_family = "lemp" } # Настройка провайдера terraform { required_providers { yandex = { source = "yandex-cloud/yandex" version = ">= 0.47.0" } } } provider "yandex" { folder_id = var.folder_id } # Создание облачной сети resource "yandex_vpc_network" "network-1" { name = local.network_name } # Создание подсети resource "yandex_vpc_subnet" "subnet-1" { name = local.subnet_name v4_cidr_blocks = ["192.168.1.0/24"] zone = local.zone network_id = yandex_vpc_network.network-1.id } # Создание группы безопасности resource "yandex_vpc_security_group" "sg-1" { name = local.sg_vm_name network_id = yandex_vpc_network.network-1.id egress { protocol = "ANY" description = "any" v4_cidr_blocks = ["0.0.0.0/0"] from_port = 1 to_port = 65535 } ingress { protocol = "TCP" description = "ext-http" v4_cidr_blocks = ["0.0.0.0/0"] port = 80 } ingress { protocol = "TCP" description = "ext-https" v4_cidr_blocks = ["0.0.0.0/0"] port = 443 } ingress { protocol = "TCP" description = "healthchecks" predefined_target = "loadbalancer_healthchecks" port = 30080 } } # Добавление готового образа ВМ resource "yandex_compute_image" "lamp-vm-image" { source_family = local.vm_image_family } resource "yandex_compute_disk" "boot-disk" { name = "bootvmdisk" type = "network-hdd" zone = local.zone size = "20" image_id = yandex_compute_image.lamp-vm-image.id } # Создание ВМ resource "yandex_compute_instance" "vm" { name = local.vm_name platform_id = "standard-v3" zone = local.zone resources { core_fraction = 20 cores = 2 memory = 1 } boot_disk { disk_id = yandex_compute_disk.boot-disk.id } network_interface { subnet_id = yandex_vpc_subnet.subnet-1.id nat = true security_group_ids = [yandex_vpc_security_group.sg-1.id] } metadata = { user-data = "#cloud-config\nusers:\n - name: ${var.vm_user}\n groups: sudo\n shell: /bin/bash\n sudo: 'ALL=(ALL) NOPASSWD:ALL'\n ssh_authorized_keys:\n - ${file("${var.ssh_key_path}")}" } } # Создание профиля безопасности resource "yandex_sws_security_profile" "demo-profile-simple" { name = "test-profile" default_action = "DENY" # Правило Smart Protection с полной защитой security_rule { name = "smart-protection" priority = 999900 smart_protection { mode = "FULL" } } # Базовое правило, пропускает трафик с указанного IP-адреса без проверки правилом Smart Protection security_rule { name = "my-rule" priority = 999800 rule_condition { action = "ALLOW" condition { source_ip { ip_ranges_match { ip_ranges = [var.allowed_ip] } } } } } } # Создание целевой группы resource "yandex_alb_target_group" "foo" { name = "test-target-group" target { subnet_id = yandex_vpc_subnet.subnet-1.id ip_address = yandex_compute_instance.vm.network_interface.0.ip_address } } # Создание группы бекендов resource "yandex_alb_backend_group" "alb-bg" { name = "test-backend-group" http_backend { name = "backend-1" port = 80 target_group_ids = [yandex_alb_target_group.foo.id] healthcheck { timeout = "10s" interval = "2s" healthcheck_port = 80 http_healthcheck { path = "/" } } } } # Создание HTTP-роутера resource "yandex_alb_http_router" "alb-router" { name = "test-http-router" } resource "yandex_alb_virtual_host" "alb-host" { name = "test-virtual-host" http_router_id = yandex_alb_http_router.alb-router.id authority = ["*"] route { name = "route-1" http_route { http_route_action { backend_group_id = yandex_alb_backend_group.alb-bg.id } } } route_options { security_profile_id = yandex_sws_security_profile.demo-profile-simple.id } } # Создание L7-балансировщика resource "yandex_alb_load_balancer" "sws-balancer" { name = "test-load-balancer" network_id = yandex_vpc_network.network-1.id security_group_ids = [yandex_vpc_security_group.sg-1.id] allocation_policy { location { zone_id = local.zone subnet_id = yandex_vpc_subnet.subnet-1.id } } listener { name = "listener" endpoint { address { external_ipv4_address { } } ports = [80] } http { handler { http_router_id = yandex_alb_http_router.alb-router.id } } } }
-
Файл с пользовательскими данными
alb-smartwebsecurity.auto.tfvars
:alb-smartwebsecurity.auto.tfvars
folder_id = "<идентификатор_каталога>" vm_user = "<имя_пользователя_ВМ>" ssh_key_path = "<путь_к_публичному_SSH-ключу>" allowed_ip = "<разрешенный_IP-адрес_устройства>"
-
Более подробную информацию о параметрах используемых ресурсов в Terraform см. в документации провайдера:
- Сеть — yandex_vpc_network
. - Подсети — yandex_vpc_subnet
. - Группы безопасности — yandex_vpc_security_group
. - Образ ВМ — yandex_compute_image
. - Группа бэкендов — yandex_alb_backend_group
. - HTTP-роутер — yandex_alb_http_router
. - Виртуальный хост — yandex_alb_virtual_host
. - L7-балансировщик — yandex_alb_load_balancer
. - Профиль безопасности — yandex_sws_security_profile
.
-
-
В файле
alb-smartwebsecurity.auto.tfvars
задайте пользовательские параметры:folder_id
— идентификатор каталога.vm_user
— имя пользователя ВМ.ssh_key_path
— путь к файлу с публичным SSH-ключом. Подробнее см. Создание пары ключей SSH.allowed_ip
— публичный IP-адрес устройства, с которого вы будете отправлять запросы L7-балансировщику.
-
Создайте ресурсы:
-
В терминале перейдите в папку, где вы отредактировали конфигурационный файл.
-
Проверьте корректность конфигурационного файла с помощью команды:
terraform validate
Если конфигурация является корректной, появится сообщение:
Success! The configuration is valid.
-
Выполните команду:
terraform plan
В терминале будет выведен список ресурсов с параметрами. На этом этапе изменения не будут внесены. Если в конфигурации есть ошибки, Terraform на них укажет.
-
Примените изменения конфигурации:
terraform apply
-
Подтвердите изменения: введите в терминале слово
yes
и нажмите Enter.
-
-
Получите IP-адрес L7-балансировщика — он потребуется далее, чтобы проверить работу профиля безопасности.
После создания инфраструктуры, проверьте работу профиля безопасности.
Протестируйте работу профиля безопасности
-
Откройте терминал устройства, IP-адрес которого вы указали в разрешающем правиле.
-
Отправьте запрос на бэкенд тестового приложения:
curl --verbose <публичный_IP-адрес_L7-балансировщика>
В результате должно быть выведено содержимое директории с тестовым веб-сервером.
-
Повторите запрос с другого IP-адреса. В результате должно быть выведено сообщение о невозможности установить соединение с сервером.
Примечание
Проверка правил Smart Protection не проводится. При такой проверке параметры подозрительных запросов, в том числе IP-адреса, заносятся в черный список.
Как удалить созданные ресурсы
Чтобы перестать платить за созданные ресурсы:
-
Откройте конфигурационный файл
alb-smartwebsecurity-config.tf
и удалите описание создаваемой инфраструктуры из файла. -
Примените изменения:
-
В терминале перейдите в папку, где вы отредактировали конфигурационный файл.
-
Проверьте корректность конфигурационного файла с помощью команды:
terraform validate
Если конфигурация является корректной, появится сообщение:
Success! The configuration is valid.
-
Выполните команду:
terraform plan
В терминале будет выведен список ресурсов с параметрами. На этом этапе изменения не будут внесены. Если в конфигурации есть ошибки, Terraform на них укажет.
-
Примените изменения конфигурации:
terraform apply
-
Подтвердите изменения: введите в терминале слово
yes
и нажмите Enter.
-