シークレットと認証情報の使用

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

ビルドに機密情報を含める前に、シークレット マネージャーに保存するか、Cloud Key Management Service を使用して暗号化し、暗号化した情報のみを Cloud Build に含める必要があります。シークレット マネージャーは、Cloud Build で機密データを管理するためのおすすめの方法です。既存のプロジェクトに引き続き Cloud KMS を使用しても構いませんが、新しいプロジェクトではシークレット マネージャーを使用します。

始める前に

このページで説明する gcloud コマンドを実行するには、gcloudコマンドライン ツールをインストールします。

  • すでに Cloud SDK をインストールしたことがある場合は、gcloud components update を実行して最新バージョンを使用していることを確認してください。

シークレット マネージャーの使用

シークレット マネージャーは、API キー、パスワード、その他の機密データを安全に保存する Google Cloud サービスです。

シークレット マネージャーにデータを保存し、そのデータを Cloud Build で使用するには:

  1. シークレット マネージャー API を有効にします。

    シークレット マネージャー API を有効にする

  2. Cloud Build サービス アカウントに Secret Accessor IAM ロールを付与します。

    1. Cloud Console で IAM ページを開きます。

      [IAM] ページを開く

    2. プロジェクトを選択し、[開く] をクリックします。

    3. 権限の表で、末尾が @cloudbuild.gserviceaccount.com のメールアドレスを見つけて、鉛筆アイコンをクリックします。

    4. Secret Manager Secret Accessor ロールを追加します。

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

  3. シークレット マネージャーにデータを保存する:

    1. Cloud Console の [シークレット マネージャー] ページに移動します。

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

    2. [シークレット マネージャー] ページで、[シークレットを作成] をクリックします。

    3. [シークレットの作成] ページの [名前] に「secret-name」と入力します。

    4. [シークレット値] フィールドにデータを入力します。

    5. [リージョン] セクションは変更しません。

    6. [シークレットを作成] ボタンをクリックします。

    gcloud コマンドライン ツールを使用したシークレット マネージャーの使用方法については、シークレット マネージャー クイックスタートをご覧ください。 特定のシークレットへのアクセス権を付与する方法については、シークレットへのアクセスの管理をご覧ください。

  4. ビルド構成ファイルに、シークレット マネージャーでシークレット バージョンにアクセスするビルドステップを追加し、ファイルに保存します。次のビルドステップでは、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"
        ]
      }
      ]
    }
    
  5. 復号されたデータを含むファイルをビルドステップで使用します。次のコード スニペットは、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"
         ]
      }
      ]
    }
    
  1. ビルド構成ファイルを使用して、ビルドを手動で開始するか、トリガーを使用してビルドを自動化します。

Cloud KMS の使用

Cloud KMS は、暗号鍵の管理と使用を可能にする Google Cloud サービスです。

