태그가 있는 전역 네트워크 방화벽 정책

1. 소개

네트워크 방화벽 정책

방화벽은 안전한 클라우드 환경의 기본 구성 요소입니다. 앞서 조직 및 폴더 수준에서 방화벽 정책을 도입한 반면 VPC 방화벽은 변경하지 않았습니다. 이번 버전에서는 방화벽 정책 구조를 VPC 수준까지 확장하고, 현재 방화벽 정책 지원을 몇 가지 개선하여 Google Cloud의 리소스 계층 구조 전반에 걸쳐 통합된 방화벽 지원을 제공하고, 방화벽 정책 제어를 안전하고 유연하며 확장 가능한 방식으로 관리하는 일관된 사용자 환경을 제공합니다.

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

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

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

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

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

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

  • 작업이 allow인 이그레스 규칙이며 대상은 0.0.0.0/0입니다.
  • 작업이 거부이고 소스가 0.0.0.0/0인 인그레스 규칙

기본적으로 적용 순서는 다음 다이어그램에 나와 있습니다.

abae4597af782b2b.png

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

태그

네트워크 방화벽 정책 규칙에 통합된 태그는 Google Cloud 리소스 계층 구조의 조직 수준에서 정의된 키-값 쌍 리소스입니다. 이러한 태그에는 이름에서 알 수 있듯이 누가 태그로 무엇을 할 수 있는지 지정하는 IAM 액세스 제어가 포함됩니다. 예를 들어 IAM 권한을 사용하면 태그에 값을 할당할 수 있는 주 구성원과 리소스에 태그를 연결할 수 있는 주 구성원을 지정할 수 있습니다. 태그가 리소스에 적용되면 네트워크 방화벽 규칙은 태그를 사용하여 트래픽을 허용하고 거부할 수 있습니다.

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

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

이 문서에서는 태그와 IAM 관리 태그가 같은 의미로 사용됩니다.

빌드할 항목

이 Codelab은 두 부분으로 구성됩니다. 첫 번째 부분에서는 단일 VPC 네트워크를 사용하는 네트워크 방화벽 정책 및 태그를 보여주고, 두 번째 부분에서는 아래 다이어그램에 따라 피어링된 VPC 네트워크에서 태그를 사용하는 방법을 보여줍니다. 따라서 이 Codelab에는 단일 프로젝트가 필요하며 여러 VPC 네트워크를 만들 수 있어야 합니다.

b9acf9823df8be04.jpeg

학습할 내용

  • 네트워크 방화벽 정책을 만드는 방법
  • 네트워크 방화벽 정책으로 태그를 만들고 사용하는 방법
  • VPC 네트워크 피어링을 통해 태그를 사용하는 방법

필요한 항목

  • 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 org_id=[org]
export region=us-central1
export zone=us-central1-a
export prefix=fwpolicy

3. VPC 네트워크 및 서브넷 만들기

VPC 네트워크

fwpolicy-vpc1을 만듭니다.

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

서브넷

선택한 리전에 각 서브넷을 만듭니다.

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

Cloud NAT

fwpolicy-pc1용 Cloud Router 및 Cloud NAT 게이트웨이를 만듭니다.

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

gcloud compute routers nats create $prefix-vpc1-cloudnat \
   --router=$prefix-vpc1-cr --router-region=$region \
   --auto-allocate-nat-external-ips \
   --nat-all-subnet-ip-ranges

4. 인스턴스 만들기

IAP 설정의 일부로 아직 정의되지 않은 경우 IAP 범위의 인그레스 SSH 트래픽을 허용하는 방화벽 규칙을 만듭니다.

gcloud compute firewall-rules create allow-ssh-ingress-from-iap-vpc1 \
  --direction=INGRESS \
  --action=allow \
  --network=$prefix-vpc1 \
  --rules=tcp:22 \
  --source-ranges=35.235.240.0/20

