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

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

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

94b06525c85408ad.png

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

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

מה תלמדו

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

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

  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. הוספת קבוצת נקודות קצה ללא שרת כקצה עורפי לשירות לקצה העורפי
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 בלי שרת (serverless).

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. הפעלת 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 Console, בוחרים את הפרויקט מהתפריט הנפתח לבחירת הפרויקט.
  2. עוברים אל מסך ההסכמה ל-OAuth ב-Cloud Console.

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!

השלב הבא:

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

הסרת המשאבים

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

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

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