Cloud Armor для NLB/VM с пользовательскими правилами

1. Введение

Политики безопасности Cloud Armor используются для настройки определяемых пользователем правил фильтрации трафика на границе сети Google, выше вашей инфраструктуры. Политики безопасности на границе сети могут использоваться для защиты и разрешения или блокировки трафика, нацеленного на следующие типы конечных точек: балансировщики сетевой нагрузки, переадресация протоколов и виртуальные машины с публичными IP-адресами.

7bc9d3ed0c03b54f.png

В этом практическом занятии мы продемонстрируем, как настроить политики безопасности Cloud Armor с помощью определяемых пользователем правил для предотвращения DDoS-атак.

f0a40260147e71b1.png

Рисунок 1. Cloud Armor для виртуальных машин с защитой от использования публичных IP-адресов.

Что вы узнаете

  • Политики безопасности Cloud Armor с настройкой правил, определяемых пользователем.
  • Настройка и тестирование смещения UDP.

Что вам понадобится

  • Знание TCP/IP
  • Знание командной строки Unix/Linux.

2. Прежде чем начать

Внутри Cloud Shell убедитесь, что идентификатор вашего проекта указан правильно.

gcloud config list project
gcloud config set project [YOUR-PROJECT-NAME]
prodproject=YOUR-PROJECT-NAME
echo $prodproject

3. Создайте целевую сеть VPC.

В следующем разделе мы настроим сети VPC и соответствующие сетевые конфигурации. Политика безопасности на границе сети Cloud Armor основана на региональном принципе, поэтому все соответствующие ресурсы будут размещены в регионе asia-southeast1.

Сеть VPC

Из Cloud Shell

gcloud compute networks create ca4nlb --project=$prodproject --subnet-mode=custom

Создать подсеть

Из Cloud Shell

gcloud compute networks subnets create ca4nlb-asia-southeast1 --project=$prodproject --range=10.0.0.0/24 --network=ca4nlb --region=asia-southeast1

Создайте правила брандмауэра.

В этом разделе мы добавим правило брандмауэра, разрешающее ожидаемый UDP-трафик на порт 10000.

В Cloud Shell создайте правило брандмауэра для открытия UDP-порта 10000 для последующего тестирования.

gcloud compute firewall-rules create ca4nlb-udp10000 --allow udp:10000 --network ca4nlb --source-ranges 0.0.0.0/0 --enable-logging

В Cloud Shell создайте правило брандмауэра, разрешающее IAP подключаться к вашим экземплярам виртуальных машин.

gcloud compute firewall-rules create ca4nlb-iap-prod --network ca4nlb --allow tcp:22 --source-ranges=35.235.240.0/20 --enable-logging

4. Создайте целевые экземпляры виртуальных машин.

Создайте целевую виртуальную машину для тестирования политик безопасности. Эта виртуальная машина должна иметь публичный IP-адрес и открытый UDP-порт 10000.

Создайте экземпляр targetvm в Cloud Shell.

gcloud compute instances create targetvm \
--zone=asia-southeast1-b \
--image-family=debian-11 \
--image-project=debian-cloud \
--network-interface=network-tier=PREMIUM,nic-type=GVNIC,stack-type=IPV4_ONLY,subnet=ca4nlb-asia-southeast1 \
--shielded-secure-boot \
--shielded-vtpm \
--shielded-integrity-monitoring

5. Настройте расширенную защиту от DDoS-атак в сети.

Из Cloud Shell

 gcloud compute security-policies create ca_advanced_ddos \
     --type CLOUD_ARMOR_NETWORK \
     --region asia-southeast1

 gcloud compute security-policies update ca_advanced_ddos \
     --network-ddos-protection ADVANCED \
     --region asia-southeast1

 gcloud compute network-edge-security-services create caedgepolicy \
     --security-policy ca_advanced_ddos \
     --region asia-southeast1

6. Создайте политику безопасности пограничного слоя сети с правилами по умолчанию.

Создание политики безопасности на границе сети

Из Cloud Shell

gcloud alpha compute security-policies create customnetworkedge --type=CLOUD_ARMOR_NETWORK --region=asia-southeast1

Изменить правило по умолчанию

Из Cloud Shell

gcloud alpha compute security-policies rules update 2147483647 --security-policy=customnetworkedge --action=deny --region=asia-southeast1

