אימות להפעלה (דור ראשון)
כדי להפעיל פונקציית Cloud Run מאומתת, הגורם המרכזי הבסיסי צריך לעמוד בדרישות הבאות:
- יש לכם הרשאה להפעיל את הפונקציה.
- מספק אסימון מזהה כשהוא מפעיל את הפונקציה.
מה זה פרינציפל? כפי שמתואר במאמר בנושא אבטחת פונקציות Cloud Run, פונקציות Cloud Run תומכות בשני סוגים שונים של זהויות, שנקראות גם גורמים ראשיים:
- חשבונות שירות: אלה חשבונות מיוחדים שמשמשים כזהות של ישות שאינה אדם, כמו פונקציה, אפליקציה או מכונה וירטואלית. הם מאפשרים לכם לאמת את הזהות של ישויות שאינן אנשים.
- חשבונות משתמשים: החשבונות האלה מייצגים אנשים, כבעלי חשבונות Google פרטיים או כחלק מישות בשליטת Google, כמו קבוצת Google.
בסקירה הכללית על IAM תוכלו לקרוא מידע נוסף על מושגי יסוד ב-IAM.
כדי להפעיל פונקציית Cloud Run מאומתת, לחשבון המשתמש צריכה להיות הרשאת ההפעלה של IAM:
cloudfunctions.functions.invoke. בדרך כלל זה קורה דרך התפקיד 'הפעלת פונקציות'.
כדי להעניק את ההרשאות האלה, משתמשים בפקודה
add-invoker-policy-binding
כמו שמוסבר במאמר בנושא אימות פונקציה לקריאות לפונקציה.
כדי לקבל הרשאה ליצור, לעדכן או לבצע פעולות ניהול אחרות בפונקציה, לחשבון המשתמש צריכים להיות תפקידים מתאימים. תפקידים כוללים הרשאות שמגדירות את הפעולות שהגורם המורשה יכול לבצע. מידע נוסף זמין במאמר שימוש ב-IAM כדי לאשר גישה.
יכול להיות שיהיו עוד מורכבויות בהפעלת פונקציה. פונקציות מבוססות-אירוע יכולות להיות מופעלות רק על ידי מקור האירוע שאליו הן רשומות, אבל פונקציות HTTP יכולות להיות מופעלות על ידי סוגים שונים של זהויות, שמקורן במקומות שונים. הגורם שמפעיל את הפונקציה יכול להיות מפתח שבודק את הפונקציה, או פונקציה או שירות אחרים שרוצים להשתמש בפונקציה. כברירת מחדל, כדי לאמת את הזהות שלהם, הגורמים האלה צריכים לספק טוקן מזהה עם הבקשה. בנוסף, לחשבון שבו משתמשים צריכות להיות ההרשאות המתאימות.
מידע נוסף על יצירה ושימוש באסימונים מזהים
דוגמאות לאימות
בקטע הזה מוצגות כמה דוגמאות שונות לאימות לצורך הפעלה.
דוגמה 1: אימות של בדיקות מפתחים
מפתחים צריכים גישה ליצירה, לעדכון ולמחיקה של פונקציות, והגישה הזו ניתנת באמצעות התהליך הרגיל (IAM).
אבל כמפתחים, יכול להיות שתצטרכו להפעיל את הפונקציות שלכם למטרות בדיקה. כדי להפעיל פונקציה באמצעות curl או כלים דומים, חשוב לשים לב לנקודות הבאות:
מקצים לחשבון המשתמש של פונקציות Cloud Run תפקיד שמכיל את הרשאת ההפעלה.
cloudfunctions.functions.invoke. בדרך כלל זה קורה דרך התפקיד 'הפעלת פונקציות'. כברירת מחדל, ההרשאה הזו מוקצית לתפקידים אדמין של פונקציות Cloud Run ומפתח של פונקציות Cloud Run. רשימה מלאה של התפקידים וההרשאות שמשויכות אליהם מופיעה במאמר תפקידי IAM בפונקציות של Cloud Run.
אם אתם עובדים מהמחשב המקומי, אתם צריכים לאתחל את Google Cloud CLI כדי להגדיר גישה לשורת הפקודה.
מצרפים לבקשה פרטי כניסה לאימות בתור אסימון מזהה שנוצר על ידי Google ומאוחסן בכותרת
Authorization. לדוגמה, כדי לקבל אסימון מזהה באמצעותgcloud, מריצים את הפקודה הבאה:curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" \ https://FUNCTION_URL
כאשר FUNCTION_URL הוא כתובת ה-URL של הפונקציה. אפשר לאחזר את כתובת ה-URL הזו מהדף פונקציות Cloud Run במסוףGoogle Cloud , או על ידי הרצת הפקודה
gcloud functions describeכמו שמוצג בשלב הראשון בדוגמה של פקודת הפריסה של Google Cloud CLI.
אתם יכולים להשתמש באסימונים שנוצרו על ידי gcloud כדי להפעיל פונקציות HTTP בכל פרויקט, כל עוד לחשבון שלכם יש הרשאה cloudfunctions.functions.invoke בפונקציה שמופעלת. למטרות פיתוח, משתמשים באסימונים מזהים שנוצרו על ידי gcloud. עם זאת, חשוב לזכור שלאסימונים כאלה אין טענת קהל, ולכן הם חשופים למתקפות ממסר. בסביבות ייצור, משתמשים באסימונים מזהים שהונפקו לחשבון שירות עם קהל מתאים שצוין. הגישה הזו משפרת את האבטחה כי היא מגבילה את השימוש באסימונים לשירות שאליו הם מיועדים בלבד.
כמו תמיד, מומלץ להקצות את ההרשאות המינימליות שנדרשות לפיתוח ולשימוש בפונקציות. חשוב לוודא שמדיניות IAM בפונקציות מוגבלת למספר המינימלי של משתמשים וחשבונות שירות.
דוגמה 2: אימות פונקציה לקריאות לפונקציות
כשיוצרים שירותים שמקשרים בין כמה פונקציות, מומלץ לוודא שכל פונקציה יכולה לשלוח בקשות רק לקבוצת משנה ספציפית של הפונקציות האחרות. לדוגמה, אם יש לכם פונקציה login, היא צריכה להיות מסוגלת לגשת לפונקציה user profiles, אבל כנראה שלא תהיה לה גישה לפונקציה search.
כדי להגדיר את פונקציית הקבלה כך שתקבל בקשות מפונקציית הפעלה ספציפית, צריך להקצות את תפקיד ההפעלה המתאים לחשבון השירות של פונקציית ההפעלה בפונקציית הקבלה. תפקיד ההפעלה הוא Cloud Run functions Invoker (roles/cloudfunctions.invoker):
המסוף
משתמשים ב-Invoker של פונקציות Cloud Run:
נכנסים למסוף Google Cloud :
לוחצים על תיבת הסימון לצד הפונקציה המקבלת. (לא לוחצים על הפונקציה עצמה).
לוחצים על הרשאות בחלק העליון של המסך. נפתחת החלונית הרשאות.
לוחצים על Add principal.
בשדה New principals, מזינים את הזהות של הפונקציה שקוראת. זו צריכה להיות כתובת אימייל של חשבון שירות.
בתפריט הנפתח Select a role, בוחרים את התפקיד Cloud Functions > Cloud Functions Invoker.
לוחצים על Save.
gcloud
משתמשים בפקודה gcloud functions add-invoker-policy-binding:
gcloud functions add-invoker-policy-binding RECEIVING_FUNCTION \ --member='serviceAccount:CALLING_FUNCTION_IDENTITY'
הפקודה add-invoker-policy-binding מוסיפה קישור של מדיניות IAM לתפקיד של הפעלת פונקציה, שמאפשר לחבר (חשבון משתמש) שצוין להפעיל את הפונקציה שצוינה. Google Cloud CLI מזהה באופן אוטומטי את יצירת הפונקציה ומוסיף את התפקיד הנכון של Invoker (cloudfunctions.invoker לדור הראשון).
מחליפים את מה שכתוב בשדות הבאים:
-
RECEIVING_FUNCTION: השם של הפונקציה המקבלת. -
CALLING_FUNCTION_IDENTITY: זהות הפונקציה שקוראת, כתובת אימייל של חשבון שירות.
מכיוון שהיא תפעיל את הפונקציה המקבלת, הפונקציה הקוראת צריכה לספק גם אסימון מזהה חתום על ידי Google לצורך אימות. התהליך כולל שני שלבים:
יוצרים אסימון מזהה חתום על ידי Google עם שדה הקהל (
aud) שמוגדר לכתובת ה-URL של הפונקציה המקבלת.כוללים את האסימון המזהה בכותרת
Authorization: Bearer ID_TOKENבבקשה לפונקציה.
הדרך הכי קלה ומהימנה לנהל את התהליך הזה היא להשתמש בספריות האימות, כמו שמוצג בהמשך, כדי ליצור את האסימון הזה ולהשתמש בו.
יצירת אסימונים מזהים
בקטע הזה מתוארות דרכים שונות ליצירת טוקן מזהה שנדרש לישות כדי להפעיל פונקציה.
אפשר לקבל גישה לא מאומתת ללא אסימון מזהה, אבל צריך להפעיל את האפשרות הזו. מידע נוסף זמין במאמר שימוש ב-IAM כדי לאשר גישה.
יצירת טוקנים באופן פרוגרמטי
אחרי שהקוד הבא יוצר אסימון מזהה, הוא מפעיל את פונקציית Cloud Run עם האסימון הזה בשמכם. הקוד הזה פועל בכל סביבה שבה הספריות יכולות לקבל פרטי כניסה לאימות, כולל סביבות שתומכות ב-Application Default Credentials מקומיים.
Node.js
Python
Go
Java
יצירת טוקנים באופן ידני
אם אתם מפעילים פונקציה ומסיבה כלשהי אתם לא יכולים להשתמש בספריות האימות, יש שתי דרכים לקבל את אסימון המזהה באופן ידני: באמצעות שרת המטא-נתונים של Compute או על ידי יצירת אסימון JWT בחתימה עצמית והחלפתו באסימון מזהה בחתימת Google.
שימוש בשרת מטא-נתונים
אתם יכולים להשתמש בשרת המטא-נתונים של Compute כדי לאחזר אסימוני מזהה עם קהל ספציפי, באופן הבא:
curl "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/identity?audience=AUDIENCE" \
-H "Metadata-Flavor: Google"
מחליפים את AUDIENCE בכתובת ה-URL של הפונקציה שרוצים להפעיל. אפשר לאחזר את כתובת ה-URL הזו כמו שמתואר בקטע אימות בדיקות של מפתחים למעלה.
החלפת JWT בחתימה עצמית באסימון מזהה עם חתימה של Google
מקצים את התפקיד Invoker (מפעיל) (
roles/cloudfunctions.invoker) לחשבון השירות של הפונקציה הקוראת בפונקציה המקבלת.יוצרים חשבון שירות ומפתח ומורידים את הקובץ עם המפתח הפרטי (בפורמט JSON) למארח שממנו הפונקציה או השירות שקוראים מבצעים את הבקשות.
יוצרים JWT עם הכותרת
{"alg":"RS256","typ":"JWT"}. המטען הייעודי (payload) צריך לכלול את התביעהtarget_audienceשמוגדרת לכתובת ה-URL של הפונקציה המקבלת, ואת התביעותissו-subשמוגדרות לכתובת האימייל של חשבון השירות שצוין למעלה. היא צריכה לכלול גם אתexpואת הטענותiat. הערך של טענתaudצריך להיותhttps://www.googleapis.com/oauth2/v4/token.משתמשים במפתח הפרטי שהורד למעלה כדי לחתום על ה-JWT.
באמצעות ה-JWT הזה, שולחים בקשת POST אל https://www.googleapis.com/oauth2/v4/token. נתוני האימות צריכים להיכלל בכותרת ובגוף הבקשה.
בכותרת:
Authorization: Bearer $JWT - where $JWT is the JWT you just created Content-Type: application/x-www-form-urlencodedבגוף ההודעה:
grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&assertion=$JWTמחליפים את
$JWTב-JWT שיצרתם.הפעולה הזו מחזירה אסימון JWT נוסף שכולל
id_tokenבחתימת Google.
שולחים את בקשת ה-GET/POST לפונקציית הקבלה. כוללים את האסימון המזהה שחתום על ידי Google בכותרת Authorization: Bearer ID_TOKEN_JWT בבקשה.