הגדרת סודות (דור ראשון)

אתם יכולים להשתמש ב-Secret Manager כדי לאחסן באופן מאובטח מפתחות API, סיסמאות ומידע רגיש אחר. במדריך הזה מוסבר איך להגדיר פונקציות של Cloud Run כדי לגשת לסודות ששמורים ב-Secret Manager.

במסמך הזה מוסברות שתי הדרכים להעביר סוד לפונקציה:

  • טעינת הסוד כנפח. הפעולה הזו מאפשרת לפונקציה לגשת לסוד כקובץ. אם מפנים לסוד כאל נפח, הפונקציה ניגשת לערך הסוד מ-Secret Manager בכל פעם שהקובץ נקרא מהדיסק. לכן, אם רוצים להפנות לגרסה העדכנית של הסוד ולא לגרסה מוצמדת של הסוד, כדאי להשתמש בהצמדה כנפח. השיטה הזו מתאימה גם אם אתם מתכננים להטמיע רוטציה של סודות.

  • העברת הסוד כמשתנה סביבה. הערכים של משתני הסביבה נפתרים בזמן הפעלת המופע, ולכן אם משתמשים בשיטה הזו, מומלץ להפנות לגרסה מוצמדת של הסוד במקום להפנות לגרסה האחרונה של הסוד.

מידע נוסף על השימוש ב-Secret Manager זמין במאמר סקירה כללית על Secret Manager. במאמר יצירת סוד מוסבר איך ליצור סודות ולקבל אליהם גישה.

לפני שמתחילים

  1. מפעילים את Secret Manager API.

    תפקידים שנדרשים להפעלת ממשקי API

    כדי להפעיל ממשקי API, נדרשת ההרשאה serviceusage.services.enable. אם יצרתם את הפרויקט, סביר להניח שכבר יש לכם את ההרשאה הזו דרך התפקיד 'בעלים' (roles/owner). אחרת, תוכלו לקבל את ההרשאה הזו דרך התפקיד 'אדמין בממשק 'שימוש בשירות'' (roles/serviceusage.serviceUsageAdmin). איך מקצים תפקידים

    להפעלת ה-API

  2. אם עדיין לא עשיתם זאת, יוצרים סוד ב-Secret Manager, כמו שמתואר במאמר יצירת סוד.

הענקת גישה לסודות

הפונקציה יכולה לגשת לסודות שנמצאים באותו פרויקט כמו הפונקציה, וגם לסודות שנמצאים בפרויקט אחר. כדי לגשת לסוד, צריך לתת לחשבון השירות של זמן הריצה של הפונקציה גישה לסוד.

כברירת מחדל, פונקציות Cloud Run משתמשות בחשבון השירות שמוגדר כברירת מחדל ב-App Engine כדי לבצע אימות מול Secret Manager. לשימוש בסביבת ייצור, Google ממליצה להגדיר את הפונקציה כך שתאומת באמצעות חשבון שירות בניהול המשתמש, שמוקצות לו ההרשאות המינימליות שנדרשות לביצוע המשימות של הפונקציה.

כדי להשתמש ב-Secret Manager עם פונקציות Cloud Run, צריך להקצות את התפקיד roles/secretmanager.secretAccessor לחשבון השירות שמשויך לפונקציה:

  1. נכנסים לדף Secret Manager במסוף Google Cloud :
    כניסה ל-Secret Manager

  2. לוחצים על תיבת הסימון לצד הסוד.

  3. אם החלונית לא פתוחה, לוחצים על Show Info Panel כדי לפתוח אותה.

  4. בחלונית המידע, לוחצים על Add principal.

  5. בשדה New principals, מזינים את חשבון השירות שהפונקציה משתמשת בו לזהות שלה. חשבון השירות של הפונקציה הוא אחד מהבאים:

  6. בתפריט הנפתח Select a role, בוחרים באפשרות Secret Manager ואז באפשרות Secret Manager Secret Accessor.

הכנת הפונקציה לגישה לסודות

יש שתי דרכים להפוך סוד לזמין לפונקציה:

  • העברת הסוד כמשתנה סביבה.
  • טעינת הסוד כנפח.

משתני סביבה

כדי להשתמש במשתני סביבה כדי להפוך סודות לזמינים לפונקציה:

  1. מגדירים משתנה סביבה של זמן ריצה במהלך פריסת הפונקציה.
  2. מאפשרים לפונקציה גישה לסוד באמצעות משתנה סביבה.
  3. ניגשים למשתנה הסביבה באופן פרוגרמטי בזמן הריצה.

טעינת הסוד כנפח

כדי לטעון סוד כנפח:

  1. יוצרים קובץ שמכיל את הסוד.

  2. בוחרים ספרייה שלא נמצאת בשימוש ולא שייכת למערכת, כמו /mnt/secrets, בתור נתיב ההרכבה של הסוד. כל הקבצים או תיקיות המשנה הקיימים מראש בספרייה הזו, מלבד הסוד והגרסאות שלו, לא יהיו נגישים יותר אחרי שהסוד יותקן.

  3. הופכים את הסוד לנגיש לפונקציה בתור נפח שצורף.

  4. בזמן הריצה, קוראים את תוכן הקובץ באופן פרוגרמטי כדי לגשת לערך הסודי.

לדוגמה, אם הסוד הועלה ל-/mnt/secrets/secret1, הפונקציה צריכה לקרוא את הקובץ הזה. דוגמה לאופן קריאת הקובץ באופן סינכרוני באמצעות Node.js:

fs.readFileSync('/mnt/secrets/secret1')

איך נותנים לפונקציה גישה לסוד

