顧客管理の暗号鍵(CMEK)を使用する

このトピックでは、Google Kubernetes Engine(GKE)で顧客管理の暗号鍵(CMEK)を使用する方法について説明します。鍵の管理を制御する必要がある場合は、Key Management Service と CMEK を使用することで、GKE クラスタの永続ディスクの保護が可能です。

概要

Google Cloud では、デフォルトで保存されている顧客コンテンツを暗号化し、GKE が自動的に暗号化の管理を行います。

暗号鍵のローテーションを自身で管理する場合は、顧客管理の暗号鍵(CMEK)を使用できます。これらの鍵は、データを暗号化するデータ暗号鍵を暗号化する際に使用されます。詳細については、鍵管理をご覧ください。

CMEK で暗号化されたディスクは、GKE で動的にプロビジョニングされる PersistentVolume として使用できます。

GKE では、CMEK を使ってクラスタ内のノードに接続された永続ディスク上のデータを保護できます。ブートディスクとコントロール プレーン ディスクは、CMEK では保護できません。

始める前に

以下の手順に従い、新しく作成した永続ディスクを暗号化します。新規または既存クラスタで KMS の新規または既存鍵を使用すると、CMEK を有効にできます。

これらの手順は、GKE クラスタごとに 1 度実行する必要があります。以下が作成されます。

  • 新しい GKE クラスタ(必要な場合)。
  • 新しい KMS キーリング、鍵、鍵バージョン(必要な場合)。
  • Kubernetes によってプロビジョニングされたディスクを有効にして、KMS 鍵で自動的に暗号化された StorageClass
  1. 必要に応じて、GKE クラスタを作成します。
  2. Compute Engine 永続ディスクの CSI ドライバをクラスタにデプロイします。
  3. KMS API を有効にし、Cloud KMS 鍵によるリソースの保護の「始める前に」セクションに記載されている内容を実行して鍵を作成します。その後、次の手順に従います。

    1. GKE クラスタと同じリージョンにキーリングを作成します。
    2. KMS CryptoKey Encrypter/Decrypter 役割roles/cloudkms.cryptoKeyEncrypterDecrypterを Compute Engine Service Agent (service-[PROJECT_NUMBER]@compute-system.iam.gserviceaccount.com) に割り当てます。これにより、GKE が鍵にアクセスできるようになります。

新しい KMS 鍵を参照して StorageClass を作成する

  1. 以下の内容を YAML ファイルにコピーします。このページでは以降、このコピーしたファイルを gcepd-sc.yaml と呼びます。この構成では、暗号化されたボリュームの動的なプロビジョニングが可能です。

    apiVersion: storage.k8s.io/v1beta1
    kind: StorageClass
    metadata:
      name: csi-gce-pd
    provisioner: pd.csi.storage.gke.io
    parameters:
      type: pd-standard
      disk-encryption-kms-key: projects/[KMS_PROJECT_ID]/locations/[REGION]/keyRings/[KEY_RING]/cryptoKeys/[KEY]
    
    • disk-encryption-kms-key は、新しいディスクの暗号化に使用する鍵の完全修飾リソース識別子である必要があります。KMS 鍵を参照するには、必要に応じて角かっこ内の内容を適切なものに置き換えます。
    • disk-encryption-kms-key の値(たとえば、keyRingscryptoKeys)では、大文字と小文字が区別されます。新しいボリュームを不正な値でプロビジョニングすると、invalidResourceUsage エラーが発生します。
    • デフォルトの StorageClass を設定できます。
  2. kubectl を使用して、GKE クラスタに StorageClass をデプロイします。

    kubectl apply -f gcepd-sc.yaml
  3. 最後に、StorageClass で Compute Engine 永続ディスクの CSI ドライバが使用され、鍵の ID が含まれていることを確認します。

コマンドの出力で、次のことを確認します。

  • プロビジョナーが pd.csi.storage.gke.io に設定されている。
  • 鍵の ID が disk-encryption-kms-key の形式になっている。

    kubectl describe storageclass csi-gce-pd
    Name:                  csi-gce-pd
    IsDefaultClass:        No
    Annotations:           None
    Provisioner:           pd.csi.storage.gke.io
    Parameters:
    **disk-encryption-kms-key=projects/my-project/locations/my-location/keyRings/my-keyring/cryptoKeys/my-key,type=pd-standard**
    AllowVolumeExpansion:  unset
    MountOptions:          none
    ReclaimPolicy:         Delete
    VolumeBindingMode:     WaitForFirstConsumer
    Events:                none
    

GKE で暗号化された永続ディスクを作成する

このセクションでは、暗号化された Kubernetes ストレージ ボリュームを新しい StorageClass 鍵と KMS 鍵で動的にプロビジョニングします。

暗号化された Compute Engine 永続ディスクを動的にプロビジョニングする

  1. 以下の内容を pvc.yaml という新しいファイルにコピーし、storageClassName を新しく作成した StorageClass の名前に更新します。
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: podpvc
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: csi-gce-pd
  resources:
    requests:
      storage: 6Gi
  1. kubectl を使用して、GKE クラスタに PersistentVolumeClaim(PVC)を適用します。

    kubectl apply -f pvc.yaml
  2. クラスタの PersistentVolumeClaim ステータスを取得して、PVC が作成され、新しくプロビジョニングされた PersistentVolume にバインドされていることを確認します。

    kubectl get pvc
    NAME      STATUS    VOLUME
    CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    podpvc     Bound     pvc-e36abf50-84f3-11e8-8538-42010a800002   10Gi
        RWO            csi-gce-pd     9s
    

これで、CMEK で保護された永続ディスクが GKE クラスタで使用できるようになります。

永続ディスクでの CMEK による保護を終了する

永続ディスクで CMEK による保護を終了するには、Compute Engine のドキュメントの指示に従います。

次の手順

CMEK の詳細については、以下をご覧ください。