הגנה על מטמון Edge באמצעות Cloud Armor

1. מבוא

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

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

מה תלמדו

  • איך מגדירים קטגוריה של Cloud Storage עם תוכן שניתן לשמור במטמון
  • איך יוצרים מדיניות אבטחה של Edge כדי להגן על התוכן
  • איך מוודאים שמדיניות האבטחה של Edge פועלת כמצופה

מה תצטרכו

  • ידע בסיסי ברשתות ו-HTTP
  • ידע בסיסי בשורת הפקודה של Unix/Linux

‫2. הגדרה ודרישות

הגדרת סביבה בקצב אישי

  1. נכנסים ל-מסוף Google Cloud ויוצרים פרויקט חדש או משתמשים בפרויקט קיים. אם עדיין אין לכם חשבון Gmail או Google Workspace, אתם צריכים ליצור חשבון.

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

  • שם הפרויקט הוא השם המוצג של הפרויקט הזה למשתתפים. זו מחרוזת של תווים שלא נמצאת בשימוש ב-Google APIs, ואפשר לעדכן אותה בכל שלב.
  • מזהה הפרויקט חייב להיות ייחודי בכל הפרויקטים ב-Google Cloud, והוא קבוע (אי אפשר לשנות אותו אחרי שמגדירים אותו). מסוף Cloud יוצר באופן אוטומטי מחרוזת ייחודית. בדרך כלל לא צריך להתייחס אליה. ברוב סדנאות ה-Codelab, צריך להפנות למזהה הפרויקט (ובדרך כלל הוא מזוהה כ-PROJECT_ID), אז אם לא מוצא חן בעיניכם, אפשר ליצור מזהה אקראי אחר, או לנסות מזהה משלכם ולבדוק אם הוא זמין. אחרי שהפרויקט נוצר, הוא 'קפוא'.
  • יש ערך שלישי, מספר פרויקט, שחלק מממשקי ה-API משתמשים בו. במאמרי העזרה מפורט מידע נוסף על שלושת הערכים האלה.
  1. בשלב הבא, תצטרכו להפעיל את החיוב במסוף Cloud כדי להשתמש במשאבי Cloud או בממשקי API. העלות של התרגול הזה לא אמורה להיות גבוהה, ואולי אפילו לא תצטרכו לשלם בכלל. כדי לכבות את המשאבים ולא לחייב אתכם מעבר למה שמוסבר במדריך הזה, צריך לפעול לפי ההוראות לניקוי שמופיעות בסוף ה-Codelab. משתמשים חדשים ב-Google Cloud זכאים לתוכנית תקופת ניסיון בחינם בשווי 300$.

מפעילים את Cloud Shell

אפשר להפעיל את Google Cloud מרחוק מהמחשב הנייד, אבל ב-codelab הזה תשתמשו ב-Google Cloud Shell, סביבת שורת פקודה שפועלת בענן.

ב-GCP Console, לוחצים על סמל Cloud Shell בסרגל הכלים שבפינה הימנית העליונה:

bce75f34b2c53987.png

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

f6ef2b5f13479f3a.png

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

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

ב-Cloud Shell, מוודאים שמזהה הפרויקט מוגדר

gcloud config list project
gcloud config set project [YOUR-PROJECT-NAME]
PROJECT_ID=[YOUR-PROJECT-NAME]
echo $PROJECT_ID

הפעלת ממשקי API

הפעלת כל השירותים הנדרשים

gcloud services enable compute.googleapis.com
gcloud services enable logging.googleapis.com
gcloud services enable monitoring.googleapis.com

‫3. יצירת קטגוריה של Cloud Storage

ב-Cloud Console, עוברים אל תפריט הניווט > Cloud Storage > Browser. לוחצים על CREATE BUCKET (יצירת מאגר):

baf3d3c74282ecba.png

