Cloud Key Management Service は、暗号鍵の管理と使用を可能にする Google Cloud サービスです。このページでは、Cloud Build で Cloud KMS から暗号化された情報を使用する方法について説明します。
始める前に
-
Cloud Build and Cloud KMS API を有効にします。
このガイドのコマンドラインの例を使用するには、Google Cloud CLI をインストールして構成します。
Cloud KMS を使用して機密情報を暗号化します。Cloud KMS は、暗号化されたコンテンツをファイルに保存します。
(省略可)暗号化されたデータを使用するようにビルドを構成するには、ENCRYPTED_FILE を base64 に変換します(この手順は、暗号化されたファイルを使用するビルド構成では必要ありません)。
base64 ENCRYPTED_FILE
必要な IAM 権限
Cloud Build サービス アカウントに Cloud KMS CryptoKey 復号(roles/cloudkms.cryptoKeyDecrypter
) IAM ロールを付与します。
Google Cloud コンソールで、Cloud Build ページ設定に移動します。
Cloud KMS CryptoKey Decrypter ロールを持つ行を見つけて、その Status を ENABLED に設定します。
暗号化されたデータを使用するようにビルドを構成する
プロジェクトのルート ディレクトリに、
cloudbuild.yaml
またはcloudbuild.json
という名前の Cloud Build ビルド構成ファイルを作成します。ビルド構成ファイルに次の操作を行います。
- すべてのビルド
steps
の後に、暗号化された値を環境変数として指定するためのavailableSecrets
フィールドと、それを復号するためのkmsKeyName
を追加します。kmsKeyName
の値で置換変数を使用できます。 - シークレットを指定するビルドステップで、次のようにします。
- ビルドステップで bash ツールを使用するには、
bash
を指すentrypoint
フィールドを追加します。これは、シークレットの環境変数を参照するために必要です。 - 暗号化された値の環境変数を指定する
secretEnv
フィールドを追加します。 args
フィールドに、最初の引数として-c
フラグを追加します。-c の後に渡した文字列はすべてコマンドとして扱われます。-c で bash コマンドを実行する方法の詳細については、bash のドキュメントをご覧ください。- 暗号化された値を
args
フィールドで指定する場合、$$
を接頭辞とする環境変数を使用して指定します。
- ビルドステップで bash ツールを使用するには、
次のビルド構成ファイルの例は、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 サービスを含む Google 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
: イメージのタグ名。
- すべてのビルド
ビルド構成ファイルを使用して、ビルドを手動で開始するか、トリガーを使用してビルドを自動化します。
暗号化されたファイルを使用するようにビルドを構成する
プロジェクトのルート ディレクトリに、
cloudbuild.yaml
またはcloudbuild.json
という名前の Cloud Build ビルド構成ファイルを作成します。ビルド構成ファイルで、復号されたファイルを操作するビルドステップの前に、暗号鍵を使用して暗号化されたファイルを復号する
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 パスワードを含むプレーンテキスト ファイル。
ビルド構成ファイルを使用して、ビルドを手動で開始するか、トリガーを使用してビルドを自動化します。
暗号化されたデータを使用するようにビルドを構成する(レガシー)
Cloud KMS を使用して機密データを暗号化し、そのデータをビルド構成ファイルで使用するには:
ビルド構成ファイルに
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" } } ] }
次のステップ
- Secret Manager からシークレットにアクセスするようにビルドを構成する方法を学習する。
- 限定公開 GitHub リポジトリにアクセスする方法を学習する。