Secret Manager のシークレットを使用する

このページでは、Cloud Build にパスワードや API キーなどの機密情報を含める方法について説明します。

シークレット マネージャーは、API キー、パスワード、その他の機密データを安全に保存する Google Cloud サービスです。ビルドに機密情報を含めるには、Secret Manager に情報を保存してから、Secret Manager からその情報にアクセスするようにビルドを構成します。

始める前に

  • Enable the Cloud Build and Secret Manager APIs.

    Enable the APIs

  • このガイドのコマンドラインの例を使用するには、Google Cloud CLI をインストールして構成します。

  • Secret Manager にシークレットを保存していることを確認します。手順については、シークレットの作成をご覧ください。

    • シークレットの名前とシークレットのバージョンをメモします。シークレットにアクセスするように Cloud Build を構成するには、この情報が必要です。

必要な IAM 権限

ビルドに使用しているサービス アカウントにシークレットの Secret Manager シークレット アクセサー(roles/secretmanager.secretAccessor IAM ロールを付与するには:

  1. Google Cloud コンソールで [シークレット マネージャー] ページを開きます。

    シークレット マネージャー ページに移動

  2. ビルドで使用するシークレットのチェックボックスをオンにします。

  3. まだ開いていない場合は、[情報パネルを表示] をクリックしてパネルを開きます。

  4. パネルの [権限] で、[プリンシパルを追加] をクリックします。

  5. [新しいプリンシパル] フィールドに、お使いのサービス アカウントのメールアドレスを入力します。

  6. [ロールを選択] プルダウン ボックスで、[Secret Manager のシークレット アクセサー] を選択します。

  7. [保存] をクリックします。

Secret Manager から UTF-8 シークレットにアクセスできるようにビルドを構成する

  1. プロジェクトのルート ディレクトリに、cloudbuild.yaml または cloudbuild.json という名前の Cloud Build 構成ファイルを作成します。

  2. ビルド構成ファイルで、次のことを行います。

    • すべてのビルド steps の後に、availableSecrets フィールドを追加して、シークレットに使用するシークレット バージョンと環境変数を指定します。secretVersion フィールドの値には、置換変数を含めることができます。複数のシークレットを 1 つのビルドで指定できます。
    • シークレットを指定するビルドステップで、次のようにします。
      • ビルドステップで bash ツールを使用するには、bash を指す entrypoint フィールドを追加します。これは、シークレットの環境変数を参照するために必要です。
      • 環境変数を指定する secretEnv フィールドを追加します。
      • args フィールドに、最初の引数として -c フラグを追加します。-c の後に渡した文字列はすべてコマンドとして扱われます。-c を使用した bash コマンドの実行の詳細については、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 above commands with the following:

    • PROJECT_ID: The ID 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"
  }
  ]
}
}

上記のコマンドのプレースホルダ値を次のように置き換えます。

  • PROJECT_ID: シークレットを保存している Google Cloud プロジェクトの ID。
  • GITHUB_USERNAME: リポジトリ オーナーの GitHub ユーザー名。
  • REPO_NAME: GitHub リポジトリの名前。
  • HEAD_BRANCH: 変更が実装されるブランチの名前。同じネットワーク内のクロス リポジトリ pull リクエストの場合、username:branch のようなユーザーを持つ名前空間 head です。
  • BASE_BRANCH: 変更を取り込むブランチの名前。これは、現在のリポジトリの既存のブランチです。別のリポジトリのベースへのマージをリクエストする pull リクエストを 1 つのリポジトリに送信することはできません。
  • GH_TOKEN_SECRET_NAME: GitHub トークンに対応するシークレット名。
  • NEW_PR: 作成する新しい pull リクエスト。

Secret Manager から UTF-8 以外のシークレットにアクセスできるようにビルドを構成する

  1. ビルド構成ファイルに、シークレット マネージャーでシークレット バージョンにアクセスするビルドステップを追加し、ファイルに保存します。次のビルドステップでは、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. ビルド構成ファイルを使用して、コマンドラインを使用してビルドを開始するか、トリガーを使用してビルドを自動化します。

次のステップ