CMEK でデータを保護する

Cloud Key Management Service の顧客管理の暗号鍵(CMEK)は、Cloud Functions と関連する保存データを保護するために使用できます。このような鍵は、Cloud KMS で作成および管理され、HSM クラスタ内または外部でソフトウェア鍵として保存されます。

CMEK を使用して関数をデプロイすると、完全な制御が可能な暗号鍵を使用して、関連するデータを保護します。このタイプの暗号化を行うことで、金融サービスなどの特定の業界のコンプライアンス要件を満たすことができます。鍵はユーザーが所有するもので、Google によって管理されません。鍵が無効化または破棄されると、これらの鍵で保護されたデータに誰もアクセスできなくなります。

CMEK を使用する場合、次の種類の Cloud Functions データが暗号化されます。

  • デプロイ用にアップロードされた関数のソースコード。Google により Cloud Storage に保存され、ビルドプロセスで使用されます。
  • 次のような関数のビルドプロセスの結果。
    • 関数のソースコードからビルドされたコンテナ イメージ。
    • デプロイされている関数の各インスタンス。
  • 内部イベント トランスポート チャネルの保存データ(第 1 世代のみ)。

関数のビルドプロセス自体は、ビルドごとに一意に生成されるエフェメラル キーで保護されます。詳細については、Cloud Build での CMEK コンプライアンスをご覧ください。また、次の点に注意してください。

  • ファイル システムのパスや変更のタイムスタンプなどのファイル メタデータは暗号化されません。

  • 鍵が無効になっている場合は、コンテナ イメージをデプロイできず、新しいインスタンスを起動できません。

  • Cloud Functions CMEK の保護は、Google が管理する Cloud Functions リソースにのみ適用されます。ソースコード リポジトリ、顧客プロジェクトに存在するイベント チャネル(第 2 世代のみ)、関数で使用されるすべてのサービスなど、ユーザーが管理しているデータとリソースは、ユーザーが保護する必要があります。

Cloud Functions に CMEK を設定するには、次の手順を行います。

  • 必要なサービス アカウントに鍵へのアクセス権を付与します。

    • すべての関数について、Cloud Functions、Artifact Registry、Cloud Storage のサービス アカウントに鍵へのアクセス権を付与する必要があります。

    • イベント ドリブンの Cloud Functions(第 2 世代)の場合のみ、Cloud RunEventarc の CMEK の設定も完了する必要があります。

  • CMEK で保護された Artifact Registry リポジトリを作成して、関数のイメージを保存します。

  • 関数で CMEK を有効にします。

  • 必要に応じて、CMEK の組織のポリシーを有効にして、すべての新しい関数が CMEK を遵守するようにします。

以下では、これらの手順について詳しく説明します。

始める前に

  1. 関数の暗号化に使用する単一リージョンの鍵を作成します。鍵の作成方法については、対称暗号鍵の作成をご覧ください。

  2. CMEK が有効Artifact Registry リポジトリを作成します。関数で CMEK を有効にする場合と同じ鍵を Artifact Registry リポジトリに使用する必要があります。

  3. イベント ドリブンの第 2 世代の関数については、Google チャネルの CMEK を有効にするで概説されている追加の設定手順を行います。

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

