אפליקציה מאובטחת ללא שרת (serverless) עם שרת proxy לאימות זהויות (IAP)

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

בשיעור ה-Lab הזה תפרסו את פורטל העובדים שמאפשר לעובדים לראות, לעדכן ולמחוק הזמנות מאפליקציית Cymbal Eats. צריך להשתמש בשרת proxy לאימות זהויות (IAP) כדי לאבטח גישה לפורטל בלי להשתמש ברשת וירטואלית פרטית (VPN). שימוש ב-IAP מפשט את ההטמעה של מודל גישה במודל אבטחה של אפס אמון, דורש פחות זמן מאשר שימוש ב-VPN לעובדים מרוחקים, גם בארגון וגם בסביבות ענן, עם נקודת בקרה אחת לניהול הגישה לאפליקציות שלכם.

94b06525c85408ad.png

מהו שרת proxy לאימות זהויות (IAP)?

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

מה תלמדו

  • איך להגדיר קבוצה של נקודות קצה (endpoint) של רשת ללא שרת (NEG)
  • איך להגדיר מאזן עומסים
  • איך להפעיל את האפליקציה IAP כדי להגביל את הגישה
  • איך להגביל את הגישה באמצעות IAP

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

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

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

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Project name הוא השם המוצג של המשתתפים בפרויקט. זו מחרוזת תווים שלא משמשת את Google APIs. אפשר לעדכן אותו בכל שלב.
  • Project ID הוא ייחודי בכל הפרויקטים ב-Google Cloud ואי אפשר לשנות אותו (אי אפשר לשנות אותו אחרי שמגדירים אותו). מסוף Cloud יוצר מחרוזת ייחודית באופן אוטומטי; בדרך כלל לא מעניין אותך מה זה. ברוב ה-Codelabs תצטרכו להפנות אל מזהה הפרויקט (בדרך כלל הוא מזוהה כ-PROJECT_ID). אם המזהה שנוצר לא מוצא חן בעיניך, יש לך אפשרות ליצור מזהה אקראי אחר. לחלופין, אפשר לנסות תבנית משלך ולבדוק אם היא זמינה. לא ניתן לשנות אותו אחרי השלב הזה, והוא יישאר למשך הפרויקט.
  • לידיעתך, יש ערך שלישי – Project Number (מספר פרויקט), שחלק מממשקי ה-API משתמשים בו. מידע נוסף על כל שלושת הערכים האלה זמין במסמכי התיעוד.
  1. בשלב הבא צריך להפעיל את החיוב במסוף Cloud כדי להשתמש במשאבים או בממשקי API של Cloud. מעבר ב-Codelab הזה לא אמור לעלות הרבה, אם בכלל. כדי להשבית את המשאבים ולא לצבור חיובים מעבר למדריך הזה, אתם יכולים למחוק את המשאבים שיצרתם או למחוק את הפרויקט כולו. משתמשים חדשים ב-Google Cloud זכאים להצטרף לתוכנית תקופת ניסיון בחינם בשווי 1,200 ש"ח.

הגדרת סביבה

  1. יצירת משתני סביבה שקשורים לפרויקט ולמשאבים
export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')
export REGION=us-east1
export ORDER_SERVICE_URL=order-service
export INVENTORY_SERVICE_URL=inventory-service
export MENU_SERVICE_URL=menu-service
  1. הפעלת ממשקי ה-API של השירותים IAP ו-Cloud Resource Manager
gcloud services enable \
    iap.googleapis.com \
    cloudresourcemanager.googleapis.com \
    cloudidentity.googleapis.com \
    compute.googleapis.com
  1. משכפלים את מאגר האפליקציות לדוגמה ועוברים אל הספרייה
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git && cd cymbal-eats/employee-ui
  1. פורסים את פורטל העובדים באמצעות סקריפט ההגדרה. צריך להמתין להשלמת הסקריפט לפני שעוברים לשלב הבא
./setup.sh

פלט לדוגמה

...
Done.
Service [employee-ui-service] revision [employee-ui-service-00001-quw] has been deployed and is serving 100 percent of traffic.
Service URL: https://employee-ui-service-gbtuuy5eda-uk.a.run.app
  1. לוחצים על הקישור 'כתובת ה-URL של השירות'.

86416f68c0b8152a.png

3. הגדרת קבוצת נקודות קצה של רשת ללא שרת (NEG)

יוצרים קבוצה של נקודות קצה (endpoint) של רשת ללא שרת (serverless), Serverless NEG) לשירות Cloud Run בממשק המשתמש של העובדים. מפתחות NEG ללא שרת (serverless) מאפשרים להשתמש באפליקציות ב-Google Cloud ללא שרת (serverless) עם איזון עומסים חיצוני של HTTP(S).

2abe669e53c27186.png

  1. יוצרים קבוצה של נקודות קצה ברשת לשירות ממשק המשתמש של העובדים.
