Secret Manager の顧客管理の暗号鍵を有効にする

このトピックでは、Secret Manager での顧客管理の暗号鍵(CMEK)のサポートについて説明します。

概要

Secret Manager には、アプリケーション内の機密データに保存、管理、アクセスするのためのツールが提供されています。

Secret Manager に保存されているシークレットは、デフォルトで Google のデフォルトの暗号化で暗号化されます。Google のデフォルトの暗号化では、永続ストレージに書き込まれる前に、Google が管理する鍵によってシークレットのペイロードが暗号化されます(構成は不要です)。

鍵暗号鍵を提供することで、Secret Manager がリソースに使用する暗号化をカスタマイズできます。鍵暗号鍵はデータを直接暗号化しませんが、データの暗号化に使用される Google 生成の鍵を暗号化します。CMEK 鍵は直接作成することも、Cloud KMS Autokey(プレビュー)を使用して作成することもできます。詳細については、Autokeyの概要をご覧ください。

Google Cloud での暗号化オプションの詳細については、デフォルトの保存データの暗号化をご覧ください。CMEK の利点と制限などの特定の情報については、顧客管理の暗号鍵をご覧ください。

Secret Manager での CMEK の仕組み

シークレット バージョンを特定のロケーションの永続ストレージに書き込む前に、Secret Manager は一意のデータ暗号鍵(DEK)を使用してデータを暗号化します。この DEK はその後、Secret Manager サービスが所有する鍵暗号鍵(KEK)と呼ばれるレプリカ固有の鍵で暗号化されます。

Secret Manager で CMEK を使用する場合、KEK は CMEK 鍵と呼ばれる、Cloud KMS 内で管理する対称鍵です。CMEK 鍵は、暗号化されたシークレット バージョン レプリカと同じ Google Cloud ロケーションにある必要があります。暗号化と復号のために CMEK ポリシーで Cloud EKM 鍵を使用することもできます。

このガイドでは、CMEK を使用するために Secret Manager を構成する方法について説明します。CMEK 全般についての詳細は、Cloud Key Management Service のドキュメントをご覧ください。

制限事項

CMEK は、Secret Manager v1 API と gCloud でのみ使用できます。

始める前に

すべてのリソースを同じプロジェクトに保存することも、Secret とキーを別のプロジェクトに保存することもできます。この決定についてより深く理解するには、Cloud KMS の職掌分散をご覧ください。

Secret Manager と Cloud KMS を設定するには、次の前提条件を満たす必要があります。

  • Secret Manager:

    • Secret Manager リソースを保持するプロジェクトを作成するか、既存のプロジェクトを使用します。
    • 必要に応じて、Secret Manager クイックスタートの Secret Manager の構成セクションの手順を完了します。
  • Cloud KMS:

    • Cloud KMS のリソースを保持するプロジェクトを作成するか、既存のプロジェクトを使用します。
    • 必要に応じて、Cloud KMS API を有効化します。

次の変数を Secret Manager と Cloud KMS プロジェクトのプロジェクト ID に設定します。

This is an editable variable. Set it to your Secret Manager project ID and the
value will be used in all commands on this page.
SM_PROJECT_ID

This is an editable variable. Set it to your Cloud KMS project ID and the value
will be used in all commands on this page.
KMS_PROJECT_ID

Google Cloud に対して認証を行います。

gcloud

Secret Manager をコマンドラインで使用するには、まず Google Cloud CLI のバージョン 378.0.0 以降をインストールまたはアップグレードします。 Compute Engine または GKE では、cloud-platform スコープを使用して認証する必要があります。

gcloud auth login

手動または自動での鍵の作成

Cloud KMS 鍵は手動で作成することも、Cloud KMS Autokey(プレビュー)を使用して作成することもできます。Autokey は、プロビジョニングと割り当てを自動化することで、Cloud KMS 鍵の作成と管理を簡素化します。Autokey を使用する場合、キーリング、鍵、サービス アカウントを事前にプロビジョニングする必要はありません。これらは Secret Manager リソースの作成中にオンデマンドで生成されます。詳細については、Autokey の概要をご覧ください。Secret Manager の Autokey を有効にするには、Autokey を有効にするをご覧ください。 Secret で Autokey を使用するには、Secret Manager リソースでの Autokey の使用をご覧ください。

このページの手順は、Cloud KMS 鍵を手動で作成し、割り当てるためのものです。

