אימות להפעלה (דור ראשון)
כדי להפעיל פונקציית Cloud Run מאומתת, הגורם המרכזי הבסיסי צריך לעמוד בדרישות הבאות:
- יש לכם הרשאה להפעיל את הפונקציה.
- מספק אסימון מזהה כשהוא מפעיל את הפונקציה.
מה זה פרינציפל? כפי שמתואר במאמר בנושא אבטחת פונקציות Cloud Run, פונקציות Cloud Run תומכות בשני סוגים שונים של זהויות, שנקראות גם גורמים ראשיים:
- חשבונות שירות: אלה חשבונות מיוחדים שמשמשים כזהות של ישות שאינה אדם, כמו פונקציה, אפליקציה או מכונה וירטואלית. הם מאפשרים לכם לאמת את הזהות של ישויות שאינן אנשים.
- חשבונות משתמשים: החשבונות האלה מייצגים אנשים, כבעלי חשבונות Google פרטיים או כחלק מישות בשליטת Google, כמו קבוצת Google.
במאמר סקירה כללית על IAM מוסבר על מושגים בסיסיים ב-IAM.
כדי להפעיל פונקציית Cloud Run מאומתת, לחשבון המשתמש צריכה להיות הרשאת הפעלה של IAM:
-
cloudfunctions.functions.invoke. בדרך כלל זה נעשה באמצעות התפקיד Invoker.
כדי להעניק את ההרשאות האלה, משתמשים בפקודה add-invoker-policy-binding, כמו שמוסבר במאמר אימות פונקציה לקריאות לפונקציה.
כדי לקבל הרשאה ליצור פונקציה, לעדכן אותה או לבצע פעולות ניהול אחרות בפונקציה, לחשבון המשתמש צריכה להיות הרשאה מתאימה. תפקידים כוללים הרשאות שמגדירות את הפעולות שהמשתמש יכול לבצע. מידע נוסף זמין במאמר שימוש ב-IAM כדי לאשר גישה.
יכול להיות שיהיו עוד מורכבויות בהפעלת פונקציה. פונקציות מבוססות-אירוע יכולות להיות מופעלות רק על ידי מקור האירוע שאליו הן רשומות, אבל פונקציות HTTP יכולות להיות מופעלות על ידי סוגים שונים של זהויות, שמקורן במקומות שונים. הגורם שמפעיל את הפונקציה יכול להיות מפתח שבודק את הפונקציה, או פונקציה או שירות אחרים שרוצים להשתמש בפונקציה. כברירת מחדל, הזהויות האלה צריכות לספק טוקן ID עם הבקשה כדי לבצע אימות. בנוסף, לחשבון שבו משתמשים צריכות להיות ההרשאות המתאימות.
מידע נוסף על יצירה ושימוש באסימונים מזהים
דוגמאות לאימות
בקטע הזה מוצגות כמה דוגמאות שונות לאימות לצורך הפעלה.
דוגמה 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 functions במסוף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):
המסוף
משתמשים ב-Cloud Run functions Invoker:
נכנסים למסוף 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
המשך
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 בבקשה.