הגדרת סודות עבור מופעים

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

אפשר להפוך סוד לזמין למאגרי התגים באחת מהדרכים הבאות:

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

מידע נוסף זמין במאמר בנושא שיטות מומלצות לשימוש ב-Secret Manager.

איך מתבצעת בדיקה של סודות בזמן הפריסה ובזמן הריצה

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

במהלך זמן הריצה, כשהמופעים מופעלים:

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

בעלות על נפח האחסון

הבעלות על נפח סודי ב-Cloud Run משתנה בהתאם לסביבת ההפעלה ולסוג הפריסה.

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

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

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

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

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

    להפעלת ה-API

  2. משתמשים בסוד קיים או יוצרים סוד ב-Secret Manager, כמו שמתואר במאמר יצירת סוד.

התפקידים הנדרשים

כדי לקבל את ההרשאות שדרושות להגדרת סודות, אתם צריכים לבקש מהאדמין להקצות לכם את תפקידי ה-IAM הבאים:

כדי לאפשר ל-Cloud Run לגשת לסוד, לזהות השירות צריכה להיות ההרשאה הבאה:

הוראות להוספת חשבון המשתמש של השירות לתפקיד Secret Accessor ב-Secret Manager מופיעות במאמר ניהול הגישה לסודות.

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

הפיכת סוד לנגיש ל-Cloud Run

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

gcloud

  • כדי לחשוף את הסוד כמשתנה סביבה כשפורסים מופע, מריצים את הפקודה הבאה:

    gcloud beta run instances deploy INSTANCE \
      --image IMAGE_URL \
      --update-secrets=ENV_VAR_NAME=SECRET_NAME:VERSION

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

    • INSTANCE: השם של המכונה.
    • IMAGE_URL: הפניה לתמונת המאגר, כמו us-docker.pkg.dev/cloudrun/container/hello:latest.
    • ENV_VAR_NAME: השם של משתנה הסביבה שרוצים להשתמש בו עם הסוד.
    • SECRET_NAME: שם הסוד באותו פרויקט, לדוגמה mysecret.
    • VERSION: גרסת הסוד. משתמשים ב-latest כדי לציין את הגרסה האחרונה, או במספר – לדוגמה, 2.
  • כדי לעדכן כמה סודות בו-זמנית, מפרידים בין אפשרויות ההגדרה של כל סוד באמצעות פסיק. הפקודה הבאה מעדכנת סוד אחד שמוטמע כנפח וסוד אחר שמוצג כמשתנה סביבתי. כדי לעדכן סודות קיימים, מריצים את הפקודה הבאה:

    gcloud beta run instances deploy INSTANCE \
    --image IMAGE_URL \
    --update-secrets=PATH=SECRET_NAME:VERSION,ENV_VAR_NAME=SECRET_NAME:VERSION
  • כדי לנקות סודות קיימים ולהפוך סוד חדש לנגיש למופע, משתמשים בדגל --set-secrets:

    gcloud beta run instances update INSTANCE \
     --set-secrets="ENV_VAR_NAME=SECRET_NAME:VERSION"