サービス エージェント ID の作成

顧客管理の暗号鍵が必要なプロジェクトごとにサービス エージェント ID を作成する必要があります。

Google Cloud CLI でサービス ID を作成するには、次のコマンドを実行します。

gcloud

Secret Manager をコマンドラインで使用するには、まず Google Cloud CLI のバージョン 378.0.0 以降をインストールまたはアップグレードします。 Compute Engine または GKE では、cloud-platform スコープを使用して認証する必要があります。

gcloud beta services identity create \
    --service "secretmanager.googleapis.com" \
    --project "SM_PROJECT_ID"

次の形式でサービス ID 名が返されます。

service-PROJECT_NUMBER@gcp-sa-secretmanager.iam.gserviceaccount.com

サービス ID 名を保存します。

The following variable is editable. Click on it to update the value, and it will
be reflected throughout this documentation page.

SM_SERVICE_IDENTITY

このサービス ID に、Secret の暗号化と復号に使用する CMEK Cloud KMS 鍵へのアクセス権を付与します。

自動レプリケーションによる CMEK

このセクションでは、自動レプリケーション ポリシーを使用して構成された Secret について説明します。

自動レプリケーション ポリシーを使用するシークレットの場合、CMEK 鍵は global Cloud KMS マルチリージョンに配置する必要があります。Cloud EKM 鍵を使用している場合、Cloud EKM 鍵が global リージョンで使用できないため、自動レプリケーションを使用するようにシークレットを構成することはできません。Cloud EKM 鍵の使用について詳しくは、CMEK ポリシーに Cloud EKM 鍵を追加するをご覧ください。

global Cloud KMS リージョンで対称 Cloud KMS 鍵を作成するか、既存の鍵を使用します。この例では、secret-manager-cmek という新しいキーリングを作成し、my-cmek-key という新しいキーを作成します。

gcloud

Secret Manager をコマンドラインで使用するには、まず Google Cloud CLI のバージョン 378.0.0 以降をインストールまたはアップグレードします。 Compute Engine または GKE では、cloud-platform スコープを使用して認証する必要があります。

gcloud kms keyrings create "secret-manager-cmek" \
    --project "KMS_PROJECT_ID" \
    --location "global"
gcloud kms keys create "my-cmek-key" \
    --project "KMS_PROJECT_ID" \
    --location "global" \
    --keyring "secret-manager-cmek" \
    --purpose "encryption"

サービス ID に Secret Manager へのアクセス許可を付与し、CMEK 鍵を使用して暗号化と復号を行います。このコマンドは、my-cmek-key Cloud KMS 鍵の Cloud KMS 暗号化 / 復号のロール(roles/cloudkms.cryptoKeyEncrypterDecrypter)をサービス ID に付与します。

gcloud

Secret Manager をコマンドラインで使用するには、まず Google Cloud CLI のバージョン 378.0.0 以降をインストールまたはアップグレードします。 Compute Engine または GKE では、cloud-platform スコープを使用して認証する必要があります。

gcloud kms keys add-iam-policy-binding "my-cmek-key" \
    --project "KMS_PROJECT_ID" \
    --location "global" \
    --keyring "secret-manager-cmek" \
    --member "serviceAccount:SM_SERVICE_IDENTITY" \
    --role "roles/cloudkms.cryptoKeyEncrypterDecrypter"

自動レプリケーションを使用して Secret を作成する。CMEK 鍵のリソース名がメタデータとして Secret に保存されます。

gcloud

Secret Manager をコマンドラインで使用するには、まず Google Cloud CLI のバージョン 378.0.0 以降をインストールまたはアップグレードします。 Compute Engine または GKE では、cloud-platform スコープを使用して認証する必要があります。

gcloud secrets create "SECRET_ID" \
    --replication-policy "automatic" \
    --kms-key-name "projects/KMS_PROJECT_ID/locations/global/keyRings/secret-manager-cmek/cryptoKeys/my-cmek-key" \
    --project "SM_PROJECT_ID"

API

次の例では、API の使用を示すために curl を使用します。gcloud auth print-access-token を使用してアクセス トークンを生成できます。 Compute Engine または GKE では、cloud-platform スコープを使用して認証する必要があります。

replication.automatic.customerManagedEncryption.kmsKeyName の値を CMEK 鍵のリソース名に設定します。