gcloud compute network-endpoint-groups create employee-ui-iap-neg \
    --project $PROJECT_ID \
    --region=$REGION \
    --network-endpoint-type=serverless  \
    --cloud-run-service=employee-ui-service

פלט לדוגמה

Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/regions/us-east1/networkEndpointGroups/employee-ui-iap-neg].
Created network endpoint group [employee-ui-iap-neg].

יצירת שירות לקצה העורפי והוספת ה-NEG ללא שרת (serverless)

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

  1. יצירת שירות לקצה העורפי
gcloud compute backend-services create employee-ui-iap-backend \
        --global 

פלט לדוגמה

Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/backendServices/employee-ui-iap-backend].
NAME: employee-ui-iap-backend
BACKENDS:
PROTOCOL: HTTP
  1. הוספת ה-NEG ללא שרת (serverless) כקצה עורפי לשירות לקצה העורפי
gcloud compute backend-services add-backend employee-ui-iap-backend \
    --global \
    --network-endpoint-group=employee-ui-iap-neg \
    --network-endpoint-group-region=$REGION

פלט לדוגמה

Updated [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/backendServices/employee-ui-iap-backend].
  1. אפשר ליצור מפה של כתובות URL כדי לנתב בקשות נכנסות לשירות לקצה העורפי
gcloud compute url-maps create employee-ui-iap-url-map \
    --default-service employee-ui-iap-backend
Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/urlMaps/employee-ui-iap-url-map].
NAME: employee-ui-iap-url-map
DEFAULT_SERVICE: backendServices/employee-ui-iap-backend

4. הגדרת רכיבי מאזן העומסים

בתרשים הבא אפשר לראות שמאזן העומסים משתמש בקצה עורפי NEG ללא שרת (serverless) כדי להפנות בקשות לשירות Cloud Run ללא שרת.

335f4674737a6514.png

שמירת כתובת IP סטטית

  1. שמירה של כתובת IPv4 סטטית ואחסון הדומיין
gcloud compute addresses create employee-ui-iap-ip \
    --network-tier=PREMIUM \
    --ip-version=IPV4 \
    --global

פלט לדוגמה

Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/addresses/employee-ui-iap-ip].
  1. אחסון הדומיין nip.io
export DOMAIN=$(gcloud compute addresses list --filter employee-ui-iap-ip --format='value(ADDRESS)').nip.io

יצירת משאב של אישור SSL בניהול Google

  1. יצירת משאב של אישור SSL בניהול Google
gcloud compute ssl-certificates create employee-ui-iap-cert \
    --description=employee-ui-iap-cert \
    --domains=$DOMAIN \
    --global

פלט לדוגמה

Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/sslCertificates/employee-ui-iap-cert].
NAME: employee-ui-iap-cert
TYPE: MANAGED
CREATION_TIMESTAMP: 2022-04-18T06:39:37.474-07:00
EXPIRE_TIME:
MANAGED_STATUS: PROVISIONING

34.102.234.98.nip.io: PROVISIONING

יצירת שרת proxy המשמש כיעד ל-HTTPS

  1. צריך ליצור את שרת ה-proxy המיועד ל-HTTPS כדי לנתב בקשות למפת כתובות ה-URL שלך
gcloud compute target-https-proxies create employee-ui-iap-http-proxy \
    --ssl-certificates employee-ui-iap-cert \
    --url-map employee-ui-iap-url-map

פלט לדוגמה

Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/targetHttpsProxies/employee-ui-iap-http-proxy].
NAME: employee-ui-iap-http-proxy
SSL_CERTIFICATES: employee-ui-iap-cert
URL_MAP: employee-ui-iap-url-map
CERTIFICATE_MAP:

הגדרת כללי העברה

  1. אפשר ליצור כלל העברה כדי לנתב בקשות נכנסות לשרת ה-proxy
gcloud compute forwarding-rules create employee-ui-iap-forwarding-rule \
    --load-balancing-scheme=EXTERNAL \
    --network-tier=PREMIUM \
    --address=employee-ui-iap-ip \
    --global \
    --ports=443 \
    --target-https-proxy employee-ui-iap-http-proxy

פלט לדוגמה

Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/forwardingRules/employee-ui-iap-forwarding-rule].

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

הגבלה של תעבורת הנתונים הנכנסת (ingress) כך שהיא תקבל רק בקשות פנימיות ובקשות שנשלחות דרך איזון עומסים מסוג HTTP(S).

26cb0b2a9162e7ab.png

  1. עדכון השירות כך שיאפשר תעבורת נתונים נכנסת (ingress) רק מבקשות פנימיות ובקשות דרך מאזן עומסים של HTTP(S)
gcloud run services update employee-ui-service \
    --ingress internal-and-cloud-load-balancing \
    --region $REGION

פלט לדוגמה

OK Deploying... Done.                            
  OK Creating Revision...
  OK Routing traffic...
Done.
Service [employee-ui-service] revision [employee-ui-service-00001-quw] has been deployed and is serving 100 percent of traffic.
Service URL: https://employee-ui-service-gbtuuy5eda-uk.a.run.app
  1. לוחצים על הקישור 'כתובת ה-URL של השירות'.