すべての関数について、次のサービス アカウントに鍵へのアクセス権を付与する必要があります。

  • Cloud Functions サービス エージェント(service-PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com

  • Artifact Registry サービス エージェント(service-PROJECT_NUMBER@gcp-sa-artifactregistry.iam.gserviceaccount.com

  • Cloud Storage サービス エージェント(service-PROJECT_NUMBER@gs-project-accounts.iam.gserviceaccount.com

第 2 世代に限り、次のサービス アカウントに鍵へのアクセス権を付与する必要があります。

  • Cloud Run サービス エージェント(service-PROJECT_NUMBER@serverless-robot-prod.iam.gserviceaccount.com

  • Eventarc サービス エージェント(service-PROJECT_NUMBER@gcp-sa-eventarc.iam.gserviceaccount.com

これらのサービス アカウントに鍵へのアクセス権を付与するには、各サービス アカウントを鍵のプリンシパルとして追加し、サービス アカウントに Cloud KMS CryptoKey Encrypter/Decrypter ロールを付与します。

コンソール

  1. Google Cloud Console の Cloud Key Management Service ページに移動します。
    Cloud KMS ページに移動

  2. 目的の鍵を含むキーリングの名前をクリックします。

  3. 鍵の名前をクリックすると、鍵の詳細が表示されます。

  4. [権限] タブで、[アクセス権を付与] をクリックします。

  5. [新しいプリンシパル] フィールドに、上記の 3 つのサービス アカウントすべてのメールアドレスを入力して、一度で 3 つのアカウントすべてに権限を割り当てます。

  6. [ロールを選択] プルダウンで、[クラウド KMS 暗号鍵の暗号化 / 復号] を選択します。

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

gcloud

上記のサービス アカウントごとに、次のコマンドを実行します。

gcloud kms keys add-iam-policy-binding KEY \
--keyring KEY_RING \
--location LOCATION \
--member serviceAccount:SERVICE_AGENT_EMAIL \
--role roles/cloudkms.cryptoKeyEncrypterDecrypter

次のように置き換えます。

  • KEY: 鍵の名前。例: my-key

  • KEY_RING: キーリングの名前。例: my-keyring

  • LOCATION: 鍵のロケーション。例: us-central1

  • SERVICE_AGENT_EMAIL: サービス アカウントのメールアドレス。

関数の CMEK を有効にする

CMEK を有効にして Artifact Registry リポジトリを設定し、Cloud Functions に鍵へのアクセス権を付与したので、関数で CMEK を有効にする準備が整いました。

関数の CMEK を有効にするには:

コンソール

  1. Google Cloud Console の [Cloud Functions] ページに移動します。
    Cloud Functions ページに移動

  2. CMEK を有効にする関数の名前をクリックします。

  3. [編集] をクリックします。

  4. [ランタイム、ビルド...] をクリックして、詳細な構成オプションを開きます。

  5. [セキュリティとイメージのリポジトリ] タブを選択します。

  6. [暗号化] セクションで、[顧客管理の暗号鍵(CMEK)] を選択します。

  7. プルダウンからキーを選択します。

  8. [コンテナの場所] で [お客様が管理する Artifact Registry] を選択します。

  9. [Artifact Registry] プルダウンで、CMEK で保護されたリポジトリを選択します。

  10. [次へ] をクリックします。

  11. [デプロイ] をクリックします。

gcloud

次のコマンドを実行します。

gcloud functions deploy FUNCTION \
[--gen2] \
--kms-key=KEY \
--docker-repository=REPOSITORY \
--source=YOUR_SOURCE_LOCATION
FLAGS...

次のように置き換えます。

  • FUNCTION: CMEK を有効にする関数の名前。例: cmek-function

  • KEY: 鍵の完全修飾名(projects/PROJECT_NAME/locations/LOCATION/keyRings/KEYRING_NAME/cryptoKeys/KEY_NAME の形式)。

  • REPOSITORY: Artifact Registry リポジトリの完全修飾名(projects/PROJECT_NAME/locations/LOCATION/repositories/REPOSITORY の形式)。

  • YOUR_SOURCE_LOCATION: 既存の関数に対して CMEK を有効にする場合は、このパラメータを明示的に指定し、目的のソースコードが再デプロイされていることを確認してください。

  • FLAGS...: 関数のデプロイ(特にデプロイの作成)に必要な追加のフラグ。詳細については、Cloud Functions をデプロイするをご覧ください。

関数の CMEK が有効になります。

Cloud Functions は CMEK 保護に常に鍵のメイン バージョンを使用します。関数の CMEK を有効にするときに使用する特定の鍵バージョンを指定することはできません。

鍵が破棄された場合、無効になった場合、または必要な権限が取り消された場合、その鍵で保護されている関数のアクティブなインスタンスはシャットダウンされません。すでに進行中の関数の実行は継続されますが、Cloud Functions が鍵にアクセスできない限り、新しい実行は失敗します。

CMEK による保護をテストする

CMEK による保護が機能していることを確認するには、関数で CMEK を有効にするために使用した鍵を無効にし、関数をトリガーします。

  1. 関数の保護に使用される鍵を無効にします

  2. この関数に関連付けられたソースコードの表示を試行します。この試行は失敗するはずです。

  3. CMEK で保護された関数のトリガーを試行します。この試行は失敗するはずです。

  4. CMEK による保護が機能していることを確認したら、鍵を有効にします

これで、関数の CMEK 保護が確認できました。

次のステップ