curl "https://secretmanager.googleapis.com/v1/projects/${SM_PROJECT_ID}/secrets?secretId=SECRET_ID" \
    --request "POST" \
    --header "Content-Type: application/json" \
    --header "Authorization: Bearer ACCESS_TOKEN" \
    --data-binary @- <<EOF
{
  "replication":{
    "automatic":{
      "customerManagedEncryption":{
        "kmsKeyName": "projects/KMS_PROJECT_ID/locations/global/keyRings/secret-manager-cmek/cryptoKeys/my-cmek-key"
      }
    }
  }
}
EOF

これで、その Secret にシークレット バージョンが作成されるたびに、サービス ID が CMEK 鍵にアクセスできる限り、永続ストレージに書き込まれる前に、その鍵を使用してシークレット バージョンのペイロードが自動的に暗号化されます。サービス ID がアクセスできなくなったり、鍵が使用できなくなったりした場合、新しいシークレット バージョンを作成しようとしたり、既存のシークレット バージョンにアクセスしようとしたりするとエラーが返されます。

新しいシークレット バージョンを追加します。Cloud KMS 鍵のリソース名を指定していないことに注意してください。これは、シークレットのメタデータから読み取られます。

gcloud

Secret Manager をコマンドラインで使用するには、まず Google Cloud CLI のバージョン 378.0.0 以降をインストールまたはアップグレードします。 Compute Engine または GKE では、cloud-platform スコープを使用して認証する必要があります。

echo -n "SECRET_DATA" | gcloud secrets versions add "SECRET_ID" \
    --project "SM_PROJECT_ID" \
    --data-file -

呼び出し元に CMEK 鍵を使用する直接なアクセス権がない場合でも、シークレット バージョンが作成されます。呼び出し元ではなく、Secret Manager のサービス ID が、Secret の読み取り時または書き込み時に暗号化と復号を行います。

同様に、Secret にアクセスするために CMEK 鍵への直接なアクセス権は必要ありません。サービス ID がその鍵にアクセスし、ユーザーに代わって Secret を暗号化または復号します。

作成したシークレット バージョンにアクセスするには:

gcloud

Secret Manager をコマンドラインで使用するには、まず Google Cloud CLI のバージョン 378.0.0 以降をインストールまたはアップグレードします。 Compute Engine または GKE では、cloud-platform スコープを使用して認証する必要があります。

gcloud secrets versions access "latest" \
    --project "SM_PROJECT_ID" \
    --secret "SECRET_ID"

CMEK 構成の更新

global Cloud KMS マルチリージョンに新しい対称 KMS 鍵を作成します。

gcloud

Secret Manager をコマンドラインで使用するには、まず Google Cloud CLI のバージョン 378.0.0 以降をインストールまたはアップグレードします。 Compute Engine または GKE では、cloud-platform スコープを使用して認証する必要があります。

gcloud kms keys create "my-other-key" \
    --project "KMS_PROJECT_ID" \
    --location "global" \
    --keyring "secret-manager-cmek" \
    --purpose "encryption"

サービス ID に Secret Manager へのアクセス権を付与し、新しい CMEK 鍵を使用して暗号化と復号を行います。このコマンドは、my-other-key Cloud KMS 鍵の Cloud KMS 暗号化 / 復号のロール(roles/cloudkms.cryptoKeyEncrypterDecrypter)をサービス ID に付与します。

gcloud

Secret Manager をコマンドラインで使用するには、まず Google Cloud CLI のバージョン 378.0.0 以降をインストールまたはアップグレードします。 Compute Engine または GKE では、cloud-platform スコープを使用して認証する必要があります。

gcloud kms keys add-iam-policy-binding "my-other-key" \
    --project "KMS_PROJECT_ID" \
    --location "global" \
    --keyring "secret-manager-cmek" \
    --member "serviceAccount:SM_SERVICE_IDENTITY" \
    --role "roles/cloudkms.cryptoKeyEncrypterDecrypter"

新しい Cloud KMS 鍵のリソース名で Secret のレプリケーションを更新し、Secret の CMEK 構成を変更します。

gcloud

Secret Manager をコマンドラインで使用するには、まず Google Cloud CLI のバージョン 378.0.0 以降をインストールまたはアップグレードします。 Compute Engine または GKE では、cloud-platform スコープを使用して認証する必要があります。

