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

1. מבוא

מדיניות חומת אש בין רשתות

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

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

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

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

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

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

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

  • כלל תעבורת נתונים יוצאת (egress) שהפעולה שלו היא allow והיעד שלו הוא 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'.

מה תפַתחו

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

b9acf9823df8be04.jpeg

מה תלמדו

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

מה צריך להכין

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

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

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

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

ב-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 Network

יוצרים את 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 כפי שמתואר בתחילת הקטע הזה), וכל תעבורת הנתונים הנכנסת נדחית כברירת מחדל, מכונות הלקוח לא יוכלו לגשת לשרתי האינטרנט הרלוונטיים. כדי לוודא שהבקשה תסתיים בזמן קצוב, פותחים חלון חדש ומפעילים סשן SSH למכונה fwpolicy-vpc1-client ומנסים להריץ את הפקודה curl בשרת האינטרנט:

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-client ומנסים שוב להריץ את 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, מתארים את הכלל הקיים של מדיניות חומת האש ברשת כדי לוודא שהתגים הוחלו בהצלחה ומדווחים כתקפים:

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

חוזרים לכרטיסייה של סשן ה-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 שכנות

ב-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

יוצרים כלל של חומת אש שמאפשר תעבורת נתונים נכנסת (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

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

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 ומנסים להריץ את הפקודה curl על כתובת ה-IP של fwpolicy-vpc1:

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

אמורה להיות לכם אפשרות להתחבר לשרת fwpolicy-vpc1-www. עוברים לקטע הבא כדי לקרוא את השלבים לניקוי.

8. שלבי הניקוי

מסירים את המכונות, את Cloud NAT ואת Cloud Router מ-Cloud Shell:

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 שכנות (peering), את רשתות המשנה ואת רשתות ה-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. מעולה!

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