7. Создайте политику безопасности на границе сети с использованием настроенных правил.

Пользователь задает смещение UDP и настраивает его в политике CloudArmor. Пакет с этими значениями смещения пройдет проверку политики и будет отправлен на серверную виртуальную машину. В следующем примере мы определим два смещения с разными значениями.

Первое значение находится сразу после заголовка UDP, точно соответствует 2 байтам 0x1700

Второе значение — это смещение на 8 байт в заголовке UDP, точно совпадающее с 4 байтами 0x12345678

Указанное выше предопределенное значение будет преобразовано в битовый вид UDP-пакета.

cbfdaeb93292e07b.png

Из Cloud Shell

gcloud alpha compute security-policies add-user-defined-field customnetworkedge \
--user-defined-field-name=SIG1_AT_0 \
--base=udp --offset=8 --size=2 --mask=0xFF00 \
--region=asia-southeast1

gcloud alpha compute security-policies add-user-defined-field customnetworkedge \
--user-defined-field-name=SIG2_AT_8 \
--base=udp --offset=16 --size=4 --mask=0xFFFFFFFF \
--region=asia-southeast1

gcloud alpha compute security-policies rules create 1000 \
--security-policy=customnetworkedge \
--network-user-defined-fields="SIG1_AT_0;0x1700,SIG2_AT_8;0x12345678" \
--action=allow --region=asia-southeast1

8. Примените политику безопасности к целевой виртуальной машине.

В Cloud Shell можно прикрепить политику безопасности к защищаемой виртуальной машине.

gcloud alpha compute instances network-interfaces update targetvm \
--security-policy=customnetworkedge \
--security-policy-region=asia-southeast1 \
--network-interface=nic0 \
--zone=asia-southeast1-b

В Cloud Shell укажите целевую виртуальную машину, и вы увидите, что политика безопасности прикреплена. Запишите публичный IP-адрес для последующего тестирования.

gcloud alpha compute instances describe targetvm --zone=asia-southeast1-b

networkInterfaces:
- accessConfigs:
  - kind: compute#accessConfig
    name: External NAT
    natIP: 35.240.148.100
    networkTier: PREMIUM
    securityPolicy: https://www.googleapis.com/compute/alpha/projects/<project>/regions/asia-southeast1/securityPolicies/customnetworkedge

В Cloud Shell отсоедините политику безопасности от защищаемой виртуальной машины.

gcloud alpha compute instances network-interfaces update targetvm \
--network-interface=nic0 \
--zone=asia-southeast1-b \
--security-policy= 

9. Подготовьте тестовые материалы.

Создание тестовой сети VPC

Из Cloud Shell

gcloud compute networks create test --project=$prodproject --subnet-mode=custom

Создание тестовой подсети

Из Cloud Shell

gcloud compute networks subnets create test-asia-southeast1 --project=$prodproject --range=10.0.1.0/24 --network=test --region=asia-southeast1

Создать брандмауэр

В Cloud Shell создайте правило брандмауэра, разрешающее IAP подключаться к вашим экземплярам виртуальных машин.

gcloud compute firewall-rules create test-iap-prod --network test --allow tcp:22 --source-ranges=35.235.240.0/20 --enable-logging

Создание тестовой виртуальной машины

Из Cloud Shell

gcloud compute instances create test01 \
    --zone=asia-southeast1-b \
    --image-family=debian-11 \
    --image-project=debian-cloud \
    --network-interface=network-tier=PREMIUM,nic-type=GVNIC,stack-type=IPV4_ONLY,subnet=test-asia-southeast1 \
    --shielded-secure-boot \
    --shielded-vtpm \
    --shielded-integrity-monitoring

10. Проверка

Войдите в консоль тестовой виртуальной машины и установите генератор пакетов packit .

sudo apt install packit

Следуя принципу смещения UDP, используйте packit для генерации UDP-пакетов. Мы имитируем пакет (-t udp) от интерфейса (-s ens4) с исходным IP-адресом (-s 10.0.1.2) и исходными портами (-S 10000) к целевому IP-адресу targetVM (-d 35.240.148.100) и целевыми портами (-D 10000). Содержимое пакета соответствует значениям (-p '0x 17 00 00 00 00 00 00 00 12 34 56 78'). Мы отправим пакеты (-c 4).