gcloud secrets replication update "SECRET_ID" \
    --set-kms-key "projects/KMS_PROJECT_ID/locations/global/keyRings/secret-manager-cmek/cryptoKeys/my-other-key" \
    --project "SM_PROJECT_ID"

API

次の例では、API の使用を示すために curl を使用します。gcloud auth print-access-token を使用してアクセス トークンを生成できます。 Compute Engine または GKE では、cloud-platform スコープを使用して認証する必要があります。

curl "https://secretmanager.googleapis.com/v1/projects/${SM_PROJECT_ID}/secrets/SECRET_ID?updateMask=replication" \
    --request "PATCH" \
    --header "Authorization: Bearer ACCESS_TOKEN" \
    --header "Content-Type: application/json" \
    --data-binary @- <<EOF
{
  "replication": {
    "automatic":{
      "customerManagedEncryption":{
        "kmsKeyName": "projects/KMS_PROJECT_ID/locations/global/keyRings/secret-manager-cmek/cryptoKeys/my-other-key"
      }
    }
  }
}
EOF

ユーザー管理のレプリケーションによる CMEK

このセクションでは、ユーザー管理のレプリケーション ポリシーを使用して構成されたシークレットについて説明します。ユーザー管理のレプリケーション ポリシーを使用して、シークレットが保存される Google Cloud のロケーションを制御します。シークレットには、すべての Google Cloud のロケーションから常にアクセスできます。

ユーザー管理のレプリケーション ポリシーを使用するシークレットは、シークレット バージョンが格納されているロケーションと完全に一致する Cloud KMS 鍵を使用する必要があります。このガイドの例では、us-east1 と us-central1 の 2 つの場所にシークレットを保存します。シークレットへのアクセス リクエストは、これらのロケーションのいずれかにルーティングされます。

2 つの各リージョンで、暗号化目的でキーリングと Cloud KMS 鍵を作成するか、既存の鍵を使用します。この例では、"secret-manager-cmek" という新しいキーリングを作成し、各リージョンに "my-cmek-key" という鍵を作成します。

gcloud

Secret Manager をコマンドラインで使用するには、まず Google Cloud CLI のバージョン 378.0.0 以降をインストールまたはアップグレードします。 Compute Engine または GKE では、cloud-platform スコープを使用して認証する必要があります。

gcloud kms keyrings create "secret-manager-cmek" \
    --project "KMS_PROJECT_ID" \
    --location "us-east1"
gcloud kms keys create "my-cmek-key" \
    --project "KMS_PROJECT_ID" \
    --location "us-east1" \
    --keyring "secret-manager-cmek" \
    --purpose "encryption"
gcloud kms keyrings create "secret-manager-cmek" \
    --project "KMS_PROJECT_ID" \
    --location "us-central1"
gcloud kms keys create "my-cmek-key" \
    --project "KMS_PROJECT_ID" \
    --location "us-central1" \
    --keyring "secret-manager-cmek" \
    --purpose "encryption"

サービス ID に Secret Manager の権限を付与し、個別の CMEK 鍵ごと、またはプロジェクトのすべての鍵に Cloud KMS 暗号化 / 復号のロール(roles/cloudkms.cryptoKeyEncrypterDecrypter)を付与することで、CMEK 鍵を使用して暗号化と復号を行います。

gcloud

Secret Manager をコマンドラインで使用するには、まず Google Cloud CLI のバージョン 378.0.0 以降をインストールまたはアップグレードします。 Compute Engine または GKE では、cloud-platform スコープを使用して認証する必要があります。

gcloud kms keys add-iam-policy-binding "my-cmek-key" \
    --project "KMS_PROJECT_ID" \
    --location "us-east1" \
    --keyring "secret-manager-cmek" \
    --member "serviceAccount:SM_SERVICE_IDENTITY" \
    --role "roles/cloudkms.cryptoKeyEncrypterDecrypter"
gcloud kms keys add-iam-policy-binding "my-cmek-key" \
    --project "KMS_PROJECT_ID" \
    --location "us-central1" \
    --keyring "secret-manager-cmek" \
    --member "serviceAccount:SM_SERVICE_IDENTITY" \
    --role "roles/cloudkms.cryptoKeyEncrypterDecrypter"

ユーザー管理のレプリケーションで CMEK を有効化した Secret を作成します。CMEK 鍵のリソース名がメタデータとして Secret に保存されます。

gcloud

