사용자 정의 규칙이 있는 NLB/VM용 Cloud Armor

1. 소개

Cloud Armor 보안 정책은 사용자 정의 규칙을 구성하여 인프라의 업스트림인 Google 네트워크 에지에서 트래픽을 필터링하는 데 사용됩니다. 네트워크 에지 보안 정책을 사용하면 네트워크 부하 분산기, 프로토콜 전달, 공개 IP가 있는 VM 등의 엔드포인트 유형을 대상으로 하는 트래픽을 보호하고 허용 또는 차단할 수 있습니다.

7bc9d3ed0c03b54f.png

이 Codelab에서는 DDoS 공격을 방지하기 위해 사용자 정의 규칙으로 Cloud Armor 보안 정책을 구성하는 방법을 보여줍니다.

f0a40260147e71b1.png

그림 1. 공개 IP 보호 기능이 있는 VM용 Cloud Armor

학습할 내용

  • 사용자 정의 규칙 구성이 포함된 Cloud Armor 보안 정책
  • UDP 오프셋 구성 및 테스트

필요한 항목

  • TCP/IP에 대한 지식
  • Unix/Linux 명령줄에 관한 지식

2. 시작하기 전에

Cloud Shell 내에서 프로젝트 ID가 설정되어 있는지 확인합니다.

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가 VM 인스턴스에 연결하도록 허용하는 방화벽 규칙을 만듭니다.

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

4. 대상 VM 인스턴스 만들기

보안 정책 테스트를 위한 대상 VM 만들기 이 VM에는 공개 IP 주소가 있어야 하며 UDP 포트 10000을 열어야 합니다.

Cloud Shell에서 targetvm 인스턴스 만들기

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 오프셋이며 Cloud Armor 정책에서 구성되었습니다. 이 '오프셋 값'이 있는 패킷 정책 검사를 전달하여 백엔드 VM으로 전송합니다. 다음 예에서는 두 개의 'offset'을 정의합니다. 다른 값을 사용할 수 있습니다.

첫 번째 값은 UDP 헤더 바로 뒤, 2바이트와 정확히 일치함 0x1700

두 번째 값은 UDP 헤더의 8바이트 오프셋이며 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. 대상 VM에 보안 정책 연결

Cloud Shell에서 보호된 VM에 보안 정책을 연결합니다.

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에서 대상 VM을 설명하면 securityPolicy가 연결된 것을 확인할 수 있습니다. 다음 테스트를 위해 공개 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에서 보호되는 VM에서 보안 정책을 분리합니다.

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가 VM 인스턴스에 연결하도록 허용하는 방화벽 규칙을 만듭니다.

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

테스트 VM 만들기

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. 인증

테스트 VM 콘솔에 로그인하고 패킷 생성기 packit을 설치합니다.

sudo apt install packit

UDP 오프셋 설계에 따라packit을 사용하여 UDP 패킷을 생성합니다. 소스 포트 (-S 10000)를 사용하여 인터페이스 (-s ens4) 소스 IP 주소 (-s 10.0.1.2)의 (-t udp) 패킷을 대상 포트 (-D 10000)를 사용하여 대상 VM 대상 IP 주소 (-d 35.240.148.100)로 시뮬레이션합니다. 패킷 콘텐츠가 값 (-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

대상 VM에서 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

테스트 VM에서 트래픽 패턴을 변경하면 대상 VM에서 패킷을 캡처할 수 없습니다.

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 측정항목을 열고 MQL 아래 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

오프셋 일치 명령어로 대용량 트래픽을 생성합니다.

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

일치하지 않는 오프셋 명령어를 사용하여 대용량 트래픽을 생성합니다.

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. 정리 단계

터미널의 단일 Cloud Shell에서 실습 구성요소를 삭제합니다.

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. 축하합니다.

축하합니다. Codelab을 완료했습니다.

학습한 내용

  • 고객이 정의한 규칙이 포함된 Cloud Armor 보안 정책