הגדרת סודות (דור ראשון)
אתם יכולים להשתמש ב-Secret Manager כדי לאחסן באופן מאובטח מפתחות API, סיסמאות ומידע רגיש אחר. במדריך הזה מוסבר איך להגדיר פונקציות של Cloud Run כדי לגשת לסודות ששמורים ב-Secret Manager.
במסמך הזה מוסברות שתי הדרכים להעביר סוד לפונקציה:
טעינת הסוד כנפח. כך הסוד יהיה זמין לפונקציה כקובץ. אם מפנים לסוד כאל נפח, הפונקציה ניגשת לערך הסוד מ-Secret Manager בכל פעם שהקובץ נקרא מהדיסק. לכן, אם רוצים להפנות לגרסה העדכנית של הסוד ולא לגרסה מוצמדת של הסוד, כדאי להשתמש באסטרטגיה של צירוף כנפח. השיטה הזו מתאימה גם אם אתם מתכננים להטמיע רוטציה של סודות.
העברת הסוד כמשתנה סביבה. הערכים של משתני הסביבה נפתרים בזמן הפעלת המופע, ולכן אם משתמשים בשיטה הזו, מומלץ להפנות לגרסה מוצמדת של הסוד במקום להפנות לגרסה האחרונה של הסוד.
במאמר סקירה כללית על Secret Manager תוכלו לקרוא מידע נוסף על השימוש בשירות. במאמר יצירת סוד מוסבר איך ליצור סודות ולקבל אליהם גישה.
לפני שמתחילים
מפעילים את Secret Manager API, אם הוא עדיין לא מופעל.
תפקידים שנדרשים להפעלת ממשקי API
כדי להפעיל ממשקי API, נדרשת ההרשאה
serviceusage.services.enable. אם יצרתם את הפרויקט, סביר להניח שכבר יש לכם את ההרשאה הזו דרך התפקיד 'בעלים' (roles/owner). אחרת, תוכלו לקבל את ההרשאה הזו דרך התפקיד 'אדמין בממשק Service Usage' (roles/serviceusage.serviceUsageAdmin). איך מקצים תפקידים- אם עדיין לא עשיתם זאת, צרו סוד ב-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 functions במסוף Google Cloud :
כניסה לדף Cloud Run functionsלוחצים על השם של הפונקציה שרוצים לתת לה גישה לסוד.
לוחצים על 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.
בוחרים את שיטת ההפניה לסוד. אפשר לצרף את הסוד כנפח או לחשוף את הסוד כמשתנה סביבה.
כדי לצרף את הסוד כנפח:
בוחרים באפשרות Mounted as volume (התקנה כנפח).
בשדה נתיב ההרכבה, מזינים את נתיב ההרכבה של הסוד הזה. זוהי הספרייה שבה ממוקמות כל הגרסאות של הסוד.
בשדה 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 functions במסוף Google Cloud :
כניסה לדף Cloud Run functionsלוחצים על שם הפונקציה כדי להסיר אחד מהסודות שלה.
לוחצים על 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 או ה-CLI של gcloud:
המסוף
נכנסים לדף Cloud Run functions במסוף Google Cloud :
כניסה לדף Cloud Run functionsלוחצים על שם הפונקציה כדי לראות את הסודות הזמינים שלה.
לוחצים על Edit.
לוחצים על הגדרות של זמן ריצה, build וחיבורים כדי להרחיב את אפשרויות ההגדרה המתקדמות.
לוחצים על אבטחה כדי לפתוח את הכרטיסייה 'אבטחה'.
בכרטיסייה 'אבטחה' מפורטים הסודות שהפונקציה יכולה לגשת אליהם.
gcloud
כדי לראות אילו סודות זמינים לפונקציה, משתמשים בפקודה gcloud functions describe:
gcloud functions describe FUNCTION_NAME
מחליפים את FUNCTION_NAME בשם הפונקציה.
המאמרים הבאים
- מומלץ לפתח פונקציות שמשתמשות ב-Secret Manager באמצעות ספריות הלקוח של Secret Manager.