Secret Manager をコマンドラインで使用するには、まず Google Cloud CLI のバージョン 378.0.0 以降をインストールまたはアップグレードします。 Compute Engine または GKE では、cloud-platform スコープを使用して認証する必要があります。

cat <<EOF > ./replication-policy.json
{
  "userManaged":{
    "replicas":[
      {
        "location":"us-east1",
        "customerManagedEncryption":{
          "kmsKeyName":"projects/KMS_PROJECT_ID/locations/us-east1/keyRings/secret-manager-cmek/cryptoKeys/my-cmek-key"
        }
      },
      {
        "location":"us-central1",
        "customerManagedEncryption":{
          "kmsKeyName":"projects/KMS_PROJECT_ID/locations/us-central1/keyRings/secret-manager-cmek/cryptoKeys/my-cmek-key"
        }
      }
    ]
  }
}
EOF
gcloud secrets create "my-ummr-secret" \
    --replication-policy-file ./replication-policy.json \
    --project "SM_PROJECT_ID"

API

次の例では、API の使用を示すために curl を使用します。gcloud auth print-access-token を使用してアクセス トークンを生成できます。 Compute Engine または GKE では、cloud-platform スコープを使用して認証する必要があります。

replication.userManaged.replicas.customerManagedEncryption.kmsKeyName の値を CMEK 鍵のリソース名に設定します。

curl "https://secretmanager.googleapis.com/v1/projects/SM_PROJECT_ID/secrets?secretId=my-ummr-secret" \
--request "POST" \
--header "Content-Type: application/json" \
--header "Authorization: Bearer ACCESS_TOKEN" \
--data-binary @- <<EOF
{
  "replication":{
    "userManaged":{
      "replicas":[
        {
          "location":"us-east1",
          "customerManagedEncryption":{
            "kmsKeyName":"projects/KMS_PROJECT_ID/locations/us-east1/keyRings/secret-manager-cmek/cryptoKeys/my-cmek-key"
          }
        },
        {
          "location":"us-central1",
          "customerManagedEncryption":{
            "kmsKeyName":"projects/KMS_PROJECT_ID/locations/us-central1/keyRings/secret-manager-cmek/cryptoKeys/my-cmek-key"
          }
        }
      ]
    }
  }
}
EOF

これで、その Secret にシークレット バージョンが作成されるたびに、サービス ID が CMEK 鍵にアクセスできる限り、永続ストレージに書き込まれる前に、その鍵を使用してシークレット バージョンのペイロードが自動的に暗号化されます。サービス ID がアクセスできなくなったり、鍵が使用できなくなったりした場合、新しいシークレット バージョンを作成しようとしたり、既存のシークレット バージョンにアクセスしようとしたりするとエラーが返されます。

新しいシークレット バージョンを追加します。Cloud KMS 鍵のリソース名を指定していないことに注意してください。これは、シークレットのメタデータから読み取られます。

gcloud

Secret Manager をコマンドラインで使用するには、まず Google Cloud CLI のバージョン 378.0.0 以降をインストールまたはアップグレードします。 Compute Engine または GKE では、cloud-platform スコープを使用して認証する必要があります。

echo -n "SECRET_DATA" | gcloud secrets versions add "my-ummr-secret" \
    --project "SM_PROJECT_ID" \
    --data-file -

呼び出し元に CMEK 鍵を使用する直接なアクセス権がない場合でも、シークレット バージョンが作成されます。呼び出し元ではなく、Secret Manager のサービス ID が、Secret の読み取り時または書き込み時に暗号化と復号を行います。

同様に、Secret にアクセスするために CMEK 鍵への直接なアクセス権は必要ありません。サービス ID がその鍵にアクセスし、ユーザーに代わって Secret を暗号化または復号します。

作成したシークレット バージョンにアクセスするには。

gcloud

Secret Manager をコマンドラインで使用するには、まず Google Cloud CLI のバージョン 378.0.0 以降をインストールまたはアップグレードします。 Compute Engine または GKE では、cloud-platform スコープを使用して認証する必要があります。

gcloud secrets versions access "latest" \
    --project "SM_PROJECT_ID" \
    --secret "my-ummr-secret"

CMEK 構成の更新

Secret と同じリージョンに 2 つの新しい対称 KMS 鍵を作成する。

gcloud