כללים למתן שמות לקטגוריות:

  • שם הקטגוריה לא יכול לכלול מידע רגיש, כי מרחב השמות של הקטגוריות זמין וגלוי לכולם.
  • שמות של קטגוריות יכולים להכיל רק אותיות קטנות, ספרות, מקפים (-), קווים תחתונים (_) ונקודות (.). שמות שמכילים נקודות צריכים אימות.
  • שמות של קטגוריות צריכים להתחיל ולהסתיים בספרה או באות.
  • שמות של קטגוריות צריכים להכיל 3 עד 63 תווים. שמות שמכילים נקודות יכולים להכיל עד 222 תווים, אבל כל רכיב שמופרד באמצעות נקודות יכול להיות באורך של עד 63 תווים.
  • אי אפשר לייצג שמות של קטגוריות ככתובות IP בסימון עם נקודה עשרונית (לדוגמה, 192.168.5.4).
  • שמות של קטגוריות לא יכולים להתחיל בקידומת 'goog'.
  • שמות של קטגוריות לא יכולים להכיל את המילה 'google' או שגיאות איות דומות של 'google'.
  • בנוסף, כדי לעמוד בדרישות של DNS ולשמור על תאימות עתידית, לא מומלץ להשתמש בקווים תחתונים (_) או בנקודה ליד נקודה או מקף אחרים. לדוגמה, '..',‏ '-.' או '.-' הם לא ערכים תקינים בשמות DNS.

לוחצים על המשך.

סוג המיקום: אזור

מיקום: בוחרים אזור רחוק מכם

לוחצים על המשך.

סוג האחסון (storage class) שמוגדר כברירת מחדל: Standard

לוחצים על המשך.

מבטלים את הסימון בתיבה Enforce public access prevention on this bucket (אכיפה של מניעת גישה ציבורית בקטגוריה הזו) בקטע Prevent public access (מניעת גישה ציבורית).

בקטע 'בקרת גישה', בוחרים באפשרות Fine Grained.

לוחצים על המשך.

אחרי שמגדירים את הקטגוריה, לוחצים על יצירה:

זהו, יצרתם קטגוריה של Cloud Storage!

4. העלאת אובייקט לקטגוריה

עכשיו מעלים אובייקט לקטגוריה.

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

מ-Cloud Shell

wget --output-document google.png https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png

משתמשים בפקודה gsutil cp כדי להעלות את התמונה מהמיקום שבו שמרתם אותה אל הקטגוריה שיצרתם:

מ-Cloud Shell

gsutil cp google.png gs://YOUR-BUCKET-NAME

עכשיו מסירים את התמונה שהורדה:

מ-Cloud Shell

rm google.png

מאתרים את האובייקט, לוחצים על סמל האפשרויות הנוספות (3 נקודות) בצד שמאל ועורכים את ההרשאות כך שיהיו ציבוריות.

821aad82d8633922.png

30a975d3ad22d33d.png

5. יצירת מאזן עומסים

בשלב הבא ניצור מאזן עומסים מסוג HTTP.

עוברים אל Networking >> Network services >> Load Balancing >> Create Load Balancer >> HTTP Load Balancer >> Internet to my VMs >> Classic HTTP(S) Load Balancer (רשת >> שירותי רשת >> איזון עומסים >> יצירת מאזן עומסים >> מאזן עומסים ב-HTTP >> אינטרנט למכונות הווירטואליות שלי >> מאזן עומסים קלאסי ב-HTTP(S)).

קודם כול, נותנים שם למאזן העומסים שייווצר.

יצירת קטגוריית קצה עורפי

יוצרים קטגוריית קצה עורפי חדשה שהיא הקטגוריה שיצרתם, ובוחרים באפשרות Enabled CDN (הפעלת CDN) ובאפשרות Cache Static Content (שמירת תוכן סטטי במטמון). לוחצים על 'יצירה'.

ed392a56538d499e.png

יצירת כללים של מארחים ונתיבים

בצד ימין, עוברים אל Host and path rules (כללים לגבי מארח ונתיב). נשתמש בכלל פשוט של מארח/נתיב ונשלח כל בקשה לדלי.

7c1a664e0d1f15b0.png

יצירת הגדרות אישיות של הקצה הקדמי

בוחרים את הגדרות הקצה הקדמי. להגדרת הקצה הקדמי נשתמש ב-HTTP (אבל אפשר להשתמש גם ב-HTTPS אם יש לכם אישור), בכתובת IP זמנית ונוודא שבחרתם ברשת ברמת מסלול הפרימיום.

2597a5e63d618622.png

לוחצים על 'יצירה'.

קבלת כתובת ה-IP של מאזן העומסים

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

9b757362d806e835.png

שליחת שאילתה למאזן העומסים

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

מתוך Terminal

curl -svo /dev/null http://LOAD_BALANCER_IP/google.png