sudo packit -m inject -t UDP -i ens4 -s 10.0.1.2 -d 35.240.148.100 -S 10000 -D 10000 -p '0x 17 00 00 00 00 00 00 00 12 34 56 78' -c 4

На целевой виртуальной машине запустите tcpdump для захвата UDP-пакета.

sudo tcpdump port 10000 -v -n 

tcpdump: listening on ens4, link-type EN10MB (Ethernet), snapshot length 262144 bytes
06:36:18.434106 IP (tos 0x0, ttl 128, id 17173, offset 0, flags [none], proto UDP (17), length 40)
    35.197.157.140.10000 > 10.0.0.2.10000: UDP, length 12
06:36:19.433656 IP (tos 0x0, ttl 128, id 55641, offset 0, flags [none], proto UDP (17), length 40)
    35.197.157.140.10000 > 10.0.0.2.10000: UDP, length 12
06:36:20.433935 IP (tos 0x0, ttl 128, id 27161, offset 0, flags [none], proto UDP (17), length 40)
    35.197.157.140.10000 > 10.0.0.2.10000: UDP, length 12
06:36:21.434150 IP (tos 0x0, ttl 128, id 46782, offset 0, flags [none], proto UDP (17), length 40)
    35.197.157.140.10000 > 10.0.0.2.10000: UDP, length 12

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

sudo packit -m inject -t UDP -i ens4 -s 10.148.0.6 -d 34.87.79.31 -S 10000 -D 10000 -p '0x 33 33 00 00 00 00 00 00 12 34 56 78' -c 4

11. Телеметрия

Откройте Cloud Metric и используйте приведенный ниже MQL-запрос для получения телеметрических данных NetworkSercurityPolicy.

fetch networksecurity.googleapis.com/RegionalNetworkSecurityPolicy
| metric 'networksecurity.googleapis.com/l3/external/packet_count'
| filter (resource.policy_name == 'customnetworkedge')
| align rate(1m)
| every 1m
| group_by [metric.blocked], [value_packet_count_mean: mean(value.packet_count)]
| group_by 1m, [value_packet_count_mean_mean: mean(value_packet_count_mean)]
| every 1m

Сгенерируйте большой объем трафика с помощью команды match offset.

sudo packit -m inject -t UDP -i ens4 -s 10.148.0.6 -d 34.87.79.31 -S 10000 -D 10000 -p '0x 17 00 00 00 00 00 00 00 12 34 56 78' -c 1000000 -w 0.001

[result]
Injected: 1000000  Packets/Sec: 10309.27  Bytes/Sec: 412371.13  Errors: 0

Сгенерируйте большой объем трафика с помощью команды unmatched offset.

sudo packit -m inject -t UDP -i ens4 -s 10.148.0.6 -d 34.87.79.31 -S 10000 -D 10000 -p '0x 11 00 00 00 00 00 00 00 12 34 56 78' -c 1000000 -w 0.001

[result]
Injected: 1000000  Packets/Sec: 10309.27  Bytes/Sec: 412371.13  Errors: 0

Телеметрия фильтруется по policy_name и группируется по заблокированному трафику. Синяя линия показывает трафик, разрешенный правилами политики. Зеленая линия показывает трафик, заблокированный правилами политики.

b11ba15d87f99775.png

12. Этапы очистки

Из единой облачной оболочки в терминале удалите компоненты лаборатории.

gcloud compute instances delete targetvm --zone=asia-southeast1-b

gcloud compute firewall-rules delete ca4nlb-udp10000

gcloud compute firewall-rules delete ca4nlb-iap-prod

gcloud compute networks subnets delete ca4nlb-asia-southeast1 --region=asia-southeast1

gcloud compute networks delete ca4nlb

gcloud alpha compute security-policies delete customnetworkedge --region=asia-southeast1

gcloud alpha compute network-edge-security-services delete caedgepolicy --region=asia-southeast1

gcloud alpha compute security-policies delete ca_advanced_ddos --region=asia-southeast1

gcloud compute instances delete test01 --zone=asia-southeast1-b

gcloud compute firewall-rules delete test-iap-prod

gcloud compute networks subnets delete test-asia-southeast1 --region=asia-southeast1

gcloud compute networks delete test

13. Поздравляем!

Поздравляем с завершением практического занятия!

Что мы рассмотрели

  • Политики безопасности Cloud Armor с правилами, определяемыми пользователем.