אפליקציות שפועלות בפלטפורמות מנוהלות Cloud de Confiance by S3NS כמו App Engine יכולות להימנע מניהול אימות המשתמשים וניהול הסשנים באמצעות שרת proxy לאימות זהויות (IAP) כדי לשלוט בגישה אליהן. בעזרת IAP אפשר לא רק לשלוט בגישה לאפליקציה, אלא גם לקבל מידע על המשתמשים המאומתים, כולל כתובת האימייל ומזהה קבוע לאפליקציה בצורה של כותרות HTTP חדשות.
מטרות
לדרוש מהמשתמשים באפליקציית App Engine לאמת את עצמם באמצעות IAP.
גישה לזהויות של משתמשים באפליקציה כדי להציג את כתובת האימייל המאומתת של המשתמש הנוכחי.
עלויות
במסמך הזה משתמשים ברכיבים הבאים של Cloud de Confiance by S3NS, והשימוש בהם כרוך בתשלום:
כשמסיימים את המשימות שמתוארות במסמך הזה אפשר למחוק את המשאבים שיצרתם כדי להימנע מחיובים נוספים. מידע נוסף זמין בקטע הסרת המשאבים.
לפני שמתחילים
-
In the Cloud de Confiance console, on the project selector page, select or create a Cloud de Confiance project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Install the Google Cloud CLI.
-
Configure the gcloud CLI to use your federated identity.
For more information, see Sign in to the gcloud CLI with your federated identity.
-
To initialize the gcloud CLI, run the following command:
gcloud init
רקע
במדריך הזה נשתמש ב-IAP כדי לאמת משתמשים. זו רק אחת מכמה גישות אפשריות. בקטע מושגים בנושא אימות מוסבר על השיטות השונות לאימות משתמשים.
אפליקציית Hello user-email-address
האפליקציה במדריך הזה היא אפליקציית App Engine מינימלית מסוג Hello world, עם תכונה אחת לא אופיינית: במקום Hello world, היא מציגה את הטקסט Hello user-email-address, כאשר user-email-address היא כתובת האימייל של המשתמש המאומת.
הפונקציונליות הזו מתאפשרת באמצעות בדיקה של המידע המאומת שרכיב IAP מוסיף לכל בקשה לאחזור מהרשת שהוא מעביר לאפליקציה. יש שלוש כותרות חדשות של בקשות שנוספות לכל בקשה לאחזור מהרשת שמגיעה לאפליקציה. שתי הכותרות הראשונות הן מחרוזות של טקסט פשוט שאפשר להשתמש בהן כדי לזהות את המשתמש. הכותרת השלישית היא אובייקט חתום בצורה מוצפנת עם אותו מידע.
X-Goog-Authenticated-User-Email: כתובת האימייל של המשתמש מזהה אותו. אל תאחסנו מידע אישי אם האפליקציה יכולה להימנע מכך. האפליקציה הזו לא שומרת נתונים, היא רק מחזירה אותם למשתמש.
X-Goog-Authenticated-User-Id: מזהה המשתמש הזה שמוקצה על ידי Google לא מציג מידע על המשתמש, אבל הוא מאפשר לאפליקציה לדעת שהמשתמש המחובר הוא אותו משתמש שנראה בעבר.
X-Goog-Iap-Jwt-Assertion: אתם יכולים להגדיר שאפליקציות Cloud de Confiance by S3NS יקבלו בקשות לאחזור מהרשת מאפליקציות ענן אחרות, תוך עקיפת IAP, בנוסף לבקשות לאחזור מהרשת מהאינטרנט. אם אפליקציה מוגדרת כך, יכול להיות שבבקשות כאלה יהיו כותרות מזויפות. במקום להשתמש באחת מכותרות הטקסט הפשוט שצוינו קודם, אתם יכולים להשתמש בכותרת הזו שחתומה באופן קריפטוגרפי ולאמת אותה כדי לבדוק שהמידע סופק על ידי Google. גם כתובת האימייל של המשתמש וגם מזהה משתמש קבוע זמינים כחלק מכותרת חתומה זו.
אם אתם בטוחים שהאפליקציה מוגדרת כך שרק בקשות אינטרנט יכולות להגיע אליה, ושאי אפשר להשבית את שירות הרכישות מתוך האפליקציה, אז כדי לאחזר מזהה משתמש ייחודי צריך רק שורת קוד אחת:
userId = req.header('X-Goog-Authenticated-User-ID') :? null;
עם זאת, באפליקציה עמידה צריך לצפות שדברים ישתבשו, כולל בעיות לא צפויות בהגדרה או בסביבה. לכן, מומלץ ליצור פונקציה שמשתמשת בכותרת החתומה באופן קריפטוגרפי ומאמתת אותה. אי אפשר לזייף את החתימה של הכותרת הזו, ואחרי שהיא מאומתת, אפשר להשתמש בה כדי להחזיר את הזיהוי.
יצירת קוד המקור
משתמשים בכלי לעריכת טקסט כדי ליצור קובץ בשם
app.jsומדביקים בו את הקוד הבא:הסבר מפורט על הקובץ
app.jsמופיע בקטע הסבר על הקוד בהמשך המדריך הזה.יוצרים קובץ נוסף בשם
package.jsonומדביקים בו את התוכן הבא:בקובץ
package.jsonמפורטות כל התלויות של Node.js שהאפליקציה צריכה.jsonwebtokenמספק את פונקציית הבדיקה והפענוח של JWT.יוצרים קובץ בשם
app.yamlומזינים בו את הטקסט הבא:קובץ
app.yamlמציין ל-App Engine איזו סביבת שפה נדרשת לקוד.
הסבר על הקוד
בקטע הזה מוסבר איך הקוד בקובץ app.js פועל. אם רוצים להפעיל את האפליקציה, אפשר לדלג אל הקטע פריסת האפליקציה.
הקוד הבא נמצא בקובץ app.js. כשהאפליקציה מקבלת HTTP GET, מופעלת ההוראה switch case עבור /:
הפונקציה מקבלת את ערך הכותרת של הצהרת ה-JWT ש-IAP הוסיף מהבקשה הנכנסת, וקוראת לפונקציה כדי לאמת את הערך הזה שנחתם בצורה קריפטוגרפית. הערך הראשון שמוחזר (כתובת האימייל) משמש ליצירת דף אינטרנט מינימלי שמוחזר.
הפונקציה validateAssertion משתמשת בפונקציה verifySignedJwtWithCertsAsync() מ-google-auth-library כדי לוודא שהטענה חתומה כראוי, ולחלץ את פרטי המטען הייעודי (payload) מהטענה. המידע הזה כולל את כתובת האימייל של המשתמש המאומת ומזהה ייחודי קבוע של המשתמש.
אם אי אפשר לפענח את הטענה, הפונקציה הזו תזרוק ותדפיס הודעה כדי לתעד את השגיאה ביומן.
כדי לאמת הצהרת JWT, צריך לדעת את אישורי המפתח הציבורי של הישות שחתמה על ההצהרה (Google במקרה הזה) ואת קהל היעד שאליו ההצהרה מיועדת. באפליקציית App Engine, הקהל הוא מחרוזת עם Cloud de Confiance פרטי זיהוי של הפרויקט. הפונקציה הזו מקבלת את האישורים האלה ואת מחרוזת הקהל מהפונקציות שלפניה.
אתם יכולים לחפש את Cloud de Confiance המזהה המספרי ואת השם של הפרויקט ולהזין אותם בקוד המקור בעצמכם, אבל הפונקציה audience עושה את זה בשבילכם על ידי שליחת שאילתה לשירות המטא-נתונים הרגיל שזמין לכל אפליקציית App Engine. מכיוון ששירות המטא-נתונים הוא חיצוני לקוד האפליקציה, התוצאה נשמרת במשתנה גלובלי שמוחזר בלי צורך לחפש מטא-נתונים בקריאות הבאות.
שירות המטא-נתונים של App Engine (ושירותי מטא-נתונים דומים לשירותי מחשוב אחרים שלCloud de Confiance ) נראה כמו אתר אינטרנט, והשאילתות שמופנות אליו הן שאילתות אינטרנט רגילות. עם זאת, שירות המטא-נתונים הוא לא אתר חיצוני, אלא תכונה פנימית שמחזירה מידע מבוקש על האפליקציה שפועלת. לכן, אפשר להשתמש בבקשות http במקום בבקשות https.
הוא משמש לקבלת המזהים הנוכחיים Cloud de Confiance שנדרשים להגדרת הקהל המיועד של הצהרת ה-JWT.
אימות חתימה דיגיטלית דורש את אישור של מפתח ציבורי של בעל החתימה. Google מספקת אתר שמחזיר את כל האישורים של המפתחות הציבוריים שנמצאים בשימוש כרגע. התוצאות האלה נשמרות במטמון למקרה שיהיה בהן צורך שוב באותו מופע של האפליקציה.
פריסת האפליקציה
עכשיו אפשר לפרוס את האפליקציה ואז להפעיל את IAP כדי לדרוש מהמשתמשים לבצע אימות לפני שהם יכולים לגשת לאפליקציה.
בחלון הטרמינל, עוברים לתיקייה שמכילה את הקובץ
app.yamlומפעילים את האפליקציה ב-App Engine:gcloud app deployכשמופיעה בקשה, בוחרים אזור קרוב.
כשמוצגת השאלה אם רוצים להמשיך בפעולת הפריסה, מזינים
Y.תוך כמה דקות, האפליקציה שלכם תהיה זמינה באינטרנט.
כדי לראות את האפליקציה:
gcloud app browseבפלט, מעתיקים את
web-site-url, כתובת האינטרנט של האפליקציה.בחלון הדפדפן, מדביקים את
web-site-urlכדי לפתוח את האפליקציה.לא מוצגת כתובת אימייל כי עדיין לא השתמשתם ב-IAP, ולכן לא נשלחים פרטי משתמש לאפליקציה.
הפעלת רכישות מתוך האפליקציה
עכשיו, כשיש מופע של App Engine, אפשר להגן עליו באמצעות IAP:
נכנסים לדף שרת proxy לאימות זהויות (IAP) במסוף Cloud de Confiance .
זו הפעם הראשונה שאתם מפעילים אפשרות אימות לפרויקט הזה, ולכן מוצגת לכם הודעה שלפיה אתם צריכים להגדיר את מסך ההסכמה ל-OAuth לפני שתוכלו להשתמש ב-IAP.
לוחצים על הגדרת מסך בקשת ההסכמה.
בכרטיסייה OAuth Consent Screen בדף Credentials, ממלאים את השדות הבאים:
אם החשבון שלכם נמצא בארגון ב-Google Workspace, בוחרים באפשרות External ולוחצים על Create. בהתחלה, האפליקציה תהיה זמינה רק למשתמשים שאתם מאשרים באופן מפורש.
בשדה Application name, מזינים את הערך
IAP Example.בשדה כתובת אימייל לתמיכה, מזינים את כתובת האימייל שלכם.
בשדה דומיין מורשה, מזינים את החלק של שם המארח בכתובת ה-URL של האפליקציה, למשל
iap-example-999999.uc.r.appspot.com. אחרי שמזינים את שם המארח בשדה, לוחצים על המקשEnter.בשדה Application homepage link, מזינים את כתובת ה-URL של האפליקציה, לדוגמה
https://iap-example-999999.uc.r.appspot.com/.בשדה Application privacy policy line (שורת מדיניות הפרטיות של האפליקציה), משתמשים באותה כתובת URL כמו הקישור לדף הבית לצורכי בדיקה.
לוחצים על Save. כשמוצגת בקשה ליצור פרטי כניסה, אפשר לסגור את החלון.
נכנסים לדף שרת proxy לאימות זהויות (IAP) במסוף Cloud de Confiance .
כדי לרענן את הדף, לוחצים על רענון refresh. בדף הזה מופיעה רשימת המשאבים שאפשר להגן עליהם.
בעמודה IAP, לוחצים כדי להפעיל את IAP באפליקציה.
בדפדפן, עוברים אל
web-site-urlשוב.במקום דף האינטרנט, מוצג מסך כניסה שבו צריך לאמת את הזהות. כשאתם מתחברים, הגישה נדחית כי ל-IAP אין רשימה של משתמשים שמורשים להיכנס לאפליקציה.
הוספת משתמשים מורשים לאפליקציה
במסוף Cloud de Confiance , נכנסים לדף שרת proxy לאימות זהויות (IAP).
מסמנים את התיבה של אפליקציית App Engine ולוחצים על הוספת ישות ראשית.
מזינים
allAuthenticatedUsersובוחרים את התפקיד Cloud IAP/IAP-Secured Web App User.לוחצים על Save.
עכשיו כל משתמש ש-Google יכולה לאמת את הזהות שלו יכול לגשת לאפליקציה. אם רוצים, אפשר להגביל את הגישה עוד יותר על ידי הוספה של אדם אחד או יותר או של קבוצות כגורמים ראשיים:
כל כתובת אימייל ב-Gmail או ב-Google Workspace
כתובת אימייל של קבוצה ב-Google
שם דומיין של Google Workspace
גישה לאפליקציה
בדפדפן, עוברים אל
web-site-url.כדי לרענן את הדף, לוחצים על רענון refresh.
במסך ההתחברות, מתחברים באמצעות פרטי הכניסה לחשבון Google.
בדף שמוצג מופיע הכיתוב "שלום
user-email-address" עם כתובת האימייל שלכם.אם עדיין מוצג לך אותו דף כמו קודם, יכול להיות שיש בעיה בדפדפן, שלא מעדכן באופן מלא בקשות חדשות עכשיו שהפעלת את IAP. סוגרים את כל החלונות של הדפדפן, פותחים אותם מחדש ומנסים שוב.
מושגים שקשורים לאימות
יש כמה דרכים שבהן אפליקציה יכולה לאמת את המשתמשים שלה ולהגביל את הגישה רק למשתמשים מורשים. בקטעים הבאים מפורטות שיטות אימות נפוצות, בסדר יורד לפי רמת המאמץ שנדרשת מהאפליקציה.
| אפשרות | יתרונות | חסרונות |
|---|---|---|
| אימות אפליקציות |
|
|
| OAuth2 |
|
|
| IAP |
|
|
אימות שמנוהל על ידי האפליקציה
בשיטה הזו, האפליקציה מנהלת בעצמה כל היבט של אימות המשתמשים. האפליקציה צריכה לנהל מסד נתונים משלה של פרטי כניסה של משתמשים ושל סשנים של משתמשים, ולספק פונקציות לניהול חשבונות משתמשים וסיסמאות, לבדיקת פרטי כניסה של משתמשים, ולהנפקה, בדיקה ועדכון של סשנים של משתמשים בכל כניסה מאומתת. בתרשים הבא מודגמת שיטת האימות שמנוהלת על ידי האפליקציה.
כפי שמוצג בתרשים, אחרי שהמשתמש מתחבר, האפליקציה יוצרת ושומרת מידע על הסשן של המשתמש. כשהמשתמש שולח בקשה לאפליקציה, הבקשה צריכה לכלול פרטי סשן שהאפליקציה אחראית לאמת.
היתרון העיקרי של הגישה הזו הוא שהיא עצמאית ונמצאת בשליטת האפליקציה. האפליקציה אפילו לא צריכה להיות זמינה באינטרנט. החיסרון העיקרי הוא שהאפליקציה אחראית עכשיו לספק את כל הפונקציות של ניהול החשבון ולהגן על כל נתוני האישורים הרגישים.
אימות חיצוני באמצעות OAuth2
חלופה טובה לטיפול בכל הפעולות בתוך האפליקציה היא שימוש בשירות חיצוני לניהול זהויות, כמו Google, שמטפל בכל המידע והפונקציות של חשבונות המשתמשים ואחראי על ההגנה על פרטי הכניסה הרגישים. כשמשתמש מנסה להתחבר לאפליקציה, הבקשה מנותבת לשירות הזהויות, שמאמת את המשתמש ואז מנתב את הבקשה בחזרה לאפליקציה עם פרטי האימות הנדרשים. תוכלו להיעזר במאמר שימוש ב-OAuth 2.0 לאפליקציות אינטרנט.
בתרשים הבא מודגם אימות חיצוני באמצעות שיטת OAuth2.
התהליך בתרשים מתחיל כשהמשתמש שולח בקשה לגשת לאפליקציה. במקום להגיב ישירות, האפליקציה מפנה את הדפדפן של המשתמש לפלטפורמת הזהויות של Google, שמציגה דף להתחברות ל-Google. אחרי שהמשתמש מתחבר בהצלחה, הדפדפן שלו מופנה חזרה לאפליקציה. הבקשה הזו כוללת מידע שהאפליקציה יכולה להשתמש בו כדי לחפש מידע על המשתמש שאומת, והאפליקציה מגיבה למשתמש.
לשיטה הזו יש הרבה יתרונות לאפליקציה. היא מאצילה את כל הפונקציונליות והסיכונים של ניהול החשבון לשירות החיצוני, מה שיכול לשפר את אבטחת ההתחברות והחשבון בלי לשנות את האפליקציה. עם זאת, כפי שמוצג בתרשים הקודם, כדי להשתמש בשיטה הזו, האפליקציה צריכה לגשת לאינטרנט. האפליקציה גם אחראית על ניהול הסשנים אחרי שהמשתמש מאומת.
שרת proxy לאימות זהויות (IAP)
הגישה השלישית, שבה עוסק המדריך הזה, היא להשתמש ב-IAP כדי לטפל בכל האימותים וניהול הסשנים, עם כל שינוי באפליקציה. IAP מיירט את כל בקשות לאחזור מהרשת לאפליקציה, חוסם את כל הבקשות שלא אומתו ומעביר את האחרות עם נתוני זהות המשתמש שנוספו לכל בקשה.
בתרשים הבא מוצג אופן הטיפול בבקשה.
בקשות ממשתמשים נתפסות על ידי IAP, שחוסם בקשות לא מאומתות. בקשות מאומתות מועברות לאפליקציה, בתנאי שהמשתמש המאומת נמצא ברשימת המשתמשים המורשים. לבקשות שעוברות דרך IAP מתווספות כותרות שמזהות את המשתמש ששלח את הבקשה.
האפליקציה לא צריכה יותר לטפל בפרטים של חשבון משתמש או סשן. כל פעולה שצריכה לדעת מזהה ייחודי של המשתמש יכולה לקבל אותו ישירות מכל בקשה לאחזור מהרשת נכנסת. עם זאת, אפשר להשתמש בשיטה הזו רק בשירותי מחשוב שתומכים ב-IAP, כמו App Engine ומאזני עומסים. אי אפשר להשתמש ב-IAP במחשב פיתוח מקומי.
הסרת המשאבים
כדי להימנע מחיובים בחשבון Google Cloud בגלל השימוש במשאבים שנעשה במסגרת המדריך הזה, אפשר למחוק את הפרויקט שמכיל את המשאבים או להשאיר את הפרויקט ולמחוק את המשאבים בנפרד.
- במסוף Cloud de Confiance , נכנסים לדף Manage resources.
- ברשימת הפרויקטים, בוחרים את הפרויקט שרוצים למחוק ולוחצים על Delete.
- כדי למחוק את הפרויקט, כותבים את מזהה הפרויקט בתיבת הדו-שיח ולוחצים על Shut down.