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

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

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

始める前に

  • Cloud Build and Secret Manager API を有効にします。

    API を有効にする

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

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

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

必要な IAM 権限

シークレットの Secret Manager のシークレット アクセサー(roles/secretmanager.secretAccessorの IAM ロールを Cloud Build サービス アカウントに付与します。

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

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

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

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

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

  5. [新しいメンバー] テキストボックスに、Cloud Build サービス アカウントのメールアドレスを PROJECT_NUMBER@cloudbuild.gserviceaccount.com の形式で入力します。PROJECT_NUMBER は、ビルドを実行しているプロジェクトのプロジェクト番号です。プロジェクト番号は [プロジェクトの設定] ページで確認できます。

  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 フィールドにシークレットを指定する場合は、$$ を接頭辞とする環境変数を使用して指定します。

    次のビルド構成ファイルの例は、Secret Manager に保存されている Docker のユーザー名とパスワードを使用して Docker にログインする方法を示します。

    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"
         }]
      }
    }
    

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

    • PROJECT_ID: シークレットを保存している Google Cloud プロジェクトの ID。
    • DOCKER_USERNAME_SECRET_NAME: Docker ユーザー名に対応するシークレット名。シークレット名は、Google Cloud コンソールの Secret Manager ページから取得できます。
    • DOCKER_USERNAME_SECRET_VERSION: Docker ユーザー名のシークレット バージョン。シークレットのバージョンを取得するには、Google Cloud コンソールの Secret Manager ページでシークレット名をクリックします。
    • DOCKER_PASSWORD_SECRET_NAME: Docker パスワードに対応するシークレット名。シークレット名は、Google Cloud コンソールの Secret Manager ページから取得できます。
    • DOCKER_PASSWORD_SECRET_VERSION: Docker パスワードのシークレット バージョン。シークレットのバージョンを取得するには、Google Cloud コンソールの Secret Manager ページでシークレット名をクリックします。
  3. ビルド構成ファイルを使用して、コマンドラインを使用してビルドを開始するか、トリガーを使用してビルドを自動化します。

例: スクリプトとプロセスからのシークレットへのアクセス

secretEnv フィールドは、シークレットの値を環境に追加し、スクリプトまたはプロセスから環境変数を介してこの値にアクセスできます。

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"
    }
  ]
}
}

次の main.py の内容はシークレットの最初の 5 文字を出力します。

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

例: Docker に対する認証

一部の状況では、Docker イメージを操作するために、ビルドを Docker に対して認証する必要があります。たとえば、ビルドで非公開イメージを pull し、非公開イメージまたは公開イメージを Docker Hub に push するには、Docker 認証が必要です。この場合、Docker のユーザー名とパスワードを Secret Manager に保存してから、Secret Manager からユーザー名とパスワードにアクセスするように Cloud Build を構成します。これを行う方法については、Docker Hub イメージの操作をご覧ください。

例: GitHub pull リクエストの作成

Secret Manager から機密情報にアクセスするようにビルドを構成するもう 1 つの例は、ビルドに応答して GitHub pull リクエストを作成することです。方法:

  • GitHub トークンを作成します。
  • Secret Manager に GitHub トークンを保存します。
  • ビルド構成ファイルに次の操作を行います。
    • すべてのビルドの steps が完了したら、availableSecrets フィールドを追加して、GitHub トークンに使用するシークレットのバージョンと環境変数を指定します。
    • GitHub pull リクエストを作成するコマンドを呼び出すビルドステップを追加します。
  • GitHub アプリトリガーを作成し、ビルド構成ファイルを使用してトリガーを呼び出します。

次の構成ファイルの例は、GitHub トークンを使用して GitHub pull リクエストを作成する方法を示しています。

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. ビルド構成ファイルを使用して、コマンドラインを使用してビルドを開始するか、トリガーを使用してビルドを自動化します。

次のステップ