אבטחת תעבורת נתונים נכנסת (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

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

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

aebf22740c7a84f0.png

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

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

הגדרת סביבה בקצב עצמי

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

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.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 של השירות, מופיעה ההודעה שגיאה: אסור – הגישה אסורה

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

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

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

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

6. מעולה!

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

השלב הבא:

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

הסרת המשאבים

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

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

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

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

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