fwpolicy-vpc1 클라이언트 및 web-server 인스턴스를 만듭니다.

gcloud compute instances create $prefix-vpc1-www \
   --subnet=$prefix-vpc1-subnet --no-address --zone $zone \
   --metadata startup-script='#! /bin/bash
apt-get update
apt-get install apache2 -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'

gcloud compute instances create $prefix-vpc1-client \
    --subnet=$prefix-vpc1-subnet --no-address --zone $zone

이 섹션의 시작 부분에 따라 IAP를 구성할 때 만들어야 하는 SSH 허용 규칙 외에는 정의된 VPC 방화벽 규칙이 없으며 기본적으로 모든 인그레스 트래픽이 거부되므로 클라이언트 인스턴스는 각 웹 서버에 액세스할 수 없습니다. 요청 시간이 초과되는지 확인하려면 새 창을 열고 fwpolicy-vpc1-client 인스턴스에 대한 SSH 세션을 시작한 다음 웹 서버의 curl을 시도합니다.

user@fwpolicy-vpc1-client$ curl fwpolicy-vpc1-www --connect-timeout 2

예상 출력:

curl: (28) Connection timed out after 2001 milliseconds

필요한 경우 Cloud Shell을 통해 fwpolicy-vpc1에 정의된 VPC 방화벽 규칙이 없는지 확인합니다.

gcloud compute firewall-rules list --filter="network:$prefix-vpc1"

5. 전역 네트워크 방화벽 정책

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

gcloud compute network-firewall-policies create \
   $prefix-example --description \
   "firewall-policy-description" --global

웹 트래픽을 허용하는 규칙을 추가합니다.

gcloud compute network-firewall-policies rules create 500 \
    --action allow \
    --description "allow-web" \
    --layer4-configs tcp:80,tcp:443 \
    --firewall-policy $prefix-example \
    --src-ip-ranges 10.0.0.0/16 \
    --global-firewall-policy --enable-logging

네트워크 방화벽 정책을 설명하고 규칙이 성공적으로 added되었는지 확인합니다.

gcloud compute network-firewall-policies describe \
    $prefix-example --global

예상 출력 (출력의 시작 부분까지 스크롤하면 암시적 규칙도 표시됨)은 다음과 같습니다.

creationTimestamp: '2022-09-23T12:46:53.677-07:00'
description: "firewall-policy-description"
fingerprint: Np1Rup09Amc=
id: '7021772628738421698'
kind: compute#firewallPolicy
name: fwpolicy-example
ruleTupleCount: 13
rules:
- action: allow
  description: allow-web
  direction: INGRESS
  disabled: false
  enableLogging: true
  kind: compute#firewallPolicyRule
  match:
    layer4Configs:
    - ipProtocol: tcp
      ports:
      - '80'
    - ipProtocol: tcp
      ports:
      - '443'
    srcIpRanges:
    - 10.0.0.0/16
  priority: 500
  ruleTupleCount: 5
...

네트워크 방화벽 정책을 fwpolicy-vpc1에 연결합니다.

gcloud compute network-firewall-policies associations create \
     --firewall-policy $prefix-example \
     --network $prefix-vpc1 \
     --name $prefix-vpc1-association \
     --global-firewall-policy

fwpolicy-vpc1 네트워크에 성공적으로 적용되었는지 확인합니다.

gcloud compute networks get-effective-firewalls $prefix-vpc1

예상되는 출력 (계층식 방화벽 정책이 우선 적용되는 경우 관련 규칙이 상단에 표시됨):

TYPE                     FIREWALL_POLICY_NAME     PRIORITY    ACTION     DIRECTION  IP_RANGES
network-firewall-policy  fwpolicy-example      500         ALLOW      INGRESS    10.0.0.0/16
network-firewall-policy  fwpolicy-example      2147483645  GOTO_NEXT  INGRESS    ::/0
network-firewall-policy  fwpolicy-example      2147483647  GOTO_NEXT  INGRESS    0.0.0.0/0
network-firewall-policy  fwpolicy-example      2147483644  GOTO_NEXT  EGRESS     ::/0
network-firewall-policy  fwpolicy-example      2147483646  GOTO_NEXT  EGRESS     0.0.0.0/0

