מדיניות גלובלית של חומת אש ברשת עם תגים

1. מבוא

כללי המדיניות של חומת האש של הרשת

חומות אש הן אבני הבניין הבסיסיות לסביבת ענן מאובטחת. בעבר, השקנו מדיניות חומת אש ברמת הארגון וברמת התיקייה, והשארנו את חומות האש של VPC ללא שינוי. בגרסה הזו נרחיב את המבנה של מדיניות חומת האש לרמת ה-VPC, ונבצע כמה שיפורים בתמיכה הנוכחית במדיניות חומת האש, כדי לספק תמיכה מאוחדת בחומת האש בכל היררכיית המשאבים של Google Cloud, וחוויית משתמש עקבית בניהול השליטה במדיניות חומת האש, באופן מאובטח, גמיש וניתנת להתאמה.

מדיניות חומת האש של הרשת משמשת כמאגר כללי של חומת האש. כללים שמוגדרים במדיניות חומת אש של רשת לא נאכפים בשום מקום עד שהמדיניות משויכת לרשת VPC. לכל רשת VPC יכולה להיות מדיניות חומת אש אחת של רשת המשויכת אליה. כללי המדיניות של חומת האש ברשת תומכים בתגים שמנוהלים על ידי IAM (או רק תגים) בכללי חומת אש. הם מחליפים את תגי הרשת הנוכחיים ואפשר להשתמש בהם כדי לספק זהות לעומס העבודה.

שיתוף מדיניות של חומת אש בין רשתות בין רשתות והשילוב עם תגים שמנוהלים על ידי IAM, מפשטים מאוד את ההגדרה והניהול של חומות אש.

בעקבות ההשקה של מדיניות חומת האש ברשת, כללי מדיניות חומת האש של Google Cloud כוללים עכשיו את הרכיבים הבאים:

  1. מדיניות היררכית בנושא חומת אש
  2. כללי חומת אש של VPC
  3. מדיניות חומת האש של הרשת ( גלובלית ואזורית)

מדיניות חומת אש היררכית נתמכת בצמתים של הארגון והתיקיות בהיררכיית המשאבים, ואילו כללי חומת אש של VPC וכללי מדיניות של חומת אש ברשת חלים ברמת ה-VPC. הבדל גדול בין כללי חומת אש של VPC למדיניות חומת האש של הרשת הוא שאפשר להחיל כללי חומת אש של VPC רק על רשת VPC אחת. לעומת זאת, כללי מדיניות של חומת אש של רשת יכולים להיות מצורפים ל-VPC יחיד או לקבוצה של רשתות VPC, בין שאר היתרונות כמו עדכון בכמות גדולה.

לבסוף, יש לנו גם את כללי חומת האש המשתמעים שמגיעים לכל רשת VPC:

  • כלל לתעבורת נתונים יוצאת (egress) שהפעולה שלו היא מותרת, היעד הוא 0.0.0.0/0
  • כלל תעבורת נתונים נכנסת (ingress) שהפעולה שלו היא דחייה, המקור הוא 0.0.0.0/0

כברירת מחדל, רצף האכיפה מוצג בתרשים הבא:

abae4597af782b2b.png

שימו לב שניתן להחליף את צו האכיפה בין כללי חומת האש של ה-VPC למדיניות חומת האש של הרשת הגלובלית. הלקוחות יכולים לציין את צו האכיפה בכל שלב באמצעות פקודת gcloud.

תגים

התגים החדשים שמשולבים בכללי מדיניות חומת האש ברשת הם משאבים צמדי מפתח-ערך שמוגדרים ברמת הארגון בהיררכיית המשאבים של Google Cloud. תג כזה מכיל בקרת גישה של IAM, כפי שמרמז השם, שמציין מי יכול לבצע מה בתג. הרשאות IAM, למשל, מאפשרות לציין אילו חשבונות משתמשים יכולים להקצות ערכים לתגים ואילו חשבונות משתמשים יכולים לצרף תגים למשאבים. אחרי שמחילים תג על משאב, כללי חומת האש של הרשת יכולים להשתמש בו כדי לאשר ולדחות תנועה.

התגים פועלים בהתאם למודל משאבי הירושה של Google Cloud, והמשמעות היא התגים והערכים שלהם מועברים הלאה בהיררכיה מההורים שלהם. כתוצאה מכך, ניתן ליצור תגים במקום אחד ולאחר מכן להשתמש בתיקיות ובפרויקטים אחרים בהיררכיית המשאבים. פרטים נוספים על תגים והגבלת הגישה זמינים בדף הזה.

חשוב להבדיל בין תגים לבין תגי רשת. אלה מחרוזות שאפשר להוסיף למכונות של Compute Engine. הם משויכים למכונה ונעלמים כשמוציאים משימוש את המכונה. כללי חומת האש של VPC עשויים לכלול תגי רשת, אבל מאחר שהם לא נחשבים למשאבי ענן, הם לא כפופים לבקרת הגישה ל-IAM.