YAML

  1. אם אתם יוצרים מכונה חדשה, דלגו על השלב הזה. אם אתם מעדכנים מופע קיים, אתם צריכים להוריד את הגדרות ה-YAML שלו:

    gcloud beta run instances describe INSTANCE --format export > instance.yaml
  2. לסודות שנחשפים כמשתני סביבה:

    apiVersion: run.googleapis.com/v1
    kind: Instance
    metadata:
      name: INSTANCE
      annotations:
        run.googleapis.com/launch-stage: BETA
    spec:
      containers:
      - image: IMAGE_URL
        env:
        - name: ENV_VAR
          valueFrom:
            secretKeyRef:
              key: SECRET_VERSION
              name: SECRET_NAME

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

    • INSTANCE: השם של מופע Cloud Run.
    • IMAGE_URL: הפניה לקובץ אימג' בקונטיינר, כמו us-docker.pkg.dev/cloudrun/container/hello:latest.
    • ENV_VAR: השם של משתנה הסביבה.
    • SECRET_VERSION: גרסת הסוד. משתמשים ב-latest כדי לציין את הגרסה האחרונה, או במספר – לדוגמה, 2.
    • SECRET_NAME: שם הסוד, לדוגמה, mysecret.
  3. לסודות שמוצמדים כנתיבי קבצים:

    apiVersion: run.googleapis.com/v1
    kind: Instance
    metadata:
      name: INSTANCE
      annotations:
        run.googleapis.com/launch-stage: BETA
    spec:
      containers:
      - image: IMAGE_URL
        volumeMounts:
        - name: VOLUME_NAME
          mountPath: MOUNT_PATH
      volumes:
      - name: VOLUME_NAME
        secret:
          secretName: SECRET_NAME
          items:
          - key: SECRET_VERSION
            path: SECRET_NAME

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

    • INSTANCE: השם של מופע Cloud Run.
    • IMAGE_URL: הפניה לתמונת המאגר, כמו us-docker.pkg.dev/cloudrun/container/hello:latest.
    • VOLUME_NAME: כל שם שרוצים לתת לנפח האחסון.
    • MOUNT_PATH: הנתיב היחסי שבו אתם מטמיעים את אמצעי האחסון. לדוגמה, /mnt/my-volume.
    • SECRET_NAME: שם הסוד, לדוגמה, mysecret.
    • SECRET_VERSION: גרסת הסוד. משתמשים ב-latest כדי לציין את הגרסה האחרונה, או במספר – לדוגמה, 2.
  4. מחליפים את המכונה בהגדרה החדשה שלה באמצעות הפקודה הבאה:

    gcloud beta run services replace service.yaml

הפניה לסודות מפרויקטים אחרים

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

gcloud

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

gcloud beta run instances deploy INSTANCE \
    --image IMAGE_URL \
    --update-secrets=ENV_VAR_NAME=projects/PROJECT_NUMBER/secrets/SECRET_NAME:VERSION

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

  • INSTANCE: השם של המכונה.
  • IMAGE_URL: הפניה לתמונת המאגר, כמו us-docker.pkg.dev/cloudrun/container/hello:latest.
  • PROJECT_NUMBER: מספר הפרויקט שבו נוצר הסוד.
  • SECRET_NAME: שם הסוד, לדוגמה, mysecret.
  • VERSION: גרסת הסוד. משתמשים ב-latest כדי לציין את הגרסה האחרונה, או במספר – לדוגמה, 2.

YAML

  1. אם אתם יוצרים מכונה חדשה, דלגו על השלב הזה. אם אתם מעדכנים מופע קיים, אתם צריכים להוריד את הגדרות ה-YAML שלו:

    gcloud beta run instances describe INSTANCE --format export > instance.yaml
  2. לסודות שנחשפים כמשתני סביבה:

    apiVersion: run.googleapis.com/v1
    kind: Instance
    metadata:
      name: INSTANCE
      annotations:
        run.googleapis.com/launch-stage: BETA
        metadata:
          annotations:
            run.googleapis.com/secrets: SECRET_LOOKUP_NAME:projects/PROJECT_NUMBER/secrets/SECRET_NAME
        spec:
          containers:
          - image: IMAGE_URL
            env:
            - name: ENV_VAR
              valueFrom:
                secretKeyRef:
                  key: SECRET_VERSION
                  name: SECRET_LOOKUP_NAME

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

    • INSTANCE: השם של מופע Cloud Run.
    • SECRET_LOOKUP_NAME: כל שם עם תחביר תקין של שם סוד – לדוגמה, my-secret. יכול להיות שזה יהיה אותו שם כמו SECRET_NAME.
    • PROJECT_NUMBER: מספר הפרויקט שבו נוצר הסוד.
    • SECRET_NAME: שם הסוד, לדוגמה, mysecret.
    • IMAGE_URL: הפניה לקובץ אימג' בקונטיינר, כמו us-docker.pkg.dev/cloudrun/container/hello:latest.
    • ENV_VAR: השם של משתנה הסביבה.
    • SECRET_VERSION: גרסת הסוד. משתמשים ב-latest כדי לציין את הגרסה האחרונה, או במספר – לדוגמה, 2.
  3. לסודות שמוצמדים כנתיבי קבצים:

    apiVersion: run.googleapis.com/v1
    kind: Instance
    metadata:
      name: INSTANCE
      annotations:
        run.googleapis.com/launch-stage: BETA
    metadata:
      annotations:
        run.googleapis.com/secrets: SECRET_LOOKUP_NAME:projects/PROJECT_NUMBER/secrets/SECRET_NAME
    spec:
      containers:
      - image: IMAGE_URL
        volumeMounts:
        - name: VOLUME_NAME
          mountPath: MOUNT_PATH
      volumes:
      - name: VOLUME_NAME
        secret:
          secretName: SECRET_NAME
          items:
          - key: SECRET_VERSION
            path: SECRET_LOOKUP_NAME

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

    • INSTANCE: השם של מופע Cloud Run.
    • SECRET_LOOKUP_NAME: כל שם שתחביר השם הסודי שלו תקין, לדוגמה my-secret. הערך יכול להיות זהה לערך של SECRET_NAME.
    • PROJECT_NUMBER: מספר הפרויקט שבו נוצר הסוד.
    • SECRET_NAME: שם הסוד, לדוגמה, mysecret.
    • IMAGE_URL: הפניה לתמונת המאגר, כמו us-docker.pkg.dev/cloudrun/container/hello:latest.
    • VOLUME_NAME: כל שם שרוצים לתת לנפח האחסון.
    • MOUNT_PATH: הנתיב היחסי שבו אתם מטמיעים את אמצעי האחסון. לדוגמה, /mnt/my-volume.
    • SECRET_VERSION: גרסת הסוד. משתמשים ב-latest כדי לציין את הגרסה האחרונה, או במספר – לדוגמה, 2.
  4. מחליפים את המכונה בהגדרה החדשה שלה באמצעות הפקודה הבאה:

    gcloud beta run instances replace instance.yaml

