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

1. 소개

Cloud Armor 보안 정책은 인프라 상류의 Google 네트워크 에지에서 트래픽을 필터링하는 사용자 정의 규칙을 구성하는 데 사용됩니다. Network Edge 보안 정책을 사용하면 네트워크 부하 분산기, 프로토콜 전달, 공개 IP가 있는 VM과 같은 엔드포인트 유형을 타겟팅하는 트래픽을 보호하고 허용하거나 차단할 수 있습니다.

7bc9d3ed0c03b54f.png

이 코드 실습에서는 사용자 정의 규칙으로 Cloud Armor 보안 정책을 구성하여 DDoS 공격을 방지하는 방법을 시연합니다.

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으로 전송됩니다. 다음 예에서는 값이 다른 두 개의 '오프셋'을 정의합니다.

첫 번째 값은 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 ens4) 소스 IP 주소 (-s 10.0.1.2)에서 소스 포트 (-S 10000)를 사용하여 대상VM 대상 IP 주소 (-d 35.240.148.100)로 대상 포트 (-D 10000)를 사용하는 (-t udp) 패킷을 시뮬레이션합니다. 패킷 콘텐츠가 값과 일치합니다 (-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. Telemetry

Cloud 측정항목을 열고 아래 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 보안 정책