Cloud KMS を使用して機密データを暗号化し、そのデータをビルド構成ファイルで使用するには:

  1. Cloud KMS API を有効化します。

    Cloud KMS API を有効化します。

  2. Cloud Build サービス アカウントに Cloud KMS CryptoKey Decrypter IAM ロールを付与します。

    1. Cloud Console で、Cloud Build の設定ページに移動します。

      設定ページを開く

    2. Cloud KMS CryptoKey Decrypter ロールを持つ行を見つけて、その StatusENABLED に設定します。

  3. ターミナル ウィンドウを開きます。

  4. 新しい Cloud KMS key-ringkeyring-name という名前で作成します。

      gcloud kms keyrings create keyring-name --location global
    
  5. key-ring keyring-name 用に新しい Cloud KMS key key-name を作成します。

      gcloud kms keys create key-name \
          --location global --keyring keyring-name \
          --purpose encryption
    
  6. 暗号化されたデータを使用するように Cloud Build を構成します。

    • 暗号化された変数を使用するには:

      1. key-namekeyring-name を使用して secret-name を暗号化します。暗号化された値は、Base64 でエンコードされた文字列です。secret-name に余分な文字(スペースや改行など)を含めないでください。-n フラグは、終了の改行を含めないように echo に指示します。

         echo -n secret-name | gcloud kms encrypt --plaintext-file=- \
             --ciphertext-file=- --location=global --keyring=keyring-name \
             --key=key-name | base64
        
      2. ビルド構成ファイルに secrets フィールドを追加して暗号化された値を指定し、CryptoKey を追加して復号します。次に、暗号化された変数を使用するビルドステップで、secretEnv フィールドを追加して変数を環境変数として指定します。secretEnv フィールドに変数の名前を含めます。変数の値、または同じ名前の非シークレット環境変数を指定すると、Cloud Build はエラーをスローします。

        YAML

         steps:
         - name: 'gcr.io/cloud-builders/docker'
           entrypoint: 'bash'
           args: ['-c', 'docker login --username=user-name --password=$$PASSWORD']
           secretEnv: ['PASSWORD']
         - name: 'gcr.io/cloud-builders/docker'
           args: ['push', 'user-name/myubuntu']
         secrets:
         - kmsKeyName: projects/project-id/locations/global/keyRings/keyring-name/cryptoKeys/key-name
           secretEnv:
             PASSWORD: 'encrypted-password'
        

        JSON

         {
           "steps": [
            {
              "name": "gcr.io/cloud-builders/docker",
              "entrypoint": "bash",
              "args": [
                "-c",
                "docker login --username=user-name --password=$$PASSWORD"
               ],
               "secretEnv": [
                 "PASSWORD"
                ]
            },
            {
              "name": "gcr.io/cloud-builders/docker",
              "args": [
                "push",
                "user-name/myubuntu"
               ]
            }
            ],
            "secrets": [
             {
               "kmsKeyName": "projects/project-id/locations/global/keyRings/keyring-name/cryptoKeys/key-name",
               "secretEnv": {
                 "PASSWORD": "encrypted-password"
                }
             }
             ]
         }
        
    • 暗号化されたファイルを使用するには:

      1. keyring-namekeyring-name を使用して secrets.json という名前のファイルを暗号化します。これにより、secrets.json.enc という名前の暗号化ファイルが生成されます。secrets.json は 64 KiB 以下でなければなりません。

         gcloud kms encrypt --plaintext-file=secrets.json \
             --ciphertext-file=secrets.json.enc \
             --location=global --keyring=keyring-name\
             --key=key-name
        
      2. ビルド リクエストで、復号された secrets.json ファイルとのやり取りをするビルドステップの前に、gcloud Cloud Build を呼び出し暗号鍵を使用して secrets.json.enc を復号するビルドステップを追加します。このビルドステップは、ファイルを暗号化するために使用するコマンドに似ています。

        YAML

         steps:
         - name: gcr.io/cloud-builders/gcloud
           args:
           - kms
           - decrypt
           - --ciphertext-file=secrets.json.enc
           - --plaintext-file=secrets.json
           - --location=global
           - --keyring=keyring-name
           - --key=key-name
           # more steps here
        

        JSON

         {
           "steps": [
            {
              "name": "gcr.io/cloud-builders/gcloud",
              "args": [
                "kms",
                "decrypt",
                "--ciphertext-file=secrets.json.enc",
                "--plaintext-file=secrets.json",
                "--location=global",
                "--keyring=keyring-name",
                "--key=key-name"
              ]
            }
            ]
         }
        

        このステップが完了すると、後続のすべてのステップで復号された secrets.json ファイルを使用できるようになります。たとえば、このファイル内のシークレットを使用して外部依存関係を取得できます。また、ビルドした Docker コンテナ イメージにシークレット トークンを含めることもできます。

  7. ビルド構成ファイルを使用して、ビルドを手動で開始するか、トリガーを使用してビルドを自動化します。

次のステップ