פלט

armanrye-macbookpro% curl -svo /dev/null http://34.98.81.123/google.png
*   Trying 34.98.81.123...
* TCP_NODELAY set
* Connected to 34.98.81.123 (34.98.81.123) port 80 (#0)
> GET /google.png HTTP/1.1
> Host: YOUR_IP
> User-Agent: curl/7.64.1
> Accept: */*
>
< HTTP/1.1 200 OK
< X-GUploader-UploadID: ADPycdtoILI76KVsvBvdVGvSfzaxys1m3zYqCepBrmJxAI48ni24cWCRIdNu-53PX3DS6iycxp6xwFbMpwtcHHZQUQmEBxAgng
< Expires: Mon, 13 Dec 2021 22:58:26 GMT
< Date: Mon, 13 Dec 2021 21:58:26 GMT
< Cache-Control: public, max-age=3600
< Last-Modified: Mon, 13 Dec 2021 21:45:57 GMT
< ETag: "8f9327db2597fa57d2f42b4a6c5a9855"
< x-goog-generation: 1639431957957903
< x-goog-metageneration: 2
< x-goog-stored-content-encoding: identity
< x-goog-stored-content-length: 5969
< Content-Type: image/png
< x-goog-hash: crc32c=TeiHTA==
< x-goog-hash: md5=j5Mn2yWX+lfS9CtKbFqYVQ==
< x-goog-storage-class: STANDARD
< Accept-Ranges: bytes
< Content-Length: 5969
< Server: UploadServer

כדי לוודא שהתוכן מוצג מה-CDN, אפשר להשתמש במעקב אחר CDN או איזון עומסים. אפשר להגיע לשיעור פגיעה של כמעט 100%. אם אתם צריכים להריץ כמה שאילתות, אתם יכולים לפעול לפי השלבים הבאים

מתוך Terminal

#for i in `seq 1 50`; do curl http://%loadbalncer-IP%/google.png; done

אישור התוכן שמוצג על ידי Cloud CDN

כדי לוודא שאתם מציגים טראפיק מ-CDN, עוברים אל Network Services >> CDN.

a52d0ba4c084aa05.png

6. מחיקת האובייקט מ-GCS

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

עוברים אל Cloud Storage >> %bucket name% >> objects

בוחרים את התמונה ומוחקים אותה.

a1cc1bb9a0ff41df.png

7. יצירת מדיניות אבטחה של Edge למטמון CDN

עוברים אל Network Security (אבטחת רשת) >> Cloud Armor ולוחצים על create policy (יצירת מדיניות).

בוחרים באפשרויות הבאות

סוג המדיניות: מדיניות אבטחה של Edge

פעולת ברירת מחדל: דחייה

7a12374be33026fd.png

b7c4efc091272358.png

77ddbcddd07b65d2.png

מחילים את המדיניות על קטגוריית קצה עורפי.

8. אימות מדיניות האבטחה של Edge

אחרי שיצרנו מדיניות אבטחה של Edge לפני מאגר הקצה העורפי, נבדוק שהיא פועלת כמצופה.

בדיקת מדיניות האבטחה

אחרי כמה דקות, תוכלו לוודא שמדיניות Cloud Armor פועלת. אם מריצים את הפקודה הבאה משורת הפקודה, מקבלים את השגיאה 403

מתוך Terminal

curl -svo /dev/null http://LOAD_BALANCER_IP/google.png

פלט

curl -svo /dev/null http://34.98.81.123/google.png
*   Trying 34.98.81.123...
* TCP_NODELAY set
* Connected to 34.98.81.123 (34.98.81.123) port 80 (#0)
> GET /google.png HTTP/1.1
> Host: YOUR_IP
> User-Agent: curl/7.64.1
> Accept: */*
>
< HTTP/1.1 403 Forbidden
< X-GUploader-UploadID: ADPycdtS6FtJOGIsiWYDrAAE8VFeQuNutcvbGoQe2t8EZxsuspVtmCjyiTv_P3CNktroHMOGFXkTCfG-Jj-rUO60ZGPpEbpqcw
< Content-Type: application/xml; charset=UTF-8
< Content-Length: 111
< Date: Mon, 13 Dec 2021 23:09:35 GMT
< Expires: Mon, 13 Dec 2021 23:09:35 GMT
< Cache-Control: private, max-age=0
< Server: UploadServer
<

חקירת היומנים

בשלב הבא אפשר לבדוק את היומנים כדי לראות את מדיניות האבטחה שנאכפת ב-Edge. עוברים אל Operations >> Logging >> Logs Explorer

מזינים את קטע הקוד שלמטה בשאילתה ולוחצים על 'הפעלה'.

14972af5ae6c182a.png

resource.type:(http_load_balancer) AND jsonPayload.enforcedEdgeSecurityPolicy.name:(%SECURITY_POLICY_NAME%)

שימו לב לתגובה 403 ולמדיניות האבטחה שנאכפת

cddc48ca93ad79ca.png

הסרת מדיניות האבטחה

מסירים את מדיניות האבטחה ומבצעים שאילתה על האובייקט מהמטמון.

עוברים אל Network Security >> Cloud Armor >> %POLICY NAME% >> targets ומסירים את דלי היעד.

350655729a89eb33.png

אישור הסרת המדיניות

אחרי כמה דקות, שולחים עוד פקודת curl למשאב בדלי האחסון. במקרה הזה תקבלו תגובה 200.

מתוך Terminal

curl -svo /dev/null http://LOAD_BALANCER_IP/google.png

פלט

armanrye-macbookpro% curl -svo /dev/null http://34.98.81.123/google.png

*   Trying 34.98.81.123...
* TCP_NODELAY set
* Connected to 34.98.81.123 (34.98.81.123) port 80 (#0)
> GET /google.png HTTP/1.1
> Host: YOUR_IP
> User-Agent: curl/7.64.1
> Accept: */*
>
< HTTP/1.1 200 OK
< X-GUploader-UploadID: ADPycdtI7f49P3MSuZSZ8vl6RwfwmnIDJ59EeSKp7UPvLPawdaiRHXiNWLtseQTxUxceWOvSLvpYmT3pWVkV4qeIP7M
< Date: Mon, 13 Dec 2021 23:06:46 GMT
< Last-Modified: Mon, 13 Dec 2021 21:45:57 GMT
< ETag: "8f9327db2597fa57d2f42b4a6c5a9855"
< x-goog-generation: 1639431957957903
< x-goog-metageneration: 2
< x-goog-stored-content-encoding: identity
< x-goog-stored-content-length: 5969
< Content-Type: image/png
< x-goog-hash: crc32c=TeiHTA==
< x-goog-hash: md5=j5Mn2yWX+lfS9CtKbFqYVQ==
< x-goog-storage-class: STANDARD
< Accept-Ranges: bytes
< Content-Length: 5969
< Server: UploadServer
< Age: 1621
< Cache-Control: public,max-age=3600
<
{ [775 bytes data]
* Connection #0 to host 34.98.81.123 left intact
* Closing connection 0

מעולה! סיימתם את שיעור ה-Lab הזה בנושא מדיניות אבטחה של Edge ב-Cloud Armor.

‫©2020 Google LLC כל הזכויות שמורות. Google והלוגו של Google הם סימנים מסחריים רשומים של Google LLC. כל שמות החברות והמוצרים האחרים עשויים להיות סימנים מסחריים של החברות שאליהן הם קשורים.

9. ניקוי מעבדה

עוברים אל Network Security >> Cloud Armor >> %POLICY NAME% ובוחרים באפשרות delete (מחיקה).

21eefb5f375e8fee.png

מנווטים אל Cloud Storage, בוחרים את הקטגוריה שיצרתם ולוחצים על סמל המחיקה.

ef2fa8d45c1d3452.png

עוברים אל Networking >> Network services >> Load Balancing (רשת >> שירותי רשת >> איזון עומסים). בוחרים את מאזן העומסים שיצרתם ולוחצים על 'מחיקה'.

ee2e78c10f4104eb.png

10. מעולה!

סיימתם את ה-Codelab בנושא הגנה על מטמון קצה באמצעות Cloud Armor.

מה נכלל

  • איך מגדירים קטגוריה של אחסון בענן ומאזן עומסים בענן שמשויך אליה
  • איך יוצרים מדיניות אבטחה של Edge ב-Cloud Armor
  • איך מוודאים שמדיניות האבטחה של Edge פועלת כמצופה.

השלבים הבאים

  • נסו להגדיר מדיניות אבטחה של Edge עם פגיעה במטמון ממשאב של Compute Engine.