הצגת הגדרות הסודות

כדי לראות את הגדרות הסודות הנוכחיות של מופע Cloud Run:

gcloud

  1. משתמשים בפקודה הבאה:

    gcloud beta run instances describe INSTANCE
  2. מחפשים את הגדרת הסודות בהגדרה שמוחזרת.

הסרת סודות ממופע

אפשר להסיר סודות ממופע באמצעות ה-CLI של gcloud:

gcloud

אפשר להסיר את כל הסודות ממופע או לציין סוד אחד או יותר להסרה.

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

  gcloud beta run instances deploy INSTANCE --image IMAGE_URL \
      --clear-secrets

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

  • INSTANCE: השם של המכונה.
  • IMAGE_URL: הפניה לתמונת המאגר, כמו us-docker.pkg.dev/cloudrun/container/hello:latest.

כדי לציין רשימה של סודות להסרה, משתמשים בדגל --remove-secrets. הפקודה הבאה מסירה סוד אחד שמוטמע כנפח וסוד אחר שמוצג כמשתנה סביבה:

  gcloud beta run instances deploy INSTANCE --image IMAGE_URL \
      --remove-secrets=ENV_VAR_NAME,SECRET_FILE_PATH

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

  • INSTANCE: השם של המכונה.
  • IMAGE_URL: הפניה לתמונת המאגר, כמו us-docker.pkg.dev/cloudrun/container/hello:latest.
  • ENV_VAR_NAME: השם של משתנה הסביבה.
  • SECRET_FILE_PATH: הנתיב המלא של הסוד. לדוגמה, /mnt/secrets/primary/latest, כאשר /mnt/secrets/primary/ הוא נתיב ההרכבה ו-latest הוא נתיב הסוד. אפשר גם לציין את הנתיבים של הנקודה לחיבור ושל הסוד בנפרד:

    --set-secrets MOUNT_PATH:SECRET_PATH=SECRET:VERSION

שימוש בסודות בקוד

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

מגבלות

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

נתיבים אסורים

  • ב-Cloud Run אי אפשר לטעון סודות בנתיבים /dev, /proc ו-/sys או בספריות המשנה שלהם.
  • ב-Cloud Run אי אפשר לטעון כמה סודות באותה נתיב, כי אי אפשר לטעון שני כרכים באותו מיקום.

סודות אזוריים

‫Cloud Run לא תומך בסודות אזוריים.

שינוי של ספרייה

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

לדוגמה, אם סוד בשם my-secret מותקן בנתיב /etc/app_data, כל התוכן בספרייה app_data יידרס, והקובץ היחיד שיוצג הוא /etc/app_data/my-secret.

כדי להימנע משכתוב של קבצים בספרייה קיימת, יוצרים ספרייה חדשה להרכבת הסוד, למשל /etc/app_data/secrets, כך שנתיב ההרכבה של הסוד יהיה /etc/app_data/secrets/my-secret.