Cloud KMS の暗号化された認証情報の使用

Cloud Key Management Service は、暗号鍵の管理と使用を可能にする Google Cloud サービスです。このページでは、Cloud Build で Cloud KMS から暗号化された情報を使用する方法について説明します。

始める前に

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

    API を有効にする

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

  • Cloud KMS を使用して機密情報を暗号化します。Cloud KMS は、暗号化されたコンテンツをファイルに保存します。

  • (省略可)暗号化されたデータを使用するようにビルドを構成するには、ENCRYPTED_FILE を base64 に変換します(この手順は、暗号化されたファイルを使用するビルド構成では必要ありません)。

        base64 ENCRYPTED_FILE
    

必要な IAM 権限

Cloud Build サービス アカウントに Cloud KMS CryptoKey 復号(roles/cloudkms.cryptoKeyDecrypter IAM ロールを付与します。

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

    設定ページを開く

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

暗号化されたデータを使用するようにビルドを構成する

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

  2. ビルド構成ファイルに次の操作を行います。

    • すべてのビルド steps の後に、暗号化された値を環境変数として指定するための availableSecrets フィールドと、それを復号するための kmsKeyName を追加します。 kmsKeyName の値で置換変数を使用できます。
    • シークレットを指定するビルドステップで、次のようにします。
      • ビルドステップで bash ツールを使用するには、bash を指す entrypoint フィールドを追加します。これは、シークレットの環境変数を参照するために必要です。
      • 暗号化された値の環境変数を指定する secretEnv フィールドを追加します。
      • args フィールドに、最初の引数として -c フラグを追加します。-c の後に渡した文字列はすべてコマンドとして扱われます。-c で bash コマンドを実行する方法の詳細については、bash のドキュメントをご覧ください。
      • 暗号化された値を args フィールドで指定する場合、$$ を接頭辞とする環境変数を使用して指定します。

    次のビルド構成ファイルの例は、Docker にログインして非公開イメージを pull する方法を示しています。

    YAML

     steps:
     - name: 'gcr.io/cloud-builders/docker'
       entrypoint: 'bash'
       args: ['-c', 'docker login --username=$$USERNAME --password=$$PASSWORD']
       secretEnv: ['USERNAME', 'PASSWORD']
     - name: 'gcr.io/cloud-builders/docker'
       entrypoint: 'bash'
       args: ['-c', 'docker pull $$USERNAME/IMAGE:TAG']
       secretEnv: ['USERNAME']
     availableSecrets:
       inline:
       - kmsKeyName: projects/PROJECT_ID/locations/global/keyRings/USERNAME_KEYRING_NAME/cryptoKeys/USERNAME_KEY_NAME
         envMap:
           USERNAME: 'ENCRYPTED_USERNAME'
       - kmsKeyName: projects/PROJECT_ID/locations/global/keyRings/PASSWORD_KEYRING_NAME/cryptoKeys/PASSWORD_KEY_NAME
         envMap:
           PASSWORD: 'ENCRYPTED_PASSWORD'
    

    JSON

    {
      "steps": [
      {
        "name": "gcr.io/cloud-builders/docker",
        "entrypoint": "bash",
        "args": [
          "-c",
          "docker login --username=$$USERNAME --password=$$PASSWORD"
        ],
        "secretEnv": [
          "USERNAME",
          "PASSWORD"
        ]
      },
      {
        "name": "gcr.io/cloud-builders/docker",
        "entrypoint": "bash",
        "args": [
          "-c",
          "docker pull $$USERNAME/REPOSITORY:TAG"
         ],
         "secretEnv": [
          "USERNAME"
        ]
      }
      ],
      "availableSecrets": {
        "inline": [{
          "kmsKeyName":  "projects/PROJECT_ID/locations/global/keyRings/USERNAME_KEYRING_NAME/cryptoKeys/USERNAME_KEY_NAME",
          "envMap": {
            "USERNAME": "ENCRYPTED_USERNAME"
           }
       },
       {
        "kmsKeyName": "projects/PROJECT_ID/locations/global/keyRings/PASSWORD_KEYRING_NAME/cryptoKeys/PASSWORD_KEY_NAME",
        "envMap": {
            "PASSWORD": "ENCRYPTED_PASSWORD"
           }
       }]
     }
    }
    

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

    • PROJECT_ID: Cloud KMS サービスを含む Cloud プロジェクトの ID。
    • USERNAME_KEYRING_NAME: Docker ユーザー名のキーリング名。
    • USERNAME_KEY_NAME: Docker ユーザー名のキー名。
    • ENCRYPTED_USERNAME: 暗号化された base64 形式の Docker ユーザー名。
    • PASSWORD_KEYRING_NAME: Docker パスワードのキーリング名。
    • PASSWORD_KEY_NAME: Docker パスワードのキー名。
    • ENCRYPTED_PASSWORD: 暗号化された base64 形式の Docker パスワード。
    • REPOSITORY: イメージを pull する Docker リポジトリの名前。
    • TAG: イメージのタグ名。

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

暗号化されたファイルを使用するようにビルドを構成する

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

  2. ビルド構成ファイルで、復号されたファイルを操作するビルドステップの前に、暗号鍵を使用して暗号化されたファイルを復号する gcloud ビルドステップを追加します。次のビルド構成ファイルの例は、Docker パスワードで暗号化されたファイルを使用して Docker にログインする方法を示しています。

    YAML

    steps:
    - name: gcr.io/cloud-builders/gcloud
      args:
      - kms
      - decrypt
      - "--ciphertext-file=ENCRYPTED_PASSWORD_FILE"
      - "--plaintext-file=PLAINTEXT_PASSWORD_FILE"
      - "--location=global"
      - "--keyring=KEYRING_NAME"
      - "--key=KEY_NAME"
    - name: gcr.io/cloud-builders/docker
      entrypoint: bash
      args:
      - "-c"
      - docker login --username=DOCKER_USERNAME --password-stdin < PLAINTEXT_PASSWORD_FILE
    

    JSON

    {
      "steps": [
      {
        "name": "gcr.io/cloud-builders/gcloud",
        "args": [
          "kms",
          "decrypt",
          "--ciphertext-file=ENCRYPTED_PASSWORD_FILE",
          "--plaintext-file=PLAINTEXT_PASSWORD_FILE",
          "--location=global",
          "--keyring=KEYRING_NAME",
          "--key=KEY_NAME"
        ]
      },
      {
        "name": "gcr.io/cloud-builders/docker",
        "entrypoint": "bash",
        "args": [
          "-c",
          "docker login --username=DOCKER_USERNAME --password-stdin < PLAINTEXT_PASSWORD_FILE"
        ]
       }
      ]
    }
    

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

    • KEYRING_NAME: Docker パスワードのキーリング名。
    • KEY_NAME: Docker パスワードのキー名。
    • ENCRYPTED_PASSWORD_FILE: Docker パスワードで暗号化されたファイル。
    • PLAINTEXT_PASSWORD_FILE: Docker パスワードを含むプレーンテキスト ファイル。
  3. ビルド構成ファイルを使用して、ビルドを手動で開始するか、トリガーを使用してビルドを自動化します。

暗号化されたデータを使用するようにビルドを構成する(レガシー)

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

  1. ビルド構成ファイルに 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"
         }
       }
       ]
    }
    

次のステップ