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

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

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

94b06525c85408ad.png

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

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

מה תלמדו

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

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

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

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

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

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

הגדרת הסביבה

  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)

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

שירות לקצה העורפי מגדיר את האופן שבו 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 ללא שרת כקצה עורפי לשירות הקצה העורפי
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 ללא שרת כדי להפנות בקשות לשירות ללא שרת ב-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].

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

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

26cb0b2a9162e7ab.png

  1. מעדכנים את השירות כך שיאפשר תעבורת נתונים נכנסת רק מבקשות פנימיות ומבקשות דרך מאזן עומסים מסוג 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. הפעלת Cloud Identity-Aware Proxy (IAP) במאזן העומסים

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

d9740402a74370a8.png

מותג הוא מסך ההסכמה של OAuth שמכיל מידע על המותג למשתמשים. יכול להיות שהמותגים מוגבלים למשתמשים פנימיים או ציבוריים. מותג פנימי מאפשר למשתמש שנמצא באותו ארגון ב-Google Workspace כמו הפרויקט לגשת לתהליך ה-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. מתחברים באמצעות פרטי הכניסה של המעבדה.

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 נוספים של Cymbal Eats:

הסרת המשאבים

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

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

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