fwpolicy-vpc1 웹 서버에도 성공적으로 적용되었는지 확인합니다.

gcloud compute instances network-interfaces \
   get-effective-firewalls $prefix-vpc1-www --zone $zone

예상되는 출력은 이전 명령어 (fwpolicy-vpc1 유효 방화벽s)와 유사합니다.

TYPE                     FIREWALL_POLICY_NAME     PRIORITY    ACTION     DIRECTION  IP_RANGES
network-firewall-policy  fwpolicy-example      500         ALLOW      INGRESS    10.0.0.0/16
network-firewall-policy  fwpolicy-example      2147483645  GOTO_NEXT  INGRESS    ::/0
network-firewall-policy  fwpolicy-example      2147483647  GOTO_NEXT  INGRESS    0.0.0.0/0
network-firewall-policy  fwpolicy-example      2147483644  GOTO_NEXT  EGRESS     ::/0
network-firewall-policy  fwpolicy-example      2147483646  GOTO_NEXT  EGRESS     0.0.0.0/0

vpc1-client SSH 세션으로 다시 전환하고 curl을 다시 시도합니다. 아래 명령어는 fwpolicy가 접두사로 사용되었다고 가정합니다. 대신 다른 이름이 사용된 경우 curl 명령어를 적절하게 조정하세요.

user@vpc1-client$ curl fwpolicy-vpc1-www --connect-timeout 2
Page on vpc1-www in network vpc1 zone us-central1-a

Cloud Shell에서 네트워크 방화벽 정책이 fwpolicy-vpc1에 적용되었는지 확인합니다.

gcloud compute network-firewall-policies describe \
   $prefix-example --global

예상 출력 (출력의 시작 부분까지 스크롤):

---
associations:
- attachmentTarget: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/fwpolicy-vpc1
  name: fwpolicy-vpc1-association
...

6. IAM 적용 태그

태그는 조직, 폴더 또는 프로젝트에 연결할 수 있는 키-값 쌍입니다. 자세한 내용은 태그 만들기 및 관리필수 권한을 참고하세요.

tagAdmin 역할을 사용하면 새 태그를 만들고 기존 태그를 업데이트 및 삭제할 수 있습니다. 조직 관리자가 이 역할을 부여할 수 있습니다. Cloud Shell에서 IAM 정책을 업데이트하여 사용자에게 tagAdmin 역할을 추가합니다. 권한 참조 페이지를 사용하여 사전 정의된 각 역할에 포함된 권한을 확인합니다.

gcloud organizations add-iam-policy-binding $org_id \
  --member user:[user@example.com] --role roles/resourcemanager.tagAdmin

아래 명령어를 실행하여 resourcemanager.tagAdmin 역할을 가진 사용자를 확인하세요.

gcloud organizations get-iam-policy $org_id --flatten=bindings \
  --filter=bindings.role:roles/resourcemanager.tagAdmin

새 태그 키 만들기:

gcloud resource-manager tags keys create tags-vpc1 \
   --parent organizations/$org_id \
   --purpose GCE_FIREWALL \
   --purpose-data network=$project_id/$prefix-vpc1

예상 출력:

Waiting for TagKey [tags-vpc1] to be created...done.                                                                                                                
createTime: '2022-09-23T20:49:01.162228Z'
etag: PwvmFuHO4wK1y6c5Ut2n5w==
name: tagKeys/622132302133
namespacedName: ORGANIZATION_ID/tags-vpc1
parent: organizations/ORGANIZATION_ID
purpose: GCE_FIREWALL
purposeData:
  network: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/6749205358365096383
shortName: tags-vpc1
updateTime: '2022-09-23T20:49:03.873776Z'