Secret Manager をコマンドラインで使用するには、まず Google Cloud CLI のバージョン 378.0.0 以降をインストールまたはアップグレードします。 Compute Engine または GKE では、cloud-platform スコープを使用して認証する必要があります。

gcloud kms keys create "my-other-key" \
    --project "KMS_PROJECT_ID" \
    --location "us-east1" \
    --keyring "secret-manager-cmek" \
    --purpose "encryption"
gcloud kms keys create "my-other-key" \
    --project "KMS_PROJECT_ID" \
    --location "us-central1" \
    --keyring "secret-manager-cmek" \
    --purpose "encryption"

サービス ID に Secret Manager のアクセス権を付与し、新しい CMEK 鍵を使用して暗号化と復号を行います。このコマンドは、my-other-key Cloud KMS 鍵の Cloud KMS 暗号化 / 復号のロール(roles/cloudkms.cryptoKeyEncrypterDecrypter)をサービス ID に付与します。

gcloud

Secret Manager をコマンドラインで使用するには、まず Google Cloud CLI のバージョン 378.0.0 以降をインストールまたはアップグレードします。 Compute Engine または GKE では、cloud-platform スコープを使用して認証する必要があります。

gcloud kms keys add-iam-policy-binding "my-other-key" \
    --project "KMS_PROJECT_ID" \
    --location "us-east1" \
    --keyring "secret-manager-cmek" \
    --member "serviceAccount:SM_SERVICE_IDENTITY" \
    --role "roles/cloudkms.cryptoKeyEncrypterDecrypter"
gcloud kms keys add-iam-policy-binding "my-other-key" \
    --project "KMS_PROJECT_ID" \
    --location "us-central1" \
    --keyring "secret-manager-cmek" \
    --member "serviceAccount:SM_SERVICE_IDENTITY" \
    --role "roles/cloudkms.cryptoKeyEncrypterDecrypter"

新しい Cloud KMS 鍵のリソース名で Secret のレプリケーションを更新し、Secret の CMEK 構成を変更します。

gcloud

Secret Manager をコマンドラインで使用するには、まず Google Cloud CLI のバージョン 378.0.0 以降をインストールまたはアップグレードします。 Compute Engine または GKE では、cloud-platform スコープを使用して認証する必要があります。

gcloud secrets replication update "my-ummr-secret" \
    --set-kms-key "projects/KMS_PROJECT_ID/locations/us-east1/keyRings/secret-manager-cmek/cryptoKeys/my-other-key" \
    --location us-east1 \
    --project "SM_PROJECT_ID"
gcloud secrets replication update "my-ummr-secret" \
    --set-kms-key "projects/KMS_PROJECT_ID/locations/us-central1/keyRings/secret-manager-cmek/cryptoKeys/my-other-key" \
    --location us-central1 \
    --project "SM_PROJECT_ID"

Secret の複数のキーを同時に更新するには、ファイル経由でレプリケーション ポリシーを取得して設定します。

gcloud

Secret Manager をコマンドラインで使用するには、まず Google Cloud CLI のバージョン 378.0.0 以降をインストールまたはアップグレードします。 Compute Engine または GKE では、cloud-platform スコープを使用して認証する必要があります。

gcloud secrets replication get "my-ummr-secret" \
    --project "SM_PROJECT_ID" \
    --format=json > ./replication-policy.json

任意のエディタで必要な CMEK 構成を反映するようにファイルを更新します。次に、新しいポリシーを設定します。

gcloud secrets replication set "my-ummr-secret" \
    --replication-policy-file ./replication-policy.json \
    --project "SM_PROJECT_ID"

API

次の例では、API の使用を示すために curl を使用します。gcloud auth print-access-token を使用してアクセス トークンを生成できます。 Compute Engine または GKE では、cloud-platform スコープを使用して認証する必要があります。

curl "https://secretmanager.googleapis.com/v1/projects/${SM_PROJECT_ID}/secrets/my-ummr-secret?updateMask=replication" \
    --request "PATCH" \
    --header "Authorization: Bearer ACCESS_TOKEN" \
    --header "Content-Type: application/json" \
    --data-binary @- <<EOF
{
  "replication":{
    "userManaged":{
      "replicas":[
        {
          "location":"us-east1",
          "customerManagedEncryption":{
            "kmsKeyName":"projects/KMS_PROJECT_ID/locations/us-east1/keyRings/secret-manager-cmek/cryptoKeys/my-other-key"
          }
        },
        {
          "location":"us-central1",
          "customerManagedEncryption":{
            "kmsKeyName":"projects/KMS_PROJECT_ID/locations/us-central1/keyRings/secret-manager-cmek/cryptoKeys/my-other-key"
          }
        }]
      }
    }
  }
