אימות המשתמשים באפליקציית האינטרנט הוא לעיתים קרובות נדרש, ולרוב נדרש תכנות מיוחד באפליקציה. באפליקציות של Google Cloud Platform, אפשר להעביר את תחומי האחריות האלה לשירות Proxy של זהויות שמפעילות מודעות זהות. אם עליך להגביל את הגישה למשתמשים נבחרים בלבד, אין צורך לשנות את האפליקציה. אם האפליקציה צריכה לדעת את זהות המשתמש (למשל, אם היא רוצה לשמור את העדפות המשתמש בצד השרת), שרת ה-Proxy לאימות זהויות (IAP) אמור לספק זאת עם קוד אפליקציה מינימלי.
מהו שרת proxy לאימות זהויות (IAP)?
שרת Proxy לאימות זהויות (IAP) הוא שירות של Google Cloud Platform שמיירט בקשות אינטרנט שנשלחו לאפליקציה שלכם. שירות זה מאמת את המשתמש שביצע את הבקשה באמצעות שירות Google Identity, והוא מאפשר לשלוח בקשות רק אם הן מגיעות ממשתמשים שאישרתם. בנוסף, היא יכולה לשנות את כותרות הבקשות כך שיכללו מידע על המשתמש המאומת.
שיעור Lab זה ידריך אתכם ביצירה של אפליקציה משלכם, בהגבלת הגישה אליה ובקבלת זהות המשתמש מרכישות מהאפליקציה.
מה תפתחו
בשיעור Lab זה, תיצרו אפליקציית אינטרנט מינימלית באמצעות Google App Engine, ולאחר מכן תנסו להשתמש בדרכים שונות כדי להשתמש ב-proxy של זהויות (IAP) כדי להגביל את הגישה לאפליקציה ולספק לה פרטי זהות. האפליקציה שלך:
|
מה תלמדו
- איך לכתוב ולפרוס אפליקציה פשוטה של App Engine באמצעות Python 3.7
- איך מפעילים או משביתים IAP כדי להגביל את הגישה לאפליקציה?
- איך להשיג מהאפליקציה מידע על זהות המשתמש
- איך לאמת מידע בצורה קריפטוגרפית מ-IAP כדי להגן מפני זיוף
מה צריך?
- דפדפן אינטרנט מודרני כמו Chrome.
- ידע בסיסי בשפת התכנות של Python
שיעור Lab זה מתמקד ב-Google App Engine וב-IAP. קונספטים ובלוקים של קוד שאינם רלוונטיים יותר מובלטים, והם ניתנים כדי פשוט להעתיק ולהדביק אותם.
אתם תעבדו בסביבת שורת הפקודה של Cloud Shell. פותחים את הסביבה ומאחזרים את הקוד לדוגמה.
הפעלת המסוף ו-Cloud Shell
בפינה הימנית העליונה של דף שיעור ה-Lab, לוחצים על הלחצן Open Google Console. יהיה עליך להתחבר באמצעות שם המשתמש והסיסמה שמופיעים מתחת ללחצן. |
כל הפקודות ב-Codelab הזה יבוצעו בתוך Cloud Shell עבור הפרויקט שנוצר ונפתח עבורכם. פותחים את Cloud Shell באמצעות לחיצה על הסמל של Cloud Cloud Shell שנמצא משמאל לכותרת של דף המסוף. החלק התחתון של הדף יאפשר לך להזין ולהפעיל פקודות. אפשר להריץ את הפקודות מהמחשב האישי שלך, אבל תחילה צריך להתקין ולהגדיר את תוכנת הפיתוח הנדרשת. ב-Cloud Shell כבר יש את כל כלי התוכנה הדרושים לכם. |
להורדת הקוד
לוחצים על האזור של שורת הפקודה ב-Cloud Shell כדי להקליד פקודות. אחזור הקוד מ-GitHub ולאחר מכן מעבר לתיקיית הקוד:
git clone https://github.com/googlecodelabs/user-authentication-with-iap.git
cd iap-codelab
תיקייה זו מכילה תיקיית משנה אחת לכל שלב ב-codelab זה. כדי לבצע כל שלב, יש לעבור לתיקייה הנכונה.
זוהי אפליקציה של App Engine Standard שנכתבו ב-Python 3.7, והיא פשוט מציגה דף &מירכאות;שלום, עולם ומירכאות. פרסנו ונבדוק אותו, ולאחר מכן נגביל אותו באמצעות IAP.
בודקים את קוד האפליקציה
מעבר מתיקיית הפרויקט הראשית לתיקיית המשנה 1-HelloWorld
שמכילה קוד לשלב זה.
cd 1-HelloWorld
קוד האפליקציה נמצא בקובץ main.py
. היא משתמשת במסגרת האינטרנט Flask כדי להגיב לבקשות אינטרנט עם התוכן של תבנית. קובץ התבנית הזה נמצא ב-templates/index.html
, ושלב זה מכיל רק HTML פשוט. קובץ תבנית שני מכיל מדיניות פרטיות לדוגמה של templates/privacy.html
.
יש שני קבצים נוספים: requirements.txt
מפרט את כל הספריות שאינן מוגדרות כברירת מחדל ב-Python שהאפליקציה משתמשת בהן, ו-app.yaml
מציין ל-Google Cloud Platform שמדובר באפליקציית Python ב-App Engine 3.7.
תוכלו לרשום כל קובץ במעטפת באמצעות פקודת cat, למשל:
cat main.py
לחלופין, אפשר לפתוח את עורך הקוד של Cloud Shell על ידי לחיצה על סמל העיפרון בפינה השמאלית העליונה של חלון Cloud Shell, ולבדוק את הקוד בצורה הזו.
אין צורך לשנות קבצים בשלב זה.
פריסה ל-App Engine
עכשיו פורסים את האפליקציה לסביבה של App Engine Standard עבור Python 3.7
gcloud app deploy
ייתכן שתתבקשו לבחור אזור לפריסה. יש לבחור כל אחד בקרבת מקום שאומר לו "תומך בתקן". כשמוצגת השאלה אם אתם רוצים להמשיך, מזינים Y
כן.
בעוד כמה דקות פריסה אמורה להסתיים. תוצג לך הודעה על כך שניתן להציג את האפליקציה עם gcloud app browse
. מזינים את הפקודה הזו. אם כרטיסייה חדשה לא נפתחת בדפדפן, לחץ על הקישור המוצג כדי לפתוח אותה בכרטיסייה חדשה או העתק אותה לכרטיסייה חדשה שנפתחה באופן ידני במידת הצורך. זו הפעם הראשונה שבה האפליקציה מופעלת
תוכלו לפתוח את אותה כתובת URL מכל מחשב שמחובר לאינטרנט כדי לראות את דף האינטרנט הזה. עדיין אין גישה מוגבלת.
הגבלת גישה עם רכישות מהאפליקציה
בחלון Cloud Console, לוחצים על סמל התפריט בפינה הימנית העליונה של הדף, לוחצים על Security (אבטחת) ואז על שרת proxy התומך בזהות. | |
מאחר שזו הפעם הראשונה שהפעלתם אפשרות אימות לפרויקט הזה, תוצג לכם הודעה על כך שיש להגדיר את מסך ההסכמה של OAuth כדי שניתן יהיה להשתמש ב-IAP. | |
לוחצים על הלחצן 'הגדרת מסך ההסכמה'. תיפתח כרטיסייה חדשה להגדרת מסך ההסכמה. |
ממלאים את הפרטים הריקים הנדרשים בערכים המתאימים:
שם אפליקציה | דוגמה לרכישה מהאפליקציה |
כתובת אימייל לתמיכה | כתובת האימייל שלך. ייתכן שהיא כבר מולאה עבורך. |
דומיין מורשה | חלק שם המארח של כתובת האתר של האפליקציה, למשל iap-example-999999.appspot.com. ניתן לראות זאת בסרגל הכתובות של דף האינטרנט ' Hello World' שפתחת בעבר. אין לכלול את ה- לאחר הזנת הערך הזה, יש להקיש על Enter. |
קישור לדף הבית של האפליקציה | כתובת ה-URL שבה השתמשתם להצגת האפליקציה |
קישור למדיניות הפרטיות של האפליקציה | הקישור לדף הפרטיות באפליקציה זה, כמו הקישור לדף הבית עם /privacy נוסף לסוף |
לוחצים על שמירה. תתבקשו ליצור פרטי כניסה. אין צורך ליצור פרטי כניסה עבור קוד Lab זה, כך שאפשר פשוט לסגור את כרטיסיית הדפדפן.
חוזרים לדף שרת ה-proxy שתומך בזהות ומעדכנים אותו. עכשיו תוצג רשימה של משאבים שניתן להגן עליהם. כדי להפעיל את ה-IAP, לוחצים על לחצן החלפת המצב בעמודה IAP בשורה של אפליקציית App Engine. | |
שמות הדומיינים שיוצגו יהיו מוגנים על ידי ה-IAP. לוחצים על 'הפעלה'. | |
עכשיו פותחים כרטיסיית דפדפן ועוברים לכתובת ה-URL של האפליקציה. יוצג מסך כניסה עם Google שצריך להתחבר אליו כדי לגשת לאפליקציה. | |
יש להיכנס באמצעות חשבון Google או G Suite. בשלב הזה יוצג לכם מסך שבו לא נאפשר לכם לגשת אליו. |
הגנת על האפליקציה שלך באמצעות IAP, אך עדיין לא אמרת ל-IAP אילו חשבונות לאפשר זאת.
חוזרים לדף שרת proxy לאימות זהויות במסוף, בוחרים את תיבת הסימון שלצד האפליקציה App Engine ומעיינים בסרגל הצד שמשמאל לדף. | |
צריך להוסיף כחברים כל כתובת אימייל (או כתובת של קבוצת Google, או שם דומיין ב-G Suite), שיש להעניק לה גישה. לוחצים על 'הוספת חבר'. מזינים את כתובת האימייל שלכם, ולאחר מכן בוחרים את התפקיד 'משתמש באינטרנט לאפליקציה' או 'אפליקציה מאובטחת' ב-Cloud כדי להקצות אותה לכתובת הזו. אפשר להזין עוד כתובות או דומיינים של G Suite באותו אופן. |
לוחצים על 'שמירה'. ההודעה "המדיניות המעודכנת" תופיע בתחתית החלון.
חוזרים לאפליקציה וטוענים מחדש את הדף. אתה אמור לראות את אפליקציית האינטרנט שלך, מפני שכבר התחברת באמצעות משתמש שאישרת. עם זאת, ייתכן שעדיין יוצג לך הדף &מירכאות; אין לך גישה" מכיוון ש-IAP לא יכולה לבדוק מחדש את ההרשאה שלך. במקרה כזה, מבצעים את הפעולות הבאות:
- פותחים את דפדפן האינטרנט בכתובת דף הבית: מוסיפים
/_gcp_iap/clear_login_cookie
בסוף כתובת ה-URL, כמוhttps://iap-example-999999.appspot.com/_gcp_iap/clear_login_cookie
. - יוצג מסך חדש של כניסה באמצעות חשבון Google, והחשבון שלך כבר מוצג. אין ללחוץ על החשבון. במקום זאת, יש ללחוץ על 'שימוש בחשבון אחר' ולהזין שוב את פרטי הכניסה.
- שלבים אלה גורמים ל-IAP לבדוק מחדש את הגישה שלכם ועכשיו אתם אמורים לראות את מסך הבית של האפליקציה שלכם.
אם יש לכם גישה לדפדפן אחר או אם אתם משתמשים במצב אנונימי בדפדפן, ויש לכם חשבון G Suite או G Suite חוקי אחר, תוכלו להשתמש בדפדפן זה כדי לעבור לדף האפליקציה ולהתחבר באמצעות החשבון האחר. מאחר שהחשבון הזה לא קיבל את ההרשאה, יוצג הכיתוב '&מרכאות';'אין לכם גישה'; במקום האפליקציה.
לאחר שאפליקציה מוגנת באמצעות IAP, היא יכולה להשתמש בפרטי הזהות ש-IAP מספקת בכותרות של בקשות האינטרנט שבאמצעותן היא עוברת. בשלב זה, האפליקציה תקבל את כתובת האימייל של המשתמש המחובר ואת מזהה המשתמש הייחודי שהוקצה על ידי שירות Google Identity למשתמש זה. הנתונים האלה יוצגו למשתמש בדף הפתיחה.
זהו שלב 2 והשלב האחרון הסתיים כש-Cloud Shell פתוח בתיקייה iap-codelab/1-HelloWorld
. מעבר לתיקייה בשלב הזה:
cd ~/iap-codelab/2-HelloUser
פריסה ל-App Engine
מפני שפריסה של כמה דקות מתחילה, יש לפרוס את האפליקציה בסביבות של App Engine Standard עבור Python 3.7:
gcloud app deploy
כשמוצגת השאלה אם אתם רוצים להמשיך, מזינים Y כדי לאשר. בעוד מספר דקות הפריסה אמורה להסתיים. בזמן ההמתנה אפשר לבדוק את קובצי האפליקציה כפי שמתואר בהמשך.
כשהפריסה מוכנה, תופיע הודעה עם בקשה להציג את האפליקציה שלך עם gcloud app browse
. מזינים את הפקודה הזו. אם כרטיסייה חדשה לא נפתחת בדפדפן, מעתיקים את הקישור המוצג ופותחים אותו בכרטיסייה חדשה. אתם אמורים לראות דף הדומה לדף הבא:
ייתכן שיהיה עליך להמתין מספר דקות עד שהגרסה החדשה של האפליקציה תחליף את הגרסה הקודמת. אם יש צורך, רענן את הדף כדי לראות דף הדומה למעלה.
בדיקת קובצי האפליקציה
התיקייה הזו מכילה את אותה קבוצת קבצים כפי שהיא מופיעה בשלב 1, אבל שניים מהקבצים השתנו: main.py
ו-templates/index.html
. התוכנית שונתה כדי לאחזר את פרטי המשתמש שנרכשו ב-IAP בכותרות של בקשות, והתבנית מציגה כעת את הנתונים.
יש שתי שורות ב-main.py
שמקבלות את נתוני הזהות שסופקו על ידי ה-IAP:
user_email = request.headers.get('X-Goog-Authenticated-User-Email')
user_id = request.headers.get('X-Goog-Authenticated-User-ID')
הכותרות X-Goog-Authenticated-User-
ניתנות על ידי ה-IAP, והשמות אינם תלויי-רישיות, כך שניתן לתת אותן בכל האותיות הקטנות או באותיות הראשונות של המידע, אם זו ההעדפה. הצהרת ה-רינדור_תבנית כוללת עכשיו את הערכים הבאים, כדי שניתן יהיה להציג אותם:
page = render_template('index.html', email=user_email, id=user_id)
התבנית index.html יכולה להציג את הערכים האלה על ידי תחיית השמות בסוגריים מרובעים מסולסלים כפולים:
Hello, {{ email }}! Your persistent ID is {{ id }}.
כמו שאפשר לראות, הנתונים המוצגים קידומת accounts.google.com
: האפליקציה יכולה להסיר את הכול עד וכולל את הנקודתיים כדי לקבל את הערכים הגולמיים לפי הצורך.
השבתת IAP
מה קורה לאפליקציה הזו אם ה-IAP מושבתת, או שעוקפת באופן כלשהו (למשל, על ידי אפליקציות אחרות שפועלות באותו פרויקט בענן)? יש לכבות את התכונה IAP כדי לראות.
בחלון Cloud Console, לוחצים על סמל התפריט בפינה הימנית העליונה של הדף, לוחצים על Security (אבטחת) ואז על שרת proxy התומך בזהות. לוחצים על לחצן החלפת המצב IAP לצד האפליקציה App Engine כדי להשבית את ה-IAP. |
תופיע אזהרה כדי לאפשר לכל המשתמשים לגשת לאפליקציה.
מרעננים את דף האינטרנט של האפליקציה. אתם אמורים לראות את אותו דף, אבל ללא פרטי משתמש:
מכיוון שהאפליקציה לא מוגנת, משתמש יכול לשלוח בקשת אינטרנט שנראה כי היא עברה דרך IAP. לדוגמה, אפשר להריץ את פקודת ה-Curl הבאה מה-Cloud Shell כדי לעשות זאת (במקום <your-url-here> יש להזין את כתובת ה-URL הנכונה של האפליקציה):
curl -X GET <your-url-here> -H "X-Goog-Authenticated-User-Email: totally fake email"
דף האינטרנט יוצג בשורת הפקודה, וייראה כך:
<!doctype html> <html> <head> <title>IAP Hello User</title> </head> <body> <h1>Hello World</h1> <p> Hello, totally fake email! Your persistent ID is None. </p> <p> This is step 2 of the <em>User Authentication with IAP</em> codelab. </p> </body> </html>
אין דרך לדעת שהאפליקציה הושבתה או שעוקפת. במקרים שבהם קיים סיכון אפשרי, שלב 3 מציג פתרון.
אם קיים סיכון לכבות או לעקוף את ה-IAP, האפליקציה שלכם יכולה לבדוק אם פרטי הזהות שהיא מקבלת חוקיים. נעשה שימוש בכותרת שלישית של בקשת אינטרנט שנוספה על ידי ה-IAP, שנקראת X-Goog-IAP-JWT-Assertion
. הערך של הכותרת הוא אובייקט חתום הקריפטוגרפי שמכיל גם את נתוני הזהות של המשתמשים. האפליקציה שלך יכולה לאמת את החתימה הדיגיטלית ולהשתמש בנתונים המסופקים באובייקט הזה כדי להיות בטוח שה-IAP היא ללא שינוי.
אימות של חתימה דיגיטלית מחייב כמה שלבים נוספים, כמו אחזור הקבוצה האחרונה של המפתחות הציבוריים של Google. אתם יכולים להחליט אם האפליקציה צריכה את השלבים הנוספים האלה על סמך הסיכון שמישהו יוכל להשבית או לעקוף את ה-IAP ואת הרגישות של האפליקציה.
זהו שלב 3, והשלב האחרון הסתיים כש-Cloud Shell פתוח בתיקייה iap-codelab/2-HelloUser
. מעבר לתיקייה בשלב הזה:
cd ~/iap-codelab/3-HelloVerifiedUser
פריסה ל-App Engine
פורסים את האפליקציה לסביבת App Engine Standard עבור Python 3.7:
gcloud app deploy
כשמוצגת השאלה אם אתם רוצים להמשיך, מזינים Y כדי לאשר. בעוד מספר דקות הפריסה אמורה להסתיים. בזמן ההמתנה אפשר לבדוק את קובצי האפליקציה כפי שמתואר בהמשך.
כשהפריסה מוכנה, תופיע הודעה עם בקשה להציג את האפליקציה שלך עם gcloud app browse
. מזינים את הפקודה הזו. אם כרטיסייה חדשה לא נפתחת בדפדפן, מעתיקים את הקישור המוצג ופותחים אותו בכרטיסייה חדשה.
חשוב לזכור שהשבתת את ההגדרה IAP בשלב 2, ולכן לא סופקו נתוני IAP לאפליקציה. אתם אמורים לראות דף הדומה לדף הבא:
כמו קודם, יכול להיות שתצטרכו להמתין כמה דקות עד שהגרסה החדשה ביותר תהיה זמינה, כדי לראות את הגרסה החדשה של הדף.
הרכישה מהאפליקציה מושבתת, ולכן לא מוצגים פרטי משתמשים. עכשיו צריך להפעיל שוב את הרכישה מהאפליקציה.
בחלון Cloud Console, לוחצים על סמל התפריט בפינה הימנית העליונה של הדף, לוחצים על Security (אבטחת) ואז על שרת proxy התומך בזהות. לוחצים על לחצן החלפת המצב IAP ליד האפליקציה App Engine כדי להפעיל שוב את ה-IAP. |
יש לרענן את הדף. הדף אמור להיראות כך:
שימו לב שלכתובת האימייל שסופקה בשיטה המאומתת אין קידומת accounts.google.com:
.
אם ה-IAP כבויה או עוקפת, הנתונים המאומתים חסרים או לא חוקיים, מאחר שלא יכולה להיות להם חתימה חוקית אלא אם היא נוצרה על ידי הבעלים של המפתחות הפרטיים של Google.
בדיקת קובצי האפליקציה
תיקייה זו מכילה את אותה קבוצת קבצים כפי שהיא מוצגת בשלב 2, עם שני קבצים שהשתנו וקובץ חדש אחד. הקובץ החדש הוא auth.py
, שמכיל שיטה של user()
לאחזור ואימות של פרטי הזהות החתומים באופן קריפטוגרפי. הקבצים ששונו הם main.py
ו-templates/index.html
, ועכשיו הם משתמשים בתוצאות של השיטה הזו. הכותרות שלא אומתו כפי שהן מופיעות בשלב 2 מוצגות גם להשוואה.
הפונקציונליות החדשה כוללת בעיקר את הפונקציה user()
:
def user():
assertion = request.headers.get('X-Goog-IAP-JWT-Assertion')
if assertion is None:
return None, None
info = jwt.decode(
assertion,
keys(),
algorithms=['ES256'],
audience=audience()
)
return info['email'], info['sub']
assertion
הוא הנתונים עם חתימה קריפטוגרפית המסופקים בכותרת הבקשה שצוינה. הקוד משתמש בספרייה כדי לאמת ולפענח את הנתונים האלה. האימות משתמש במפתחות הציבוריים ש-Google מספקת כדי לבדוק את הנתונים שעליהם הוא חתום, ומודע לקהל שאליו הנתונים מוכנים (בעיקרון, הפרויקט ב-Google Cloud המוגן). פונקציות עזר keys()
ו-audience()
אוספות ומחזירות את הערכים האלה.
לאובייקט החתום יש שני קטעי נתונים שאנו צריכים: כתובת האימייל המאומתת וערך המזהה הייחודי (שמסופק בשדה sub
, עבור מנוי, שדה רגיל).
פעולה זו משלימה את שלב 3.
פרסתם אפליקציית אינטרנט ב-App Engine. בשלב 1, הגבלנו את הגישה לאפליקציה רק למשתמשים שבחרתם. בשלב 2, אחזרת וציינת את זהות המשתמשים שהעניקו גישה לאפליקציה לאפליקציה שלך, וראתה איך המידע הזה עשוי להיות מזויף אם רכישות מהאפליקציה הושבתו או נעקפו. בשלב 3 אימתת טענות חתימה קריפטוגרפיות לגבי זהות המשתמש, שלא ניתן לזייף אותן.
המשאבים היחידים ב-Google Cloud Platform שבהם השתמשתם ב-Codelab הזה הם מופעים של App Engine. בכל פעם שפיתחתם את האפליקציה, נוצרה גרסה חדשה והיא ממשיכה להתקיים עד למחיקה. לצאת מהמעבדה כדי למחוק את הפרויקט ואת כל המשאבים שהוא מכיל.