暗号化されたリソースの使用

このページでは、暗号化されたリソースをビルド リクエストで使用する方法について説明します。ファイルや変数などの暗号化されたリソースを使用して、承認トークンなどの機密情報をビルドステップに渡すことができます。

Cloud Key Management Service(Cloud KMS)の CryptoKey を使用してリソースの暗号化と復号を行うことができます。これにより、暗号鍵へのアクセスとローテーションを柔軟かつ簡単に管理できます。CryptoKeyKeyRings に格納されています。KeyRing とは、整理するために暗号鍵をグループ化したものです。

Cloud KMS を理解し、Cloud KMS API を有効にするには、Cloud KMS クイックスタートを完了する必要があります。

Cloud KMS の KeyRing と CryptoKey を作成する

KeyRing と CryptoKey を作成するには、それぞれ gcloud kms keyrings create コマンド、gcloud kms keys create コマンドを使用します。

KeyRing を作成するには、shell またはターミナル ウィンドウで次のコマンドを実行します。

gcloud kms keyrings create [KEYRING-NAME] \
  --location=global

CryptoKey を作成するには、次のコマンドを実行します。

gcloud kms keys create [KEY-NAME] \
  --location=global \
  --keyring=[KEYRING-NAME] \
  --purpose=encryption

ここで

  • [KEYRING-NAME] は、作成する KeyRing の名前です。
  • [KEY-NAME] は、作成する暗号鍵の名前です。

Cloud Build サービス アカウントに暗号鍵へのアクセス権を付与する

ビルド中にリソースを復号化するには、Cloud Build サービス アカウントに暗号鍵にアクセスする権限を付与する必要があります。ファイルの復号化のみを行う場合は、復号化権限を付与することのみが必要となります。

権限を付与する手順は次のとおりです。

Console

  1. GCP Console で [IAM] メニューを表示します。
  2. Cloud Build サービス アカウントのメールアドレスをコピーします。これには @cloudbuild.gserviceaccount.com が含まれています。
  3. GCP Console の [暗号鍵] メニューにアクセスします。
  4. リストから [キーリング] を選択します。
  5. [情報パネルを表示] をクリックして、情報パネルを開きます。
  6. [権限] をクリックします。
  7. [メンバーを追加] をクリックし、[新しいメンバー] フィールドにアカウントのメールアドレスを入力します。
  8. [役割を選択] で、[クラウド KMS 暗号鍵の復号] を選択します。
  9. [保存] をクリックします。

gcloud

シェルまたはターミナル ウィンドウから、次のコマンドを実行します。

gcloud kms keys add-iam-policy-binding \
    [KEY-NAME] --location=global --keyring=[KEYRING-NAME] \
    --member=serviceAccount:[PROJECT_NUMBER]@cloudbuild.gserviceaccount.com \
    --role=roles/cloudkms.cryptoKeyDecrypter

このコマンドの詳細については、gcloud kms keys ドキュメントをご覧ください。

Cloud Build サービス アカウントのメールアドレスがわからない場合は、Google Cloud Platform Console の [IAM] メニューにアクセスしてください。サービス アカウントのメールアドレスには @cloudbuild.gserviceaccount.com が含まれています。

鍵へのアクセス権の付与の詳細については、Cloud KMS ドキュメントの IAM と Cloud KMS の使用をご覧ください。

CryptoKey を使用してファイルを暗号化する

ファイルを暗号化するには、シェルまたはターミナル ウィンドウで次のコマンドを実行します。

gcloud kms encrypt \
  --plaintext-file=secrets.json \
  --ciphertext-file=secrets.json.enc \
  --location=global \
  --keyring=[KEYRING-NAME] \
  --key=[KEY-NAME]

これにより、secrets.json.enc という名前の暗号化されたファイルが生成されます。このファイルには、secrets.json の内容が含まれています。

暗号化されたファイルを保存する

ファイルを暗号化したら、Cloud Source Repository のリポジトリ または接続された GitHub や Bitbucket リポジトリなど、ソースコードと同じロケーションにファイルを保存できます。