8505fde7e0784bf1.png

מעכשיו, הגישה לכתובת ה-URL של שירות Cloud Run מוצגת כאסורה.

5. הפעלת שרת proxy לאימות זהויות (IAP) ב-Cloud Identity במאזן העומסים

בעזרת IAP אפשר ליצור שכבת הרשאה מרכזית לאפליקציות שהגישה אליהן מתבצעת דרך HTTPS. ניתן להשתמש במודל בקרת גישה ברמת האפליקציה במקום בחומות אש ברמת הרשת.

d9740402a74370a8.png

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

  1. יצירת מותג
export USER_EMAIL=$(gcloud config list account --format "value(core.account)")

gcloud alpha iap oauth-brands create \
    --application_title="Cymbal Eats" \
    --support_email=$USER_EMAIL

פלט לדוגמה

Created [462858740426].
applicationTitle: Cymbal Eats
name: projects/462858740426/brands/462858740426
orgInternalOnly: true

יצירת לקוח OAuth ל-IAP

  1. יצירת לקוח באמצעות שם המותג מהשלב הקודם
gcloud alpha iap oauth-clients create \
    projects/$PROJECT_ID/brands/$PROJECT_NUMBER \
    --display_name=cymbal-eats-employee-ui

פלט לדוגמה

Created [462858740426-tkpv8n03opijg7erd3s9ccued2pfllsd.apps.googleusercontent.com].
displayName: cymbal-eats-employee-ui
name: projects/462858740426/brands/462858740426/identityAwareProxyClients/462858740426-tkpv8n03opijg7erd3s9ccued2pfllsd.apps.googleusercontent.com
secret: [secret-removed]
  1. אחסון השם, המזהה והסוד של הלקוח
export CLIENT_NAME=$(gcloud alpha iap oauth-clients list \
    projects/$PROJECT_NUMBER/brands/$PROJECT_NUMBER --format='value(name)' \
    --filter="displayName:cymbal-eats-employee-ui")

export CLIENT_ID=${CLIENT_NAME##*/}

export CLIENT_SECRET=$(gcloud alpha iap oauth-clients describe $CLIENT_NAME --format='value(secret)')
  1. במסוף Cloud, בוחרים את הפרויקט מהתפריט הנפתח של בחירת הפרויקט.
  2. עוברים אל מסך ההסכמה של OAuth במסוף Cloud.

bcb460f3ab5241f4.png

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

27fd7de6e7b7ef21.png

  1. לוחצים על 'אישור'.

6. הגבלת הגישה באמצעות IAP

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

  1. הפעלת IAP בשירות לקצה העורפי
gcloud iap web enable --resource-type=backend-services \
    --oauth2-client-id=$CLIENT_ID \
    --oauth2-client-secret=$CLIENT_SECRET \
    --service=employee-ui-iap-backend

אימות ההגדרה של IAP

  1. יש לוודא שאישור ה-SSL פעיל
gcloud compute ssl-certificates list --format='value(MANAGED_STATUS)'
  1. אחזור כתובת ה-URL של השירות
echo https://$DOMAIN

פלט לדוגמה

https://34.102.234.98.nip.io
  1. לוחצים על כתובת ה-URL של השירות כדי לפתוח את פורטל העובדים.

352b600209c3fb33.png

  1. מתחברים באמצעות פרטי הכניסה לשיעור ה-Lab.

f7e0318388aa0739.png

  1. סגירת הדפדפן

הענקת גישה למשתמש לפורטל העובדים

  1. הוספת קישור מדיניות IAM לתפקיד של 'roles/iap.httpsResourceAccessor' עבור המשתמש שנוצר בשלב הקודם
gcloud iap web add-iam-policy-binding \
    --resource-type=backend-services \
    --service=employee-ui-iap-backend \
    --member=user:$USER_EMAIL \
    --role='roles/iap.httpsResourceAccessor'

פלט לדוגמה

Updated IAM policy for backend service [projects/462858740426/iap_web/compute/services/employee-ui-iap-backend].

בדיקת הגישה לשירות

אישור שהגישה לפורטל העובדים ניתנה

  1. אחזור כתובת ה-URL של השירות
echo https://$DOMAIN

פלט לדוגמה

https://34.102.234.98.nip.io
  1. לוחצים על כתובת ה-URL של השירות כדי לפתוח את פורטל העובדים.

86416f68c0b8152a.png

עכשיו אמורה להיות לך גישה לפורטל העובדים.

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

unset ORDER_SERVICE_URL
unset INVENTORY_SERVICE_URL
unset MENU_SERVICE_URL

cd ~/cymbal-eats

./setup.sh
./get-site-urls.sh

7. מעולה!

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

השלב הבא:

בקישורים הבאים תוכלו למצוא עוד מעבדי קוד Labs של Cymbal Eats:

הסרת המשאבים

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

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

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