לתשומת ליבך: במסמך הזה נעשה שימוש לסירוגין בתגים ובתגים שמנוהלים על ידי IAM.

מה תפַתחו

ה-Codelab הזה כולל שני חלקים – החלק הראשון מציג את מדיניות חומת האש של הרשת ותגים באמצעות רשת VPC יחידה, והשני יראה איך להשתמש בתגים בין רשתות VPC שכנות (peering), לפי התרשים הבא. לכן, ב-Codelab הזה נדרשים פרויקט יחיד ויכולת ליצור מספר רשתות VPC.

b9acf9823df8be04.jpeg

מה תלמדו

  • איך יוצרים מדיניות של חומת אש ברשת
  • איך יוצרים תגים עם מדיניות של חומת אש ברשת ומשתמשים בהם
  • איך משתמשים בתגים באמצעות קישור בין רשתות VPC שכנות (peering)

מה צריך להכין

  • פרויקט ב-Google Cloud
  • ידע בפריסת מכונות ובהגדרת רכיבי רשת
  • מידע על הגדרת חומת אש ב-VPC

2. לפני שמתחילים

יצירה/עדכון של משתנים

ב-Codelab הזה נעשה שימוש ב-$variables כדי לעזור בהטמעת ההגדרות של gcloud ב-Cloud Shell.

Inside 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

יוצרים את שערי Cloud Routers ו-Cloud NAT ל-fwpolicy-pc1:

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. יצירת מכונות

יוצרים כלל של חומת אש שמאפשר תעבורת נתונים נכנסת (ingress) של SSH מטווחי ה-IAP, במקרה שהיא עדיין לא הוגדרה כחלק מהגדרת ה-IAP:

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:

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

לא הוגדרו כללי חומת אש של VPC (פרט לכלל ההרשאה ל-SSH שהיה צריך ליצור כשהגדרתם IAP בתחילת הקטע הזה), וכברירת מחדל כל תעבורת הנתונים הנכנסת (ingress) נדחית, המכונות של הלקוח לא יכולות לגשת לשרתי האינטרנט הרלוונטיים. כדי לוודא שהזמן הקצוב לתפוגה של הבקשה יפוג, פותחים חלון חדש, מתחילים סשן SSH למכונה fwpolicy-vpc1-client ומנסים לאתחל את שרת האינטרנט:

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

הפלט אמור להיראות כך:

curl: (28) Connection timed out after 2001 milliseconds

אפשר גם לוודא שאין כללי חומת אש של VPC שמוגדרים עבור fwpolicy-vpc1 דרך Cloud Shell:

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 חומות אש בפועל):

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

חוזרים לסשן SSH של לקוח vpc1 לקוח ומנסים ל-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 מאפשר ליצור תגים חדשים, לעדכן ולמחוק תגים קיימים. מנהל חשבון ארגוני יכול להקצות את התפקיד הזה. מעדכנים את מדיניות IAM ב-Cloud Shell כדי להוסיף את תפקיד ה-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

מעדכנים את הכלל כך שיאפשר תנועה רק ממפתח התג 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

עכשיו נוודא שהכלל הוחל על vpc1 ב-Cloud Shell:

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

מקצים את התפקיד Tag User (משתמש ב-Tag) לתג ולמשתמש הספציפיים. בדף חומר העזר בנושא הרשאות תוכלו לראות אילו הרשאות נכללות בכל תפקיד מוגדר מראש.

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

חוזרים לכרטיסיית סשן ה-SSH fwpolicy-vpc1-client ומנסים לבצע curl:

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

הצלחת להתחבר?

כדי לוודא זאת, מעדכנים את הכלל כדי להסיר את הקריטריונים של ה-CIDR של המקור דרך Cloud Shell.

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

חוזרים לכרטיסיית סשן SSH באמצעות fwpolicy-vpc1-client ומנסים שוב:

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

חוזרים לכרטיסיית סשן ה-SSH fwpolicy-vpc1-client ומנסים שוב. הפעולה הזו אמורה להצליח.

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

7. תגים בניהול IAM באמצעות קישור בין רשתות VPC שכנות (peering)

באמצעות Cloud Shell, יוצרים VPC חדש, תת-רשת ולקוח, ומגדירים קישור בין רשתות VPC שכנות (peering) בין הרשתות:

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

יוצרים כלל של חומת אש שמאפשר תעבורת נתונים נכנסת (ingress) של SSH מטווחי ה-IAP, במקרה שהיא עדיין לא הוגדרה כחלק מהגדרת ה-IAP:

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

תוכלו לבדוק מה כתובת ה-IP של fwpolicy-vpc1-www בעזרת הפקודה של gcloud:

gcloud compute instances list --filter=vpc1-www

מתחברים אל fwpolicy-vpc2-client דרך SSH ומנסים לשנות את כתובת ה-IP של fwpolicy-vpc1:

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. מעולה!

מזל טוב, הגדרת בהצלחה ואימתת בהצלחה את מדיניות חומת האש של הרשת הגלובלית עם הגדרת התגים.