たとえば、暗号化されたファイルを Git リポジトリに追加して commit するには、次のように指定します。

git add secrets.json.enc
git commit -am "Add encrypted secrets.json.enc"
git push

プレーンテキストの secrets.json ファイルがリポジトリに commit されないようにするには、リポジトリの .gitignore ファイルにそのファイル名を追加します。

echo "secrets.json" >> .gitignore
git commit -am "Add secrets.json to .gitignore"
git push

ビルド中にファイルを復号する

Builder サービス アカウントがアクセスできる暗号鍵を使用してファイルが暗号化されるようになったため、ビルドステップを追加して、暗号化されたファイルの内容を復号できます。

ビルド リクエストで、復号された secrets.json ファイルとのやり取りをするビルドステップの前に、gcloud ビルダーを呼び出し暗号鍵を使用して secrets.json.enc を復号するビルドステップを追加します。このビルドステップは、ファイルを暗号化するために使用するコマンドに似ています。

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

このステップの完了後、この後のステップで、ワークスペース ディレクトリ内の復号された secrets.json ファイルを使用できます。

たとえば、このファイル内のシークレットを使用して、外部依存関係をフェッチしたり、ビルドした Docker コンテナ イメージにシークレット トークンを含めたりすることができます。

CryptoKey を使用して環境変数を暗号化する

環境変数を暗号化するには、シェルまたはターミナル ウィンドウで次のコマンドを実行します。

echo -n $MY_SECRET | gcloud kms encrypt \
  --plaintext-file=- \  # - reads from stdin
  --ciphertext-file=- \  # - writes to stdout
  --location=global \
  --keyring=[KEYRING-NAME] \
  --key=[KEY-NAME] | base64

このコマンドは、暗号鍵を使用して環境変数 $MY_SECRET の値を暗号化します。暗号化された値は Base64 エンコード文字列であるため、値をビルド リクエストに簡単に含めることができます。

暗号化された変数をビルド リクエストで使用する

ビルド リクエストで、暗号化された値を指定する secrets フィールドと、それを復号するための暗号鍵を含めます。

secrets:
- kmsKeyName: projects/[PROJECT-ID]/locations/global/keyRings/[KEYRING-NAME]/cryptoKeys/[KEY-NAME]
  secretEnv:
    MY_SECRET: <base64-encoded encrypted secret>

ビルドステップでは、復号された値を環境変数として使用できるように指定します。

steps:
- name: 'my-builder-image'
  args: ['my', 'args']
  env: ['FOO=foo', 'BAR=bar']
  secretEnv: ['MY_SECRET']

暗号化された変数を使用したビルド リクエストの例

次のビルド リクエストの例は、暗号化された Dockerhub パスワードを使用して Docker イメージを Dockerhub に push します。

steps:

# Pull a public image from Dockerhub.
- name: 'gcr.io/cloud-builders/docker'
  args: ['pull', 'ubuntu']

# Retag the image into a user's repository.
- name: 'gcr.io/cloud-builders/docker'
  args: ['tag', 'ubuntu', '[MY-USER]/myubuntu']

# Login to provide credentials for the push.
# PASSWORD is decrypted before this step runs.
# Note: You need a shell to resolve environment variables with $$
- name: 'gcr.io/cloud-builders/docker'
  entrypoint: 'bash'
  args: ['-c', 'docker login --username=[MY-USER] --password=$$PASSWORD']
  secretEnv: ['PASSWORD']

# Push the image to Dockerhub.
- name: 'gcr.io/cloud-builders/docker'
  args: ['push', '[MY-USER]/myubuntu']

secrets:
- kmsKeyName: projects/[PROJECT-ID]/locations/global/keyRings/[KEYRING-NAME]/cryptoKeys/[KEY-NAME]
  secretEnv:
    PASSWORD: <base64-encoded encrypted Dockerhub password>

この例では、docker login ステップで指定されたユーザー名と復号された Dockerhub パスワードを使用して Dockerhub にログインします。そのため、次のステップでこの認証情報を使用して、ユーザーのリポジトリから Dockerhub にイメージを docker push できるようになります。

次のステップ