새 태그 값을 만듭니다.

gcloud resource-manager tags values create web-servers \
   --parent=$org_id/tags-vpc1

gcloud resource-manager tags values create web-clients \
   --parent=$org_id/tags-vpc1

태그 값이 성공적으로 생성되었는지 확인합니다.

gcloud resource-manager tags values list \
   --parent=$org_id/tags-vpc1

예상 출력:

NAME                    SHORT_NAME   DESCRIPTION
tagValues/349564376683  web-servers
tagValues/780363571446  web-clients

Cloud Shell에서 기존 네트워크 방화벽 정책 규칙을 설명하여 태그가 사용되고 있지 않은지 확인합니다.

gcloud compute network-firewall-policies rules describe 500 \
    --firewall-policy $prefix-example \
    --global-firewall-policy

예상 출력:

---
action: allow
description: allow-web
direction: INGRESS
disabled: false
enableLogging: true
kind: compute#firewallPolicyRule
match:
  layer4Configs:
  - ipProtocol: tcp
    ports:
    - '80'
  - ipProtocol: tcp
    ports:
    - '443'
  srcIpRanges:
  - 10.0.0.0/16
priority: 500
ruleTupleCount: 5

Cloud Shell에서 vpc1-tags/web-clients 태그 키의 트래픽만 허용하도록 규칙을 업데이트하고 vpc1-tags/web-servers 태그 키가 있는 인스턴스에 규칙을 설치합니다.

gcloud compute network-firewall-policies rules update 500 \
    --firewall-policy $prefix-example \
    --src-secure-tags $org_id/tags-vpc1/web-clients \
    --target-secure-tags $org_id/tags-vpc1/web-servers \
    --global-firewall-policy

Cloud Shell에서 기존 네트워크 방화벽 정책 규칙을 설명하여 태그가 성공적으로 적용되었고 EFFECTIVE로 보고되었는지 확인합니다.

gcloud compute network-firewall-policies rules describe 500 \
    --firewall-policy $prefix-example \
    --global-firewall-policy

예상 출력:

---
action: allow
description: allow-web
direction: INGRESS
disabled: false
enableLogging: false
kind: compute#firewallPolicyRule
match:
  layer4Configs:
  - ipProtocol: tcp
    ports:
    - '80'
  - ipProtocol: tcp
    ports:
    - '443'
  srcIpRanges:
  - 10.0.0.0/16
  srcSecureTags:
  - name: tagValues/479619031616
    state: EFFECTIVE
priority: 500
ruleTupleCount: 7
targetSecureTags:
- name: tagValues/230424970229
  state: EFFECTIVE

Cloud Shell에서 규칙이 vpc1에 적용되었는지 확인해 보겠습니다.

gcloud compute networks get-effective-firewalls $prefix-vpc1

예상 출력:

network-firewall-policy  fwpolicy-example      500         ALLOW      INGRESS    10.0.0.0/16
network-firewall-policy  fwpolicy-example      2147483645  GOTO_NEXT  INGRESS    ::/0
network-firewall-policy  fwpolicy-example      2147483647  GOTO_NEXT  INGRESS    0.0.0.0/0
network-firewall-policy  fwpolicy-example      2147483644  GOTO_NEXT  EGRESS     ::/0
network-firewall-policy  fwpolicy-example      2147483646  GOTO_NEXT  EGRESS     0.0.0.0/0

네트워크 방화벽 정책이 여전히 VPC 네트워크에 연결되어 있더라도 태그가 인스턴스에 추가되지 않았으므로 웹 트래픽을 허용하는 규칙이 웹 서버에 더 이상 적용되지 않는지 확인합니다.

gcloud compute instances network-interfaces \
   get-effective-firewalls $prefix-vpc1-www --zone $zone

예상되는 출력 (우선순위가 500인 방화벽 규칙은 표시되지 않음):

