Цель демо: Установка PT Web Application Firewall (далее PT WAF) в Yandex.Cloud в отказоустойчивой конфигурации.
- Описание
- Развертывание
- Описание шагов работы с PT WAF
- Проверка прохождения траффика и отказоустойчивости
- Дполнительные материалы: настройка кластеризации PT WAF и настройка Application Load Balancer
В рамках workshop будут выполнены:
- установка инфраструктуры с помощью terraform (infrastructure as a code)
- инсталяция и базовая конфигурация PT WAF cluster в двух зонах доступности Yandex.Cloud
Отказоучстойчивость обеспечивается за счет:
- кластеризации самих PT WAF в режиме Active-Active
- балансировки траффика с помощью External-LB Yandex.Cloud
- использования Cloud Function функции в Yandex.Cloud, которая отслеживает состояние PT WAF и в случаи их падения направляет траффик на приложения напрямую -
BYPASS
Предполагается, что в Yandex.Cloud у Клиента уже развернут небезопасный сценарий публикации ВМ наружу: ВМ с веб приложениями в 2-х зонах доступности. Также имеется внешний сетевой балансировщик нагрузки.
Для установки целой схемы снуля необходимо использовать playbook из папки "from-scratch"
- скачать архив с файлами pt_archive.zip
- перейти в папку с файлами
- вставить необходимые параметры в файле
variables.tf
(в комментариях указаны необходимые команды yc для получения значений) - выполнить команду инициализации terraform
terraform init
- выполнить команду импорта load-balancer
terraform import yandex_lb_network_load_balancer.ext-lb $(yc load-balancer network-load-balancer list --format=json | jq '.[].id' | sed 's/"//g')
- выполнить команду запуска terraform
terraform apply
- включить NAT на subnet: ext-subnet-a, ext-subnet-b (для того, чтобы PT WAF мог выходить в интернет за обновлениями и активировать лицензию)
- назначить Security Group
app-sg
на ВМ: app-a, app-b
Видеоинструкция этапа:
- пробрасываем порты по SSH для подключения к серверам PT AF (нужно выполнять в двух разных окнах терминала):
ssh -L 22001:192.168.2.10:22013 -L 22002:172.18.0.10:22013 -L 8443:192.168.2.10:8443 -L 127.0.0.2:8443:172.18.0.10:8443 -i ./pt_key.pem yc-user@$(yc compute instance list --format=json | jq '.[] | select( .name == "ssh-a")| .network_interfaces[0].primary_v4_address.one_to_one_nat.address '| sed 's/"//g')
После этого вы окажитесь в терминале ssh-a (брокер машина) оставте его открытым
- подключитесь к ptaf-a:
ssh -p 22001 -i pt_key.pem yc-user@localhost -o StrictHostKeyChecking=no
- выпишите текущий пароль БД:
sudo wsc -c 'password list'
- выполните скрипт автоконфигурации кластера:
/home/pt/cluster.sh
- подключитесь к ptaf-b:
ssh -p 22002 -i pt_key.pem yc-user@localhost -o StrictHostKeyChecking=no
- задайте пароль БД из прошлого этапа
sudo wsc -c 'password set <мастер-пароль>' (должен совпадать с тем, который задан на узле master).
- выполните скрипт автоконфигурации кластера:
/home/pt/cluster.sh
- сначала запустим синхронизацию на SLAVE-сервере использовав команду:
ssh -p 22002 -i pt_key.pem yc-user@localhost -o StrictHostKeyChecking=no
sudo wsc
Enter 0
config commit
- дождитесь когда на SLAVE-сервере появится сообщение:
TASK: [mongo | please configure all other nodes of your cluster]
, после этого переключитесь на MASTER-сервер и начните синхронизацию той же командой:
ssh -p 22001 -i pt_key.pem yc-user@localhost -o StrictHostKeyChecking=no
sudo wsc
Enter 0
config commit
В случае, если на MASTER команда config commit завершится неуспешно, нужно применить команду еще раз.
-
далее конфигурация на узле master остановилась на сообщении
TASK: [mongo | wait config sync on secondary nodes]
, просто вручную выполните команду config sync на узле SLAVE. -
на SLAVE выполнить:
config sync
- на MASTER выполнить:
config sync
- на MASTER выполнить:
mongo --authenticationDatabase admin -u root -p $(cat /opt/waf/conf/master_password) waf --eval 'c = db.sentinel; l = c.findOne({_id: "license"}); Object.keys(l).forEach(function(k) { if (l[k].ip) { delete l[k].ip; l[k].hostname = "yclicense.ptsecurity.ru" }}); c.update({_id: l._id}, l)'
-
Открываем в браузере https://127.0.0.1:8443
-
Вводим стандартные логин и пароль, admin/positive, меняем пароль, например на
P@ssw0rd
-
Открываем вкладку
Configuration -> Network -> Gateways
, кликая на иконку карандаша (Edit) -
в каждом из шлюзе устанавливаем галочку
Active
-
в каждом из шлюзе на вкладке
Network
определяем для интерфейса eth-ext1 алиасы mgmt, wan, lan -
Создаем апстрим на вкладке
Configuration -> Network -> Upstreams
-
Name:
internal-lb
-
Backend Host: впишите адрес внутреннего балансировщика яндекс облако
-
Backend port:
80
-
Создаем сервис на вкладке
Configuration -> Network -> Services
-
Name:
app
-
Net interface alias:
wan
-
Listen port:
80
-
Upstream:
internal-lb
-
Редактуируем существующее веб приложение Any на вкладке
Configuration -> Security -> Web Applications
: -
Service:
app
- посмотрите внешний ip адреса внешнего балансировщика нагрузки
- отклюим ptaf-a и убедимся, что трафик проходит
- отключим app-a и убедимся, что трафик проходит
- отклюим ptaf-b и убедимся, что
BYPASS
сработает и трафик переключится напрямую на внутренний балансировщик - включите ptaf-a, ptaf-b обратно и убедитесь то, что трафик снова идет через ptaf
В данной схеме возможно использовать Application LoadBalancer Yandex.Cloud
Существует подробная инструкция по Организация виртуального хостинга (включая интеграцию с certificate manager для управления SSL сертификатами)