שימוש בסודות מ-Secret Manager

בדף הזה מוסבר איך לכלול מידע רגיש כמו סיסמאות ומפתחות API ב-Cloud Build.

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

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

  • מפעילים את Cloud Build API ואת Secret Manager API.

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

    כדי להפעיל ממשקי API, צריך את תפקיד ה-IAM 'אדמין של Service Usage' (roles/serviceusage.serviceUsageAdmin), שכולל את ההרשאה serviceusage.services.enable. איך מקצים תפקידים

    הפעלת ממשקי ה-API

  • כדי להשתמש בדוגמאות של שורת הפקודה במדריך הזה, צריך להתקין ולהגדיר את Google Cloud CLI.

  • חשוב לוודא שהסוד מאוחסן ב-Secret Manager. הוראות מפורטות מופיעות במאמר יצירת סוד.

    • רושמים את שם הסוד ואת גרסת הסוד. תצטרכו את המידע הזה כדי להגדיר את Cloud Build כך שתהיה לו גישה לסוד.

הרשאות IAM נדרשות

מקצים לחשבון השירות שבו משתמשים לבנייה את תפקיד ה-IAM‏ Secret Manager Secret Accessor (roles/secretmanager.secretAccessor) בשביל הסוד:

  1. פותחים את הדף Secret Manager במסוף Google Cloud :

    מעבר לדף Secret Manager

  2. מסמנים את התיבה של הסוד שרוצים להשתמש בו ב-build.

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

  4. בחלונית, בקטע Permissions, לוחצים על Add principal.

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

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

  7. לוחצים על Save.

הגדרת גרסאות build לגישה לסודות בקידוד UTF-8 מ-Secret Manager

  1. בתיקיית השורש של הפרויקט, יוצרים קובץ הגדרות של Cloud Build בשם cloudbuild.yaml או cloudbuild.json.

  2. בקובץ תצורת ה-build:

    • אחרי כל ה-build steps, מוסיפים שדה availableSecrets כדי לציין את גרסת הסוד ואת משתני הסביבה שבהם רוצים להשתמש בשביל הסוד. אפשר לכלול משתני החלפה בערך של השדה secretVersion. אפשר לציין יותר מסוד אחד ב-build.
    • בשלב הבנייה שבו רוצים לציין את הסוד:
      • כדי להשתמש בכלי bash בשלב build, מוסיפים שדה entrypoint שמפנה אל bash. חובה להשתמש בסימן $ כדי להפנות למשתנה הסביבה של הסוד.
      • מוסיפים שדה secretEnv שמציין את משתנה הסביבה.
      • בשדה args, מוסיפים את הדגל -c כארגומנט הראשון. כל מחרוזת שמעבירים אחרי -c נחשבת לפקודה. מידע נוסף על הרצת פקודות bash באמצעות -c זמין במסמכי התיעוד של bash.
      • כשמציינים את הסוד בשדה args, צריך לציין אותו באמצעות משתנה הסביבה עם הקידומת $$.

    The following example build config file shows how to login to Docker using the Docker username and password stored in Secret Manager.

    YAML

    steps:
    - name: 'gcr.io/cloud-builders/docker'
      entrypoint: 'bash'
      args: ['-c', 'docker login --username=$$USERNAME --password=$$PASSWORD']
      secretEnv: ['USERNAME', 'PASSWORD']
    availableSecrets:
      secretManager:
      - versionName: projects/PROJECT_ID/secrets/DOCKER_PASSWORD_SECRET_NAME/versions/DOCKER_PASSWORD_SECRET_VERSION
        env: 'PASSWORD'
      - versionName: projects/PROJECT_ID/secrets/DOCKER_USERNAME_SECRET_NAME/versions/DOCKER_USERNAME_SECRET_VERSION
        env: 'USERNAME'
    

    JSON

    {
      "steps": [
      {
        "name": "gcr.io/cloud-builders/docker",
        "entrypoint": "bash",
        "args": [
          "-c",
          "docker login --username=$$USERNAME --password=$$PASSWORD"
        ],
        "secretEnv": [
          "USERNAME",
          "PASSWORD"
        ]
      }
      ],
      "availableSecrets": {
        "secretManager": [{
          "versionName": "projects/PROJECT_ID/secrets/DOCKER_PASSWORD_SECRET_NAME/versions/DOCKER_PASSWORD_SECRET_VERSION",
          "env": "PASSWORD"
      }, {
        "versionName": "projects/PROJECT_ID/secrets/DOCKER_USERNAME_SECRET_NAME/versions/DOCKER_USERNAME_SECRET_VERSION",
        "env": "USERNAME"
         }]
      }
    }
    

    Replace the placeholder values in the preceding commands with the following:

    • PROJECT_ID: The project ID or project number of the Google Cloud project where you've stored your secrets.
    • DOCKER_USERNAME_SECRET_NAME: The secret name corresponding to your Docker username. You can get the secret name from the Secret Manager page in the Google Cloud console.
    • DOCKER_USERNAME_SECRET_VERSION: The secret version of your Docker username. You can get the secret version by clicking on a secret name on the Secret Manager page in the Google Cloud console.
    • DOCKER_PASSWORD_SECRET_NAME: The secret name corresponding to your Docker password. You can get the secret name from the Secret Manager page in the Google Cloud console.
    • DOCKER_PASSWORD_SECRET_VERSION: The secret version of your Docker password. You can get the secret version by clicking on a secret name on the Secret Manager page in the Google Cloud console.
  3. Use the build config file to start a build using the command line or to automate builds using triggers.

