הגדרת סודות (דור ראשון)
אתם יכולים להשתמש ב-Secret Manager כדי לאחסן באופן מאובטח מפתחות API, סיסמאות ומידע רגיש אחר. במדריך הזה מוסבר איך להגדיר פונקציות Cloud Run כדי לגשת לסודות ששמורים ב-Secret Manager.
במסמך הזה מוסברות שתי הדרכים להעביר סוד לפונקציה:
טעינת הסוד כנפח. הפעולה הזו הופכת את הסוד לזמין לפונקציה כקובץ. אם מפנים לסוד כאל נפח, הפונקציה ניגשת לערך הסוד מ-Secret Manager בכל פעם שהקובץ נקרא מהדיסק. לכן, אם רוצים להפנות לגרסה העדכנית של הסוד ולא לגרסה מוצמדת של הסוד, כדאי להשתמש באפשרות הזו. השיטה הזו מתאימה גם אם אתם מתכננים להטמיע רוטציה של סודות.
העברת הסוד כמשתנה סביבה. הערכים של משתני הסביבה נפתרים בזמן הפעלת המופע, ולכן אם משתמשים בשיטה הזו, מומלץ להפנות לגרסה מוצמדת של הסוד במקום להפנות לגרסה האחרונה של הסוד.
מידע נוסף על השימוש ב-Secret Manager זמין במאמר סקירה כללית על Secret Manager. במאמר יצירת סוד מוסבר איך ליצור סודות ולקבל אליהם גישה.
לפני שמתחילים
-
Enable the Secret Manager API.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles. - אם עדיין לא עשיתם זאת, יוצרים סוד ב-Secret Manager, כמו שמתואר במאמר יצירת סוד.
הענקת גישה לסודות
הפונקציה יכולה לגשת לסודות שנמצאים באותו פרויקט כמו הפונקציה, וגם לסודות שנמצאים בפרויקט אחר. כדי לגשת לסוד, צריך לתת לחשבון השירות של זמן הריצה של הפונקציה גישה לסוד.
כברירת מחדל, פונקציות Cloud Run משתמשות בחשבון השירות שמוגדר כברירת מחדל ב-App Engine כדי לבצע אימות מול Secret Manager. לשימוש בסביבת ייצור, Google ממליצה להגדיר את הפונקציה כך שתאומת באמצעות חשבון שירות בניהול המשתמש, שמוקצים לו התפקידים עם ההרשאות המצומצמות ביותר שנדרשות לביצוע המשימות של הפונקציה.
כדי להשתמש ב-Secret Manager עם פונקציות Cloud Run, צריך להקצות את התפקיד roles/secretmanager.secretAccessor לחשבון השירות שמשויך לפונקציה:
נכנסים לדף Secret Manager במסוף Google Cloud :
כניסה ל-Secret Managerלוחצים על תיבת הסימון לצד הסוד.
אם החלונית לא פתוחה, לוחצים על Show Info Panel כדי לפתוח אותה.
בחלונית המידע, לוחצים על Add principal.
בשדה New principals, מזינים את חשבון השירות שהפונקציה משתמשת בו לזהות שלה. חשבון השירות של הפונקציה הוא אחד מהבאים:
חשבון שירות בניהול המשתמש שהוקצה לפונקציה בזמן הפריסה. במאמר שימוש בחשבונות שירות נפרדים לפונקציה מוסבר איך פורסים פונקציה עם חשבון שירות שהמשתמשים מנהלים.
חשבון השירות שמוגדר כברירת מחדל ב-App Engine (לא מומלץ לשימוש בסביבת Production).
בתפריט הנפתח Select a role, בוחרים באפשרות Secret Manager ואז באפשרות Secret Manager Secret Accessor.
הכנת הפונקציה לגישה לסודות
יש שתי דרכים להעביר סוד לפונקציה:
- העברת הסוד כמשתנה סביבה.
- טעינת הסוד כנפח.
משתני סביבה
כדי להשתמש במשתני סביבה כדי להפוך סודות לזמינים לפונקציה:
- מגדירים משתנה סביבה של זמן ריצה במהלך פריסת הפונקציה.
- מאפשרים לפונקציה לגשת לסוד באמצעות משתנה סביבה.
- ניגשים למשתנה הסביבה באופן פרוגרמטי בזמן הריצה.
טעינת הסוד כנפח
כדי לטעון סוד כנפח:
יוצרים קובץ שמכיל את הסוד.
בוחרים ספרייה שלא נמצאת בשימוש ולא שייכת למערכת, כמו
/mnt/secrets, בתור נתיב ההרכבה של הסוד. כל הקבצים או תיקיות המשנה הקיימים בספרייה הזו, מלבד הסוד והגרסאות שלו, לא יהיו נגישים אחרי שהסוד יותקן.בזמן הריצה, קוראים את תוכן הקובץ באופן פרוגרמטי כדי לגשת לערך הסודי.
לדוגמה, אם הסוד הועלה ל-/mnt/secrets/secret1, הפונקציה צריכה לקרוא את הקובץ הזה. דוגמה לאופן קריאת הקובץ באופן סינכרוני באמצעות Node.js:
fs.readFileSync('/mnt/secrets/secret1')
הענקת גישה לסוד לפונקציה
כדי להפנות לסוד מפונקציה, קודם צריך להגדיר את הסוד כך שהפונקציה תוכל לגשת אליו. אפשר להעניק גישה לסוד לפונקציות חדשות או קיימות באמצעות מסוף Google Cloud או Google Cloud CLI:
המסוף
כדי להפוך סוד לנגיש לפונקציה:
נכנסים לדף פונקציות Cloud Run במסוף Google Cloud :
כניסה לדף פונקציות Cloud Runלוחצים על השם של הפונקציה שרוצים לתת לה גישה לסוד.
לוחצים על Edit.
לוחצים על Runtime, build ... (זמן ריצה, בנייה...) כדי להרחיב את אפשרויות ההגדרה המתקדמות.
לוחצים על Security and Image Repo (מאגר תמונות ואבטחה) כדי לפתוח את הכרטיסייה.
לוחצים על Add a Secret Reference (הוספת הפניה ל-Secret) כדי להגדיר Secret לפונקציה.
בוחרים את הסוד שרוצים להעניק לו גישה. אם צריך, יוצרים סוד.
כדי להפנות לסוד באותו פרויקט כמו הפונקציה:
- בוחרים את הסוד מהרשימה הנפתחת.
כדי להפנות לסוד מפרויקט אחר:
מוודאים שלחשבון השירות של הפרויקט הוענקה גישה לסוד.
בוחרים באפשרות הזנה ידנית של הסוד.
מזינים את מזהה המשאב של הסוד בפורמט הבא:
projects/PROJECT_ID/secrets/SECRET_NAMEמחליפים את מה שכתוב בשדות הבאים:
PROJECT_ID: מזהה הפרויקט שבו נמצא הסוד.
SECRET_NAME: השם של הסוד ב-Secret Manager.
בוחרים את שיטת ההפניה לסוד. אפשר לצרף את הסוד כנפח או לחשוף את הסוד כמשתנה סביבה.
כדי לטעון את הסוד כנפח:
בוחרים באפשרות העלאה כנפח.
בשדה נתיב להרכבה, מזינים את הנתיב להרכבה של הסוד הזה. זוהי הספרייה שבה ממוקמות כל הגרסאות של הסוד.
בשדה Path1, מזינים את שם הקובץ שרוצים לטעון. השם הזה מצורף לנתיב הטעינה מהשלב הקודם כדי ליצור את נתיב הטעינה המלא שבו הסוד שלכם נטען.
בתפריט הנפתח Version1, בוחרים את גרסת הסוד שאליה רוצים ליצור הפניה.
כדי לטעון גרסאות נוספות של הסוד הזה, לוחצים על +הוספה כדי להגדיר נתיבים נוספים ואת הגרסאות של הסוד הזה שרוצים לטעון בהם.
כדי לחשוף את הסוד כמשתנה סביבה:
בוחרים באפשרות Exposed as environment variable (חשיפה כמשתנה סביבה).
בשדה Name1, מזינים את השם של משתנה הסביבה.
בתפריט הנפתח Version1, בוחרים את גרסת הסוד שאליה רוצים ליצור הפניה.
כדי לחשוף גרסאות נוספות של הסוד הזה לפונקציה, לוחצים על +הוספה כדי להגדיר משתני סביבה נוספים ואת הגרסאות של הסוד הזה שייאוחסנו בהם.
לוחצים על סיום.
לוחצים על הבא.
לוחצים על פריסה.
עכשיו אפשר להפנות לקוד של הפונקציה את הסוד.
gcloud
כדי להעניק לפונקציה גישה לסוד, מזינים אחת מהפקודות הבאות.
כדי לטעון את הסוד כנפח, מזינים את הפקודה הבאה:
gcloud functions deploy FUNCTION_NAME \ --no-gen2 \ --runtime RUNTIME \ --set-secrets 'SECRET_FILE_PATH=SECRET:VERSION'מחליפים את מה שכתוב בשדות הבאים:
FUNCTION_NAME: השם של הפונקציה.
RUNTIME: סביבת זמן הריצה שבה הפונקציה תפעל.
SECRET_FILE_PATH: הנתיב המלא של הסוד. לדוגמה,
/mnt/secrets/primary/latest, כאשר/mnt/secrets/primary/הוא נתיב ההרכבה ו-latestהוא נתיב הסוד. אפשר גם לציין את נתיבי ההרכבה והסוד בנפרד:--set-secrets 'MOUNT_PATH:SECRET_PATH=SECRET:VERSION'SECRET: השם של הסוד ב-Secret Manager.
VERSION: הגרסה של הסוד שבה רוצים להשתמש. לדוגמה,
1אוlatest.
הדגל
--set-secretsמחליף סודות קיימים. כדי לשמור את הסודות הקיימים של הפונקציה, משתמשים בדגל--update-secretsבמקום זאת.כדי לחשוף את הסוד כמשתנה סביבה, מזינים את הפקודה הבאה:
gcloud functions deploy FUNCTION_NAME \ --no-gen2 \ --runtime RUNTIME \ --set-secrets 'ENV_VAR_NAME=SECRET:VERSION'מחליפים את מה שכתוב בשדות הבאים:
FUNCTION_NAME: השם של הפונקציה.
RUNTIME: סביבת זמן הריצה שבה הפונקציה תפעל.
ENV_VAR_NAME: השם של משתנה הסביבה.
SECRET: השם של הסוד ב-Secret Manager.
VERSION: הגרסה של הסוד שבה רוצים להשתמש. לדוגמה,
1אוlatest.
הדגל
--set-secretsמחליף סודות קיימים. כדי לשמור את הסודות הקיימים של הפונקציה, משתמשים בדגל--update-secretsבמקום זאת.אפשר להפנות לסוד מפרויקט אחר אם הוענקה גישה לסוד לחשבון השירות של הפונקציה. כדי להפנות לסוד מפרויקט אחר, משתמשים בנתיב המשאב של הסוד:
gcloud functions deploy FUNCTION_NAME \ --no-gen2 \ --runtime RUNTIME \ --update-secrets 'SECRET_FILE_PATH=SECRET_RESOURCE_PATH:VERSION'מחליפים את מה שכתוב בשדות הבאים:
FUNCTION_NAME: השם של הפונקציה.
SECRET_RESOURCE_PATH: נתיב המשאב של הסוד שנמצא בפרויקט אחר. נתיב המשאב הוא בפורמט הבא:
projects/PROJECT_ID/secrets/SECRET_NAMEמחליפים את מה שכתוב בשדות הבאים:
PROJECT_ID: מזהה הפרויקט שבו נמצא הסוד.
SECRET_NAME: השם של הסוד ב-Secret Manager.
RUNTIME: סביבת זמן הריצה שבה הפונקציה תפעל.
SECRET_FILE_PATH: הנתיב המלא של הסוד. לדוגמה,
/mnt/secrets/primary/latest, כאשר/mnt/secrets/primary/הוא נתיב ההרכבה ו-latestהוא נתיב הסוד. אפשר גם לציין את נתיבי ההרכבה והסוד בנפרד:--set-secrets 'MOUNT_PATH:SECRET_PATH=SECRET:VERSION'SECRET: השם של הסוד ב-Secret Manager.
VERSION: הגרסה של הסוד שבה רוצים להשתמש. לדוגמה,
1אוlatest.
אפשר לעדכן כמה סודות בבת אחת. מפרידים בין אפשרויות ההגדרה של כל סוד באמצעות פסיק. הפקודה הבאה מעדכנת סוד אחד שמוטמע כנפח וסוד אחר שמוצג כמשתנה סביבה.
כדי לעדכן סודות קיימים, מזינים את הפקודה הבאה:
gcloud functions deploy FUNCTION_NAME \ --no-gen2 \ --runtime RUNTIME \ --update-secrets 'ENV_VAR_NAME=SECRET:VERSION, \ SECRET_FILE_PATH=SECRET:VERSION'מחליפים את מה שכתוב בשדות הבאים:
FUNCTION_NAME: השם של הפונקציה.
RUNTIME: סביבת זמן הריצה שבה הפונקציה תפעל.
ENV_VAR_NAME: השם של משתנה הסביבה.
SECRET: השם של הסוד ב-Secret Manager.
VERSION: הגרסה של הסוד שבה רוצים להשתמש. לדוגמה,
1אוlatest.SECRET_FILE_PATH: הנתיב המלא של הסוד. לדוגמה,
/mnt/secrets/primary/latest, כאשר/mnt/secrets/primary/הוא נתיב ההרכבה ו-latestהוא נתיב הסוד. אפשר גם לציין את נתיבי ההרכבה והסוד בנפרד:--set-secrets 'MOUNT_PATH:SECRET_PATH=SECRET:VERSION'
הסרת סודות מפונקציה
אפשר להסיר סודות מפונקציה באמצעות מסוף Google Cloud או ה-CLI של gcloud:
המסוף
נכנסים לדף פונקציות Cloud Run במסוף Google Cloud :
כניסה לדף פונקציות Cloud Runלוחצים על שם הפונקציה כדי להסיר אחד מהסודות שלה.
לוחצים על Edit.
לוחצים על הגדרות של זמן ריצה, build וחיבורים כדי להרחיב את אפשרויות ההגדרה המתקדמות.
לוחצים על Security and Image Repo (אבטחה ומאגר תמונות) כדי לפתוח את הכרטיסייה 'אבטחה'.
מעבירים את העכבר מעל הסוד שרוצים להסיר ולוחצים על מחיקה.
לוחצים על הבא.
לוחצים על פריסה.
gcloud
אפשר להסיר את כל הסודות מפונקציה או לציין סוד אחד או יותר להסרה:
כדי להסיר את כל הסודות, מריצים את הפקודה הבאה:
gcloud functions deploy FUNCTION_NAME \ --no-gen2 \ --runtime RUNTIME \ --clear-secretsמחליפים את מה שכתוב בשדות הבאים:
FUNCTION_NAME: השם של הפונקציה.
RUNTIME: סביבת זמן הריצה שבה הפונקציה תפעל.
כל הסודות נמחקים מהפונקציה.
כדי לציין רשימה של סודות להסרה, משתמשים בדגל
--remove-secrets. הפקודה הבאה מסירה סוד אחד שצורף כנפח וסוד אחר שנחשף כמשתנה סביבה:gcloud functions deploy FUNCTION_NAME \ --no-gen2 \ --runtime RUNTIME \ --remove-secrets='ENV_VAR_NAME,SECRET_FILE_PATH, ...'מחליפים את מה שכתוב בשדות הבאים:
FUNCTION_NAME: השם של הפונקציה.
RUNTIME: סביבת זמן הריצה שבה הפונקציה תפעל.
ENV_VAR_NAME: השם של משתנה הסביבה.
SECRET_FILE_PATH: הנתיב המלא של הסוד. לדוגמה,
/mnt/secrets/primary/latest, כאשר/mnt/secrets/primary/הוא נתיב ההרכבה ו-latestהוא נתיב הסוד. אפשר גם לציין את נתיבי ההרכבה והסוד בנפרד:--set-secrets 'MOUNT_PATH:SECRET_PATH=SECRET:VERSION'
הסודות שצוינו יוסרו מהפונקציה.
הצגת סודות נגישים של הפונקציה
אפשר לראות לאילו סודות יש לפונקציה גישה באמצעות מסוף Google Cloud Google Cloud או ה-CLI של gcloud:
המסוף
נכנסים לדף פונקציות Cloud Run במסוף Google Cloud :
כניסה לדף פונקציות Cloud Runלוחצים על שם הפונקציה כדי לראות את הסודות הזמינים שלה.
לוחצים על Edit.
לוחצים על הגדרות של זמן ריצה, build וחיבורים כדי להרחיב את אפשרויות ההגדרה המתקדמות.
לוחצים על אבטחה כדי לפתוח את הכרטיסייה 'אבטחה'.
בכרטיסייה 'אבטחה' מפורטים הסודות שהפונקציה יכולה לגשת אליהם.
gcloud
כדי לראות אילו סודות זמינים לפונקציה, משתמשים בפקודה gcloud functions describe:
gcloud functions describe FUNCTION_NAME
מחליפים את FUNCTION_NAME בשם הפונקציה.
המאמרים הבאים
- מומלץ לפתח פונקציות שמשתמשות ב-Secret Manager באמצעות ספריות הלקוח של Secret Manager.