network-firewall-policy  fwpolicy-example      2147483645  GOTO_NEXT  INGRESS    ::/0
network-firewall-policy  fwpolicy-example      2147483647  GOTO_NEXT  INGRESS    0.0.0.0/0
network-firewall-policy  fwpolicy-example      2147483644  GOTO_NEXT  EGRESS     ::/0
network-firewall-policy  fwpolicy-example      2147483646  GOTO_NEXT  EGRESS     0.0.0.0/0

특정 태그 및 사용자에게 태그 사용자 역할을 부여합니다. 권한 참조 페이지를 사용하여 사전 정의된 각 역할에 포함된 권한을 확인합니다.

gcloud resource-manager tags keys add-iam-policy-binding \
  $org_id/tags-vpc1 \
  --member user:[email] --role roles/resourcemanager.tagUser

gcloud projects add-iam-policy-binding $project_id \
  --member user:[email] --role roles/resourcemanager.tagUser

역할이 성공적으로 추가되었는지 확인합니다.

gcloud resource-manager tags keys get-iam-policy $org_id/tags-vpc1

gcloud projects get-iam-policy $project_id --flatten=bindings \
   --filter=bindings.role:roles/resourcemanager.tagUser

예상 출력:

bindings:
- members:
  - user:[user]
  role: roles/resourcemanager.tagUser
...

fwpolicy-vpc1-www 인스턴스에 태그를 적용합니다.

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

예상 출력:

Waiting for TagBinding for parent [//compute.googleapis.com/projects/PROJECT_ID/zones/us-central1-a/instances/38369703403698502] and tag value [tagValues/34
9564376683] to be created with [operations/rctb.us-central1-a.6144808968019372877]...done.                                                                            
done: true
metadata:
  '@type': type.googleapis.com/google.cloud.resourcemanager.v3.CreateTagBindingMetadata
name: operations/rctb.us-central1-a.6144808968019372877
response:
  '@type': type.googleapis.com/google.cloud.resourcemanager.v3.TagBinding
  name: tagBindings/%2F%2Fcompute.googleapis.com%2Fprojects%2FPROJECT_NUMBER%2Fzones%2Fus-central1-a%2Finstances%2F38369703403698502/tagValues/349564376683
  parent: //compute.googleapis.com/projects/PROJECT_NUMBER/zones/us-central1-a/instances/38369703403698502
  tagValue: tagValues/349564376683

바인딩을 확인합니다.

gcloud resource-manager tags bindings list --location $zone --effective --parent //compute.googleapis.com/projects/$project_id/zones/$zone/instances/$prefix-vpc1-www 

예상 출력:

namespacedTagKey: ORGANIZATION_ID/tags-vpc1
namespacedTagValue: ORGANIZATION_ID/tags-vpc1/web-servers
tagKey: tagKeys/622132302133
tagValue: tagValues/349564376683

유효 방화벽 규칙을 다시 확인합니다.

gcloud compute instances network-interfaces \
   get-effective-firewalls $prefix-vpc1-www --zone $zone

예상 출력:

network-firewall-policy  fwpolicy-example      490         ALLOW      INGRESS    10.0.0.0/16
network-firewall-policy  fwpolicy-example      2147483645  GOTO_NEXT  INGRESS    ::/0
network-firewall-policy  fwpolicy-example      2147483647  GOTO_NEXT  INGRESS    0.0.0.0/0
network-firewall-policy  fwpolicy-example      2147483644  GOTO_NEXT  EGRESS     ::/0
network-firewall-policy  fwpolicy-example      2147483646  GOTO_NEXT  EGRESS     0.0.0.0/0

fwpolicy-vpc1-client SSH 세션 탭으로 다시 전환하고 다음과 같이 curl을 시도합니다.

user@fwpolicy-vpc1-client$ curl fwpolicy-vpc1-www --connect-timeout 2

연결되셨나요?