Example: Accessing secrets from scripts and processes

secretEnv field adds the value of the secret to the environment and you can access this value via environment variable from scripts or processes:

YAML

steps:
- name: python:slim
  entrypoint: python
  args: ['main.py']
  secretEnv: ['MYSECRET']
availableSecrets:
  secretManager:
  - versionName: projects/$PROJECT_ID/secrets/mySecret/versions/latest
    env: 'MYSECRET'

JSON

{
  "steps": [
  {
    "name": "python:slim",
    "entrypoint": "python",
    "args": [
        "main.py"
    ],
    "secretEnv": [
        "MYSECRET"
    ]
}
],
"availableSecrets": {
  "secretManager": [
    {
        "versionName": "projects/$PROJECT_ID/secrets/mySecret/versions/latest",
        "env": "MYSECRET"
    }
  ]
}
}

The following contents of main.py prints the first five characters of the secret:

import os
print(os.environ.get("MYSECRET", "Not Found")[:5], "...")

Example: authenticating to Docker

In some situations, before interacting with Docker images, your build would need to authenticate to Docker. For example, Docker authentication is required for builds to pull private images and push private or public images to Docker Hub. In these cases, you can store your Docker username and password in Secret Manager and then configure Cloud Build to access the username and password from Secret Manager. For instructions on doing this see Interacting with Docker Hub images.

Example: GitHub pull request creation

Another example where you might want to configure your build to access a sensitive information from Secret Manager is for creating a GitHub pull request in response to builds. To do this:

  • Create a GitHub token.
  • Store the GitHub token in Secret Manager.
  • In your build config file:
    • After all the build steps, add an availableSecrets field to specify the secret version and the environment variable to use for the GitHub token.
    • Add a build step to invoke the command to create a GitHub pull request.
  • Create a GitHub app trigger and use the build config file to invoke the trigger.

The following example config file shows how to create a GitHub pull request using the GitHub token:

YAML

steps:
- name: 'launcher.gcr.io/google/ubuntu1604'
  id: Create GitHub pull request
  entrypoint: bash
  args:
  - -c
  - curl -X POST -H "Authorization:Bearer $$GH_TOKEN" -H 'Accept:application/vnd.github.v3+json' https://api.github.com/repos/GITHUB_USERNAME/REPO_NAME/pulls -d '{"head":"HEAD_BRANCH","base":"BASE_BRANCH", "title":"NEW_PR"}'
  secretEnv: ['GH_TOKEN']
availableSecrets:
  secretManager:
  - versionName: projects/PROJECT_ID/secrets/GH_TOKEN_SECRET_NAME/versions/latest
    env: GH_TOKEN

JSON