EOF

シークレット バージョンの CMEK 構成を表示する

シークレット バージョンが CMEK 対応かどうか、および CMEK 鍵のバージョンのリソース名を含む、シークレット バージョンのメタデータを検査し、そのメタデータを表示します。

gcloud

Secret Manager をコマンドラインで使用するには、まず Google Cloud CLI のバージョン 378.0.0 以降をインストールまたはアップグレードします。 Compute Engine または GKE では、cloud-platform スコープを使用して認証する必要があります。

gcloud secrets versions describe "latest" \
    --secret "SECRET_ID" \
    --project "SM_PROJECT_ID"

API

次の例では、API の使用を示すために curl を使用します。gcloud auth print-access-token を使用してアクセス トークンを生成できます。 Compute Engine または GKE では、cloud-platform スコープを使用して認証する必要があります。

curl "https://secretmanager.googleapis.com/v1/projects/SM_PROJECT_ID/secrets/SECRET_ID/versions/latest" \
    --request "GET" \
    --header "Authorization: Bearer ACCESS_TOKEN" \
    --header "Content-Type: application/json"

これにより、シークレット バージョンの暗号化に使用された鍵バージョンの Cloud KMS リソース名全体が返されます。

{
  "name": "projects/PROJECT_NUMBER/secrets/SECRET_ID/versions/1",
  "createTime": "2021-07-...",
  "state": "ENABLED",
  "replicationStatus": {
    "automatic": {
      "customerManagedEncryption": {
        "kmsKeyVersionName": "projects/KMS_PROJECT_ID/locations/global/keyRings/secret-manager-cmek/cryptoKeys/my-cmek-key/cryptoKeyVersions/1"
      }
    }
  }
}

CMEK ポリシーに Cloud EKM 鍵を追加する

このセクションでは、CMEK ポリシーに Cloud EKM 鍵を追加する方法について説明します。この手順で、Cloud EKM 鍵を使用してシークレットを暗号化または復号できます。

現在、Cloud EKM は global マルチリージョンをサポートしていないため、Cloud EKM 鍵はユーザー管理のレプリケーション用に構成された Secret でのみ使用できます。

us-central1 Cloud KMS リージョン(または global 以外のリージョン)に対称鍵を作成します。この例では、secret-manager-cmek-ekm という新しいキーリングを作成し、そのキーリングに my-ekm-key という新しいキーを作成します。

gcloud

Secret Manager をコマンドラインで使用するには、まず Google Cloud CLI のバージョン 378.0.0 以降をインストールまたはアップグレードします。 Compute Engine または GKE では、cloud-platform スコープを使用して認証する必要があります。

新しいキーリングを作成します。

gcloud kms keyrings create "secret-manager-cmek-ekm" \
  --project "KMS_PROJECT_ID" \
  --location "us-central1"

そのキーリングに鍵を作成します。

gcloud kms keys create "my-ekm-key" \
  --keyring "secret-manager-cmek-ekm" \
  --location "us-central1" \
  --purpose "encryption" \
  --protection-level "external" \
  --skip-initial-version-creation \
  --default-algorithm "external-symmetric-encryption"

次に、鍵の外部 URI を使用して my-ekm-key の新しいバージョンを作成します。Cloud EKM 鍵の外部 URI の詳細については、外部鍵の作成をご覧ください。

gcloud

Secret Manager をコマンドラインで使用するには、まず Google Cloud CLI のバージョン 378.0.0 以降をインストールまたはアップグレードします。 Compute Engine または GKE では、cloud-platform スコープを使用して認証する必要があります。

gcloud kms keys versions create \
  --key "my-ekm-key" \
  --keyring "secret-manager-cmek-ekm" \
  --location "us-central1" \
  --external-key-uri EXTERNAL_KEY_URI \
  --primary

サービス ID に Secret Manager へのアクセス許可を付与し、外部鍵を使用して暗号化と復号を行います。このコマンドは、my-ekm-key の Cloud KMS 暗号化 / 復号のロール(roles/cloudkms.cryptoKeyEncrypterDecrypter)をサービス ID に付与します。