이를 확인하려면 Cloud Shell을 통해 소스 CIDR 기준을 삭제하도록 규칙을 업데이트합니다.

gcloud compute network-firewall-policies rules update 500 \
    --firewall-policy $prefix-example \
    --src-ip-ranges "" \
    --global-firewall-policy

gcloud compute network-firewall-policies rules describe 500 \
    --firewall-policy $prefix-example \
    --global-firewall-policy

action: allow
description: allow-web
direction: INGRESS
disabled: false
enableLogging: false
kind: compute#firewallPolicyRule
match:
  layer4Configs:
  - ipProtocol: tcp
    ports:
    - '80'
  - ipProtocol: tcp
    ports:
    - '443'
  srcSecureTags:
  - name: tagValues/479619031616
    state: EFFECTIVE
priority: 490
ruleTupleCount: 7
targetSecureTags:
- name: tagValues/230424970229
  state: EFFECTIVE

fwpolicy-vpc1-client SSH 세션 탭으로 다시 전환하고 다시 시도합니다.

user@fwpolicy-vpc1-client$ curl fwpolicy-vpc1-www --connect-timeout 2

fwpolicy-vpc1-client에 태그가 추가되지 않았으므로 이번에는 연결 시간이 초과됩니다. Cloud Shell에서 추가한 후 다시 시도해 보세요.

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

fwpolicy-vpc1-client SSH 세션 탭으로 다시 전환하고 다시 시도하면 이제 성공합니다.

user@fwpolicy-vpc1-client$ curl fwpolicy-vpc1-www --connect-timeout 2

7. VPC 네트워크 피어링을 통한 IAM 관리 태그

Cloud Shell에서 새 VPC, 서브넷, 클라이언트를 만들고 네트워크 간에 VPC 네트워크 피어링을 설정합니다.

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

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

gcloud compute instances create $prefix-vpc2-client \
   --subnet=$prefix-vpc2-subnet --no-address --zone $zone

gcloud compute networks peerings create vpc1-to-vpc2 \
   --network=$prefix-vpc1 \
   --peer-project $project_id \
   --peer-network $prefix-vpc2

gcloud compute networks peerings create vpc2-to-vpc1 \
    --network=$prefix-vpc2 \
    --peer-project $project_id \
    --peer-network $prefix-vpc1

IAP 설정의 일부로 아직 정의되지 않은 경우 IAP 범위의 인그레스 SSH 트래픽을 허용하는 방화벽 규칙을 만듭니다.

gcloud compute firewall-rules create allow-ssh-ingress-from-iap-vpc2 \
  --direction=INGRESS \
  --action=allow \
  --network=$prefix-vpc2 \
  --rules=tcp:22 \
  --source-ranges=35.235.240.0/20

태그는 조직 전체 객체이지만 태그 키는 특정 VPC에 연결되므로 다른 네트워크의 인스턴스에 적용할 수 없습니다. 따라서 vpc2에 적용 가능한 새 태그 키와 값을 만들어야 합니다.

gcloud resource-manager tags keys create tags-vpc2 \
   --parent organizations/$org_id \
   --purpose GCE_FIREWALL \
   --purpose-data network=$project_id/$prefix-vpc2

gcloud resource-manager tags values create web-clients \
   --parent=$org_id/tags-vpc2

새 태그를 fwpolicy-vpc2-client 인스턴스에 적용합니다.

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

필요한 경우 fwpolicy-vpc2-client의 결합을 나열합니다.

gcloud resource-manager tags bindings list --location $zone --effective --parent //compute.googleapis.com/projects/$project_id/zones/$zone/instances/$prefix-vpc2-client

예상 출력:

namespacedTagKey: ORGANIZATION_ID/tags-vpc2
namespacedTagValue: ORGANIZATION_ID/tags-vpc2/web-clients
tagKey: tagKeys/916316350251
tagValue: tagValues/633150043992

Cloud Shell에서 기존 네트워크 방화벽 정책 규칙을 설명하여 새 태그가 사용되지 않는지 확인합니다.