{
  "steps": [
  {
    "name": "launcher.gcr.io/google/ubuntu1604",
    "id": "Create GitHub pull request",
    "entrypoint": "bash",
    "args": [
      "-c",
       "curl -X POST -H \"Authorization:Bearer $$GH_TOKEN\" -H 'Accept:application/vnd.github.v3+json' https://api.github.com/repos/GITHUB_USERNAME/REPO_NAME -d '{\"head\":\"HEAD_BRANCH\",\"base\":\"BASE_BRANCH\", \"title\":\"NEW_PR\"}'
    ],
    "secretEnv": ['GH_TOKEN']
}
],
"availableSecrets": {
  "secretManager": [
  {
    "versionName": "projects/PROJECT_ID/secrets/GH_TOKEN_SECRET_NAME/versions/latest",
    "env": "GH_TOKEN"
  }
  ]
}
}

מחליפים את ערכי ה-placeholder בפקודות הקודמות בערכים הבאים:

  • PROJECT_ID: מזהה הפרויקט או מספר הפרויקט של פרויקטGoogle Cloud שבו מאוחסנים הסודות.
  • GITHUB_USERNAME: שם המשתמש ב-GitHub של בעלי המאגר.
  • REPO_NAME: השם של מאגר GitHub.
  • HEAD_BRANCH: שם הענף שבו השינויים מיושמים. לגבי בקשות מיזוג ממאגרים שונים באותה רשת, מרחב השמות head עם משתמש כמו זה: username:branch.
  • BASE_BRANCH: שם הענף שאליו רוצים למשוך את השינויים. הערך הזה צריך להיות שם של ענף קיים במאגר הנוכחי. אי אפשר לשלוח בקשת משיכה למאגר אחד שכוללת בקשה למיזוג עם בסיס של מאגר אחר.
  • GH_TOKEN_SECRET_NAME: השם הסודי שמתאים לאסימון GitHub.
  • NEW_PR: בקשת המשיכה החדשה שרוצים ליצור.

הגדרת build כדי לגשת לסודות שאינם בפורמט UTF-8 מ-Secret Manager

  1. בקובץ הגדרות ה-build, מוסיפים שלב build כדי לגשת לגרסת הסוד ב-Secret Manager ולאחסן אותה בקובץ. שלב הבנייה הבא ניגש אל secret-name ושומר אותו בקובץ בשם decrypted-data.txt:

    YAML

    steps:
    - name: gcr.io/cloud-builders/gcloud
      entrypoint: 'bash'
      args: [ '-c', "gcloud secrets versions access latest --secret=secret-name --format='get(payload.data)' | tr '_-' '/+' | base64 -d > decrypted-data.txt" ]
    

    JSON

    {
      "steps": [
      {
        "name": "gcr.io/cloud-builders/gcloud",
        "entrypoint": "bash",
        "args": [
          "-c",
          "gcloud secrets versions access latest --secret=secret-name --format='get(payload.data)' | tr '_-' '/+' | base64 -d > decrypted-data.txt"
        ]
      }
      ]
    }
    
  2. משתמשים בקובץ עם הנתונים המפוענחים בשלב בנייה. בקטע הקוד הבא נעשה שימוש ב-decrypted-data.txt כדי להתחבר למאגר Docker פרטי:

    YAML

    steps:
    - name: gcr.io/cloud-builders/gcloud
      entrypoint: 'bash'
      args: [ '-c', "gcloud secrets versions access latest --secret=secret-name --format='get(payload.data)' | tr '_-' '/+' | base64 -d > decrypted-data.txt" ]
    - name: gcr.io/cloud-builders/docker
      entrypoint: 'bash'
      args: [ '-c', 'docker login --username=my-user --password-stdin < decrypted-data.txt']
    

    JSON

    {
      "steps": [
      {
        "name": "gcr.io/cloud-builders/gcloud",
        "entrypoint": "bash",
        "args": [
          "-c",
          "gcloud secrets versions access latest --secret=secret-name --format='get(payload.data)' | tr '_-' '/+' | base64 -d > password.txt"
         ]
      },
      {
        "name": "gcr.io/cloud-builders/docker",
        "entrypoint": "bash",
        "args": [
          "-c",
          "docker login --username=my-user --password-stdin < decrypted-data.txt"
         ]
      }
      ]
    }
    
  3. אפשר להשתמש בקובץ ההגדרות של ה-build כדי להתחיל build באמצעות שורת הפקודה או כדי להפוך את ה-build לאוטומטי באמצעות טריגרים.

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