אבטחת תעבורת נתונים נכנסת (ingress) של Cloud Run

1. סקירה כללית

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

5aed47d10595c878.png

הגדרות של תעבורת נתונים נכנסת (ingress)

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

מדיניות IAM

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

בשיעור ה-Lab הזה תלמדו איך ומתי להשתמש בהגדרות של Ingress.

מארחים מקומיים מתחברים דרך ה-VPC

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

31611f6a2f12fd0c.png

הדמיה של עומס עבודה מקומי באמצעות שרת קפיצה ב-VPC

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

aebf22740c7a84f0.png

למכונה הווירטואלית של Compute Engine שתשמש כשרת מעבר יש את אותו מקור רשת כמו ל-Cloud VPN Gateway, ולכן אפשר להשתמש בה כדי לדמות שליחת בקשות מעומס עבודה מקומי.

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

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

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

b35bf95b8bf3d5d8.pnga99b7ace416376c4.pngbd84a6d3004737c5.png

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

הגדרת הסביבה

  1. מגדירים משתנה סביבה למזהה הפרויקט כדי להשתמש בו בפקודות מאוחרות יותר:
export PROJECT_ID=$(gcloud config get-value project)
export REGION=us-central1
export ZONE=us-central1-a
  1. מפעילים את ממשקי ה-API שנדרשים כדי לבצע את ה-Lab הזה.
gcloud services enable \
  run.googleapis.com \
  cloudbuild.googleapis.com \
  compute.googleapis.com \
  artifactregistry.googleapis.com
  1. משכפלים את מאגר האפליקציה לדוגמה ועוברים לספרייה
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git

cd cymbal-eats/partner-registration-service
  1. הגדרת אזור ותחום ברירת מחדל ל-Compute Engine ול-Cloud Run
gcloud config set compute/region ${REGION}
gcloud config set run/region ${REGION}
gcloud config set compute/zone ${ZONE}

3. פריסת השירות

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

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

  • מיקום קוד המקור (...): מוודאים שאתם בספרייה partner-registration-service ומקישים על Enter כדי לאשר את ברירת המחדל
  • שם השירות (partner-registration-service): לוחצים על Enter כדי לאשר את ברירת המחדל
  • האם לאפשר הפעלות לא מאומתות של [partner-registration-service] (y/N)? Y
gcloud run deploy 

בסיום הפקודה, כתובת ה-URL של שירות Cloud Run מופיעה. הפלט ייראה בערך כך:

Service [partner-registration-service] revision [partner-registration-service-00001-haz] has been deployed and is serving 100 percent of traffic.
Service URL: https://partner-registration-service-ssssssssss-uc.a.run.app

פותחים את כתובת ה-URL של השירות בדפדפן. הפלט שיוצג יהיה:

Partner registration service: RUNNING

הגדרת השירות כך שיאפשר רק בקשות פנימיות

עכשיו משתמשים בהגדרות של תעבורת נתונים נכנסת (ingress) בשירות Cloud Run כדי לאפשר רק בקשות ממקורות פנימיים. מקורות פנימיים כוללים משאבים ברשתות VPC שנמצאים באותו פרויקט (או באותו מתחם היקפי של VPC Service Controls) כמו שירות Cloud Run – מה שהופך אותו למושלם לתרחיש השימוש שלנו.

בנוסף, בקשות ממוצרים אחרים של Google Cloud נחשבות פנימיות, גם אם הן לא חלק מה-VPC. דוגמאות למוצרים כאלה: Pub/Sub ו-Workflows.

בקשות מהמקורות האלה נשארות ברשת של Google, גם אם הן ניגשות לשירות שלכם בכתובת ה-URL run.app, והגישה הציבורית אסורה.

מעדכנים את השירות כך שיאפשר רק בקשות פנימיות:

gcloud run services update partner-registration-service --ingress=internal

אם פותחים שוב את כתובת ה-URL של השירות, מופיעה ההודעה Error: Forbidden - Access is forbidden (שגיאה: אסור – הגישה אסורה).

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

4. יצירת מכונה וירטואלית ב-Compute Engine כשרת מעבר

השלב הבא הוא לדמות בקשות משרת מקומי דרך שער Cloud VPN, על ידי יצירת מופע Compute Engine ב-VPC לשימוש כשרת מעבר:

gcloud compute instances create jump-server --scopes=https://www.googleapis.com/auth/cloud-platform

הפלט של הפקודה הזו אמור להיראות כך:

NAME         ZONE           MACHINE_TYPE   PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP   STATUS
jump-server  us-central1-a  n1-standard-1               10.128.0.10  34.170.108.8  RUNNING

שליחת בקשה ממכונת Compute Engine לשירות

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

אם הפקודה הבאה מבקשת להגדיר SSH ב-Cloud Shell, פועלים לפי ההוראות:

gcloud compute ssh jump-server

מריצים את הפקודה הבאה כדי לקבל את כתובת ה-URL של שירות Cloud Run:

gcloud run services describe partner-registration-service --region us-central1

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

✔ Service partner-registration-service in region us-central1

URL:     https://partner-registration-service-ssssssssss-uc.a.run.app
Ingress: internal

עכשיו מעתיקים את כתובת ה-URL ושולחים בקשה מהמכונה של Compute Engine באמצעות curl. הבקשה הזו אמורה להצליח, כי המכונה הווירטואלית פועלת ברשת ה-VPC של הפרויקט – זהו מקור פנימי.

export SERVICE_URL=https://

curl ${SERVICE_URL}

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

Partner registration service: RUNNING

5. מה לגבי בקרת גישה שמבוססת על IAM?

בשיעור ה-Lab הזה למדתם איך ומתי להשתמש בהגדרות של תעבורת נכנסת. הגדרות Ingress הן התחלה מצוינת אם אתם מחברים עומס עבודה מקומי ל-Cloud Run.

בקרת גישה שמבוססת על IAM דורשת יותר מאמץ להטמעה, במיוחד אם אתם מתקשרים ממארח מקומי:

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

‫Google ממליצה על גישה רב-שכבתית לבקרת גישה. שימוש בהגדרות של תעבורת נכנסת כדי להגביל את הגישה רק למארחים פנימיים הוא התחלה מצוינת, אבל אל תעצרו שם!

6. מעולה!

כל הכבוד, סיימתם את ה-Codelab!

השלב הבא:

כדאי לעיין במדריכי Codelab נוספים של Cymbal Eats:

הסרת המשאבים

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

מחיקת הפרויקט

הדרך הקלה ביותר לבטל את החיוב היא למחוק את הפרויקט שיצרתם בשביל המדריך.

מקורות מידע שימושיים

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