gcloud compute network-firewall-policies rules describe 500 \
    --firewall-policy $prefix-example \
    --global-firewall-policy

예상 출력:

---
action: allow
description: allow-web
direction: INGRESS
disabled: false
enableLogging: true
kind: compute#firewallPolicyRule
match:
  layer4Configs:
  - ipProtocol: tcp
    ports:
    - '80'
  - ipProtocol: tcp
    ports:
    - '443'
  srcSecureTags:
  - name: tagValues/479619031616
    state: EFFECTIVE
priority: 500
ruleTupleCount: 6
targetSecureTags:
- name: tagValues/230424970229
  state: EFFECTIVE

피어링된 VPC 네트워크의 태그를 허용하도록 기존 방화벽 규칙을 업데이트합니다.

gcloud compute network-firewall-policies rules update 500 \
    --firewall-policy $prefix-example \
    --src-secure-tags $org_id/tags-vpc1/web-clients,$org_id/tags-vpc2/web-clients \
    --global-firewall-policy

방화벽 규칙을 설명하여 규칙이 성공적으로 적용되었고 EFFECTIVE로 보고되었는지 확인합니다.

gcloud compute network-firewall-policies rules describe 500 \
    --firewall-policy $prefix-example \
    --global-firewall-policy

예상 출력:

---
action: allow
description: allow-web
direction: INGRESS
disabled: false
enableLogging: false
kind: compute#firewallPolicyRule
match:
  layer4Configs:
  - ipProtocol: tcp
    ports:
    - '80'
  - ipProtocol: tcp
    ports:
    - '443'
  srcSecureTags:
  - name: tagValues/479619031616
    state: EFFECTIVE
  - name: tagValues/633150043992
    state: EFFECTIVE
priority: 500
ruleTupleCount: 7
targetSecureTags:
- name: tagValues/230424970229
  state: EFFECTIVE

아래 gcloud 명령어를 통해 fwpolicy-vpc1-www의 IP를 확인합니다.

gcloud compute instances list --filter=vpc1-www

SSH를 통해 fwpolicy-vpc2-client에 연결하고 fwpolicy-vpc1의 IP에 curl을 수행합니다.

user@fwpolicy-vpc2-client$ curl [fwpolicy-vpc1-www_IP] --connect-timeout 2

fwpolicy-vpc1-www 서버에 연결할 수 있습니다. 삭제 단계는 다음 섹션으로 진행합니다.

8. 정리 단계

Cloud Shell에서 인스턴스, Cloud NAT, Cloud Router를 삭제합니다.

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

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

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

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

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

전역 네트워크 방화벽 정책 및 태그를 삭제합니다.

gcloud -q resource-manager tags values delete \
   $org_id/tags-vpc2/web-clients

gcloud -q resource-manager tags keys delete $org_id/tags-vpc2

gcloud -q resource-manager tags values delete \
   $org_id/tags-vpc1/web-servers

gcloud -q resource-manager tags values delete \
   $org_id/tags-vpc1/web-clients

gcloud -q resource-manager tags keys delete $org_id/tags-vpc1

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

gcloud -q compute network-firewall-policies delete \
   $prefix-example --global

gcloud -q compute firewall-rules delete allow-ssh-ingress-from-iap-vpc1

gcloud -q compute firewall-rules delete allow-ssh-ingress-from-iap-vpc2

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

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

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

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

gcloud -q compute networks peerings delete vpc1-to-vpc2 \
    --network $prefix-vpc1

gcloud -q compute networks peerings delete vpc2-to-vpc1 \
    --network $prefix-vpc2

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

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

gcloud -q compute networks delete $prefix-vpc1

gcloud -q compute networks delete $prefix-vpc2

9. 축하합니다.

수고하셨습니다. 태그 구성을 사용하여 전역 네트워크 방화벽 정책을 구성하고 검증했습니다.