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

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

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

5aed47d10595c878.png

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

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

מדיניות IAM

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

בשיעור ה-Lab הזה תלמדו איך משתמשים בהגדרות של תעבורת נתונים נכנסת (ingress) ומתי כדאי לעשות זאת.

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

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

31611f6a2f12fd0c.png

הדמיה של עומס עבודה מקומי באמצעות שרת מעבר (jump server) ב-VPC

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

aebf22740c7a84f0.png

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

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

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

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

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • שם הפרויקט הוא השם המוצג של המשתתפים בפרויקט. זוהי מחרוזת תווים שלא משמשת את Google APIs. אפשר לעדכן את המיקום הזה בכל שלב.
  • מזהה הפרויקט הוא ייחודי לכל הפרויקטים ב-Google Cloud ואי אפשר לשנות אותו אחרי שמגדירים אותו. מסוף Cloud יוצר מחרוזת ייחודית באופן אוטומטי. בדרך כלל לא משנה מה המחרוזת הזו. ברוב ה-codelabs תצטרכו להפנות למזהה הפרויקט (בדרך כלל הוא מזוהה בתור PROJECT_ID). אם המזהה שנוצר לא מוצא חן בעיניכם, תוכלו ליצור מזהה אקראי אחר. לחלופין, אפשר לנסות שם משלכם ולבדוק אם הוא זמין. לא ניתן לשנות את השם אחרי השלב הזה, והוא יישאר למשך כל תקופת הפרויקט.
  • לידיעתכם, יש ערך שלישי, מספר פרויקט, שחלק מממשקי ה-API משתמשים בו. מידע נוסף על כל שלושת הערכים האלה זמין במסמכי העזרה.
  1. בשלב הבא, תצטרכו להפעיל את החיוב במסוף 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 הנדרשים לביצוע התרגיל.
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 כשרת מעבר (jump server)

בשלב הבא, כדי לדמות בקשות משרת מקומי דרך שער Cloud VPN, יוצרים מכונה של Compute Engine ב-VPC לשימוש כשרת מעבר (jump server):

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). הגדרות Ingress הן התחלה מצוינת אם אתם מחברים עומס עבודה מקומי ל-Cloud Run.

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

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

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

6. מעולה!

כל הכבוד, סיימת את הקודלאב!

השלב הבא:

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

הסרת המשאבים

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

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

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

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

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