gcloud

Secret Manager をコマンドラインで使用するには、まず Google Cloud CLI のバージョン 378.0.0 以降をインストールまたはアップグレードします。 Compute Engine または GKE では、cloud-platform スコープを使用して認証する必要があります。

gcloud kms keys add-iam-policy-binding "my-ekm-key" \
  --project "KMS_PROJECT_ID" \
  --location "us-central1" \
  --keyring "secret-manager-cmek-ekm" \
  --member "serviceAccount:SM_SERVICE_IDENTITY" \
  --role "roles/cloudkms.cryptoKeyEncrypterDecrypter"

Cloud EKM 鍵を使用する CMEK 対応 Secret を作成します。

gcloud

Secret Manager をコマンドラインで使用するには、まず Google Cloud CLI のバージョン 378.0.0 以降をインストールまたはアップグレードします。 Compute Engine または GKE では、cloud-platform スコープを使用して認証する必要があります。

cat <<EOF > ./replication-policy.json
{
  "userManaged":{
    "replicas":[
      {
        "location":"us-central1",
        "customerManagedEncryption":{
          "kmsKeyName":"projects/KMS_PROJECT_ID/locations/us-central1/keyRings/secret-manager-cmek-ekm/cryptoKeys/my-ekm-key"
        }
      }
    ]
  }
}
EOF
gcloud secrets create "my-ekm-secret" \
    --replication-policy-file ./replication-policy.json \
    --project "SM_PROJECT_ID"

これで、my-ekm-secret にシークレット バージョンが作成されるたびに、サービス ID がその鍵にアクセスできる限り、永続ストレージに書き込まれる前に、Cloud EKM 鍵を使用してシークレット バージョンのペイロードが自動的に暗号化されます。サービス ID がアクセスできなくなったり、鍵が使用できなくなったりした場合、新しいシークレット バージョンを作成しようとしたり、既存のシークレット バージョンにアクセスしようとしたりするとエラーが返されます。

新しいシークレット バージョンを追加します。鍵のリソース名がシークレットのメタデータから読み取られることに注意します。

gcloud

Secret Manager をコマンドラインで使用するには、まず Google Cloud CLI のバージョン 378.0.0 以降をインストールまたはアップグレードします。 Compute Engine または GKE では、cloud-platform スコープを使用して認証する必要があります。

echo -n "SECRET_DATA" | gcloud secrets versions add "my-ekm-secret" \
    --project "SM_PROJECT_ID" \
    --data-file -

呼び出し元に鍵を使用する直接なアクセス権がない場合でも、シークレット バージョンが作成されます。呼び出し元ではなく、Secret Manager のサービス ID が、Secret の読み取り時または書き込み時に暗号化と復号を行います。

作成したシークレット バージョンにアクセスするには。そこで、サービス ID が鍵にアクセスし、ユーザーに代わって Secret を暗号化または復号します。

gcloud

Secret Manager をコマンドラインで使用するには、まず Google Cloud CLI のバージョン 378.0.0 以降をインストールまたはアップグレードします。 Compute Engine または GKE では、cloud-platform スコープを使用して認証する必要があります。

gcloud secrets versions access "latest" \
  --project "SM_PROJECT_ID" \
  --secret "my-ekm-secret"

CMEK を無効にする

レプリケーション ポリシーを更新して、Secret から CMEK 構成を削除します。

gcloud

Secret Manager をコマンドラインで使用するには、まず Google Cloud CLI のバージョン 378.0.0 以降をインストールまたはアップグレードします。 Compute Engine または GKE では、cloud-platform スコープを使用して認証する必要があります。

gcloud secrets replication update "SECRET_ID" --remove-cmek \
    --project "SM_PROJECT_ID"

API

次の例では、API の使用を示すために curl を使用します。gcloud auth print-access-token を使用してアクセス トークンを生成できます。 Compute Engine または GKE では、cloud-platform スコープを使用して認証する必要があります。

curl "https://secretmanager.googleapis.com/v1/projects/${SM_PROJECT_ID}/secrets/SECRET_ID?updateMask=replication" \
    --request "PATCH" \
    --header "Authorization: Bearer ACCESS_TOKEN" \
    --header "Content-Type: application/json" \
    --data-binary @- <<EOF
{
  "replication":{
    "automatic":{}
  }
}
EOF

次のステップ

  • CMEK の詳細を見る。