כדי להפנות לסוד מפונקציה, קודם צריך להעניק לפונקציה גישה לסוד. אפשר להעניק גישה לסוד לפונקציות חדשות או קיימות באמצעות מסוף Google Cloud או Google Cloud CLI:

המסוף

כדי להפוך סוד לנגיש לפונקציה:

  1. נכנסים לדף Cloud Run functions במסוף Google Cloud :
    כניסה לדף Cloud Run functions

  2. לוחצים על השם של הפונקציה שרוצים לתת לה גישה לסוד.

  3. לוחצים על Edit.

  4. לוחצים על Runtime, build ... כדי להרחיב את אפשרויות ההגדרה המתקדמות.

  5. לוחצים על Security and Image Repo (מאגר תמונות ואבטחה) כדי לפתוח את הכרטיסייה.

  6. לוחצים על Add a Secret Reference (הוספת הפניה ל-Secret) כדי להגדיר Secret לפונקציה.

  7. בוחרים את הסוד שרוצים להעניק לו גישה. אם צריך, יוצרים סוד.

    • כדי להפנות לסוד באותו פרויקט כמו הפונקציה:

      1. בוחרים את הסוד מהרשימה הנפתחת.
    • כדי להפנות לסוד מפרויקט אחר:

      1. מוודאים שלחשבון השירות של הפרויקט הוענקה גישה לסוד.

      2. בוחרים באפשרות הזנה ידנית של הסוד.

      3. מזינים את מזהה המשאב של הסוד בפורמט הבא:

        projects/PROJECT_ID/secrets/SECRET_NAME

        מחליפים את מה שכתוב בשדות הבאים:

        • PROJECT_ID: מזהה הפרויקט שבו נמצא הסוד.

        • SECRET_NAME: השם של הסוד ב-Secret Manager.

  8. בוחרים את שיטת ההפניה לסוד. אפשר לצרף את הסוד כנפח או לחשוף את הסוד כמשתנה סביבה.

    • כדי לטעון את הסוד כנפח:

      1. בוחרים באפשרות Mounted as volume (התקנה כנפח אחסון).

      2. בשדה Mount path, מזינים את נתיב ההרכבה של הסוד הזה. זוהי הספרייה שבה ממוקמות כל הגרסאות של הסוד.

      3. בשדה Path1, מזינים את שם הקובץ להרכבה. השם הזה מצורף לנתיב הטעינה מהשלב הקודם כדי ליצור את נתיב הטעינה המלא שבו הסוד שלכם נטען.

      4. בתפריט הנפתח Version1, בוחרים את הגרסה של הסוד שאליה רוצים ליצור הפניה.

      5. אפשר להוסיף עוד גרסאות של הסוד הזה על ידי לחיצה על +הוספה כדי להגדיר עוד נתיבים ואת הגרסאות של הסוד הזה שיועלו בהם.

    • כדי לחשוף את הסוד כמשתנה סביבה:

      1. בוחרים באפשרות Exposed as environment variable (חשיפה כמשתנה סביבה).

      2. בשדה Name1, מזינים את השם של משתנה הסביבה.

      3. בתפריט הנפתח Version1, בוחרים את הגרסה של הסוד שאליה רוצים ליצור הפניה.

      4. כדי לחשוף גרסאות נוספות של הסוד הזה לפונקציה, לוחצים על +הוספה כדי להגדיר משתני סביבה נוספים ואת הגרסאות של הסוד הזה שייאגרו בהם.

  9. לוחצים על סיום.

  10. לוחצים על הבא.

  11. לוחצים על פריסה.

עכשיו אפשר להפנות לקוד הפונקציה את הסוד.

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:

המסוף

  1. נכנסים לדף Cloud Run functions במסוף Google Cloud :
    כניסה לדף Cloud Run functions

  2. כדי להסיר אחד מהסודות של הפונקציה, לוחצים על שם הפונקציה.

  3. לוחצים על Edit.

  4. לוחצים על הגדרות של זמן ריצה, build וחיבורים כדי להרחיב את אפשרויות ההגדרה המתקדמות.

  5. לוחצים על Security and Image Repo (מאגר תמונות ואבטחה) כדי לפתוח את הכרטיסייה 'אבטחה'.

  6. מעבירים את סמן העכבר מעל הסוד שרוצים להסיר ולוחצים על מחיקה.

  7. לוחצים על הבא.

  8. לוחצים על פריסה.

gcloud

אפשר להסיר את כל הסודות מפונקציה או לציין סוד אחד או יותר להסרה:

  • כדי להסיר את כל הסודות, מריצים את הפקודה הבאה:

    gcloud functions deploy FUNCTION_NAME \
    --no-gen2 \
    --runtime RUNTIME \
    --clear-secrets
    

    מחליפים את מה שכתוב בשדות הבאים:

    כל הסודות נמחקים מהפונקציה.

  • כדי לציין רשימה של סודות להסרה, משתמשים בדגל --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 או ה-CLI של gcloud:

המסוף

  1. נכנסים לדף Cloud Run functions במסוף Google Cloud :
    כניסה לדף Cloud Run functions

  2. לוחצים על שם הפונקציה כדי לראות את הסודות הזמינים שלה.

  3. לוחצים על Edit.

  4. לוחצים על הגדרות של זמן ריצה, build וחיבורים כדי להרחיב את אפשרויות ההגדרה המתקדמות.

  5. לוחצים על אבטחה כדי לפתוח את הכרטיסייה 'אבטחה'.

בכרטיסייה 'אבטחה' מפורטים הסודות שהפונקציה יכולה לגשת אליהם.

gcloud

כדי לראות אילו סודות זמינים לפונקציה, משתמשים בפקודה gcloud functions describe:

gcloud functions describe FUNCTION_NAME

מחליפים את FUNCTION_NAME בשם הפונקציה.

המאמרים הבאים