Vom Kunden verwaltete Verschlüsselungsschlüssel verwenden

Auf dieser Seite wird beschrieben, wie Sie vom Kunden verwaltete Verschlüsselungsschlüssel (Customer Managed Encryption Keys, CMEK) in Google Kubernetes Engine (GKE) verwenden. Wenn Sie die Verwaltung Ihrer Schlüssel steuern möchten, können Sie mit Cloud Key Management Service und CMEK angehängte nichtflüchtige Speicher und benutzerdefinierte Bootlaufwerke in Ihrem GKE-Cluster schützen.

Übersicht

Google Cloud verschlüsselt inaktive Kundeninhalte standardmäßig und GKE verwaltet die Verschlüsselung für Sie, ohne dass Sie etwas tun müssen.

Wenn Sie die Rotation von Verschlüsselungsschlüsseln selbst steuern und verwalten möchten, können Sie CMEK verwenden. Mit diesen Schlüsseln werden Datenverschlüsselungsschlüssel verschlüsselt, die wiederum Ihre Daten verschlüsseln. Weitere Informationen finden Sie unter Schlüsselverwaltung. Mit von Ihnen verwalteten Schlüsseln können Sie außerdem Secrets in Ihrem Cluster verschlüsseln. Weitere Informationen finden Sie unter Verschlüsselung von Secrets auf Anwendungsebene.

In GKE kann CMEK die Daten von zwei Arten von Speicherlaufwerken schützen: Bootlaufwerken von Knoten und angehängten Laufwerken.

Bootlaufwerke von Knoten

Knoten-Bootlaufwerke sind Teil der Knotenpools des Clusters. Ein CMEK-verschlüsseltes Bootlaufwerk für Knoten können Sie beim Erstellen von Clustern und Knotenpools erstellen.

Angehängte Laufwerke

Angehängte Laufwerke sind PersistentVolumes, die von Pods zum dauerhaften Speichern verwendet werden. CMEK-verschlüsselte angehängte nichtflüchtige Speicher sind in GKE als dynamisch bereitgestelltes PersistentVolume verfügbar.

Weitere Informationen zu Speicherlaufwerken finden Sie unter Speicheroptionen. Laufwerke für Steuerungsebenen, die für GKE-Steuerungsebenen verwendet werden, können nicht mit CMEK geschützt werden.

  1. Für die Übungen in diesem Thema benötigen Sie zwei Google Cloud-Projekte:

    • Schlüsselprojekt: Hier erstellen Sie einen Verschlüsselungsschlüssel.

    • Clusterprojekt: Hier erstellen Sie einen Cluster, der CMEK aktiviert.

  2. Stellen Sie in Ihrem Schlüsselprojekt sicher, dass Sie die Cloud KMS API aktiviert haben.

    Cloud KMS API aktivieren

  3. In Ihrem Schlüsselprojekt benötigt der Nutzer, der den Schlüsselbund und Schlüssel erstellt, die folgenden IAM-Berechtigungen:

    • cloudkms.keyRings.getIamPolicy
    • cloudkms.keyRings.setIamPolicy

    Diese Berechtigungen sind in der vordefinierten IAM-Rolle (Identity and Access Management) roles/cloudkms.admin enthalten. Weitere Informationen zum Erteilen von Berechtigungen zur Schlüsselverwaltung finden Sie in der Cloud KMS-Dokumentation.

  4. Achten Sie darauf, dass in Ihrem Clusterprojekt die Cloud KMS API aktiviert ist.

    Cloud KMS API aktivieren

  5. Prüfen Sie, ob das Cloud SDK installiert ist.

  6. Aktualisieren Sie gcloud auf die neueste Version:

    gcloud components update
    

Cloud KMS-Schlüssel erstellen

Bevor Sie das Knoten-Bootlaufwerk oder das angehängte Laufwerk mit einem CMEK schützen können, benötigen Sie einen Cloud KMS-Schlüsselbund und -Schlüssel.

Für Ihren Schlüsselbund und Schlüssel gelten die folgenden Anforderungen:

  • Ihr Schlüssel sollte symmetrische Verschlüsselung verwenden.

  • Sie müssen GKE-Dienstkontoberechtigungen erteilen, um den Schlüssel verwenden zu können.

  • Der Schlüsselbund muss einen Speicherort haben, der dem Standort Ihres GKE-Clusters entspricht:

    • Ein zonaler Cluster sollte einen Schlüsselbund von einem übergeordneten Ort aus verwenden. Ein Cluster in der Zone us-central1-a kann beispielsweise nur einen Schlüssel in der Region us-central1 verwenden.

    • Ein regionaler Cluster sollte einen Schlüsselbund am selben Ort verwenden. Beispielsweise sollte ein Cluster in der Region asia-northeast1 mit einem Schlüsselbund aus der Region asia-northeast1 geschützt werden.

    • Die Cloud KMS-Region global wird für die Verwendung mit GKE nicht unterstützt.

Eine Anleitung zum Erstellen eines Schlüsselbunds und eines Schlüssels finden Sie unter Symmetrische Schlüssel erstellen.

Verwendung des Schlüssels erlauben

Sie müssen dem Compute Engine-Dienstkonto, das von Knoten in Ihrem Cluster verwendet wird, die Rolle "Cloud KMS CryptoKey-Verschlüsseler/Entschlüsseler" zuweisen. Dies ist erforderlich, damit nichtflüchtige Speicher in GKE auf Ihren Verschlüsselungsschlüssel zugreifen und ihn verwenden können.

Der Name des Compute Engine-Dienstkontos hat folgendes Format:

service-PROJECT_NUMBER@compute-system.iam.gserviceaccount.com

Ersetzen Sie PROJECT_NUMBER durch die Projektnummer des Clusters.

Um Zugriff auf das Dienstkonto zu gewähren, können Sie den Befehl gcloud oder die Google Cloud Console verwenden.

gcloud

Weisen Sie Ihrem Compute Engine-Dienstkonto die Rolle Cloud KMS CryptoKey-Verschlüsseler/Entschlüsseler zu:

gcloud kms keys add-iam-policy-binding KEY_NAME \
    --location LOCATION \
    --keyring RING_NAME \
    --member serviceAccount:SERVICE_ACCOUNT \
    --role roles/cloudkms.cryptoKeyEncrypterDecrypter \
    --project KEY_PROJECT_ID

Dabei gilt:

  • KEY_NAME: der Name des Schlüssels
  • LOCATION: die Region, in der Sie Ihren Schlüsselbund erstellt haben
  • RING_NAME: der Name des Schlüsselbunds
  • SERVICE_ACCOUNT: der Name Ihres Compute Engine-Dienstkontos
  • KEY_PROJECT_ID: Ihre Schlüsselprojekt-ID

Console

Weisen Sie Ihrem Compute Engine-Dienstkonto die Rolle Cloud KMS CryptoKey-Verschlüsseler/Entschlüsseler zu:

  1. Öffnen Sie in der Google Cloud Console den Browser für Cloud Key Management Service-Schlüssel.
    Zum Browser für Cloud KMS-Schlüssel
  2. Klicken Sie auf den Namen des Schlüsselbunds, der den gewünschten Schlüssel enthält.

  3. Klicken Sie das Kästchen für den gewünschten Schlüssel an.

    Der Tab Berechtigungen im rechten Fensterbereich wird verfügbar.

  4. Geben Sie im Dialogfeld Mitglieder hinzufügen die E-Mail-Adresse des Compute Engine-Dienstkontos an, dem Sie Zugriff gewähren.

  5. Wählen Sie im Drop-down-Menü Rolle auswählen die Option Cloud KMS CryptoKey-Verschlüsseler/Entschlüsseler aus.

  6. Klicken Sie auf Speichern.

CMEK-geschütztes Bootlaufwerk erstellen

In diesem Abschnitt erstellen Sie einen neuen Cluster oder Knotenpool mit einem CMEK-geschützten Bootlaufwerk.

Sie können die vom Kunden verwaltete Verschlüsselung für Knoten-Bootlaufwerke auf einem vorhandenen Cluster nicht aktivieren, da Sie den Bootlaufwerktyp eines vorhandenen Clusters oder Knotenpools nicht ändern können. Sie können jedoch einen neuen Knotenpool für Ihren Cluster erstellen, bei dem die vom Kunden verwaltete Verschlüsselung aktiviert ist, und den vorherigen Knotenpool löschen.

Es ist ebenfalls nicht möglich, die vom Kunden verwaltete Verschlüsselung für Knoten-Bootlaufwerke auf einem vorhandenen Cluster oder Knotenpool zu deaktivieren. Sie können jedoch einen neuen Knotenpool für Ihren Cluster erstellen, bei dem die vom Kunden verwaltete Verschlüsselung deaktiviert ist, und den vorherigen Knotenpool löschen.

Cluster mit einem CMEK-geschützten Knoten-Bootlaufwerk erstellen

Sie können einen Cluster mit einem CMEK-geschützten Knoten-Bootlaufwerk mit dem Befehl gcloud oder der Google Cloud Console erstellen.

Nur ein nichtflüchtiger Standardspeicher (pd-standard) oder ein nichtflüchtiger SSD-Speicher (pd-ssd) kann mit einem CMEK-Schlüssel verschlüsselt werden.

gcloud

Geben Sie in Ihrem Erstellungsbefehl einen Wert für den --boot-disk-kms-key parameter an, um einen Cluster zu erstellen, dessen Bootlaufwerk mit einem CMEK-Schlüssel verschlüsselt wurde.

gcloud container clusters create CLUSTER_NAME \
    --cluster-version=latest \
    --region COMPUTE_REGION \
    --boot-disk-kms-key projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/RING_NAME/cryptoKeys/KEY_NAME \
    --project CLUSTER_PROJECT_ID\
    --disk-type DISK_TYPE

Dabei gilt:

  • CLUSTER_NAME: der Name des neuen Clusters
  • COMPUTE_REGION: die Computing-Region für die Clustersteuerungsebene
  • KEY_PROJECT_ID: Ihre Schlüsselprojekt-ID
  • LOCATION: der Speicherort Ihres Schlüsselbunds
  • RING_NAME: der Name des Schlüsselbunds
  • KEY_NAME: der Name des Schlüssels
  • CLUSTER_PROJECT_ID ist Ihre Clusterprojekt-ID.
  • DISK_TYPE: pd-standard (Standard) oder pd-ssd

Console

  1. Rufen Sie in der Cloud Console die Seite Google Kubernetes Engine auf.

    Zur Seite "Google Kubernetes Engine"

  2. Klicken Sie auf Erstellen.

  3. Konfigurieren Sie den Cluster wie gewünscht.

  4. Klicken Sie im Navigationsbereich unter Knotenpools auf Knoten.

  5. Wählen Sie in der Drop-down-Liste Bootlaufwerktyp die Option Nichtflüchtiger Standardspeicher oder Nichtflüchtiger SSD-Speicher aus.

  6. Aktivieren Sie das Kästchen Vom Kunden verwaltete Verschlüsselung des Bootlaufwerks aktivieren und wählen Sie den oben erstellten Cloud KMS-Verschlüsselungsschlüssel aus.

  7. Klicken Sie auf Erstellen.

Cluster mit CMEK-geschützten Knoten-Bootlaufwerken aktualisieren

Zum Erstellen eines neuen Knotenpools mit aktiviertem CMEK in einem vorhandenen Cluster können Sie den Befehl gcloud oder die Google Cloud Console verwenden.

gcloud

Um einen Knotenpool mit vom Kunden verwalteter Verschlüsselung für Knoten-Bootlaufwerke zu erstellen, geben Sie in Ihrem Erstellungsbefehl einen Wert für -boot-disk-kms-key parameter an.

gcloud container node-pools create NODE_POOL_NAME \
    --region COMPUTE_REGION \
    --disk-type DISK_TYPE \
    --boot-disk-kms-key projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/RING_NAME/cryptoKeys/KEY_NAME \
    --project CLUSTER_PROJECT_ID \
    --cluster CLUSTER_NAME

Dabei gilt:

  • NODE_POOL_NAME: der Name, den Sie für Ihren Knotenpool auswählen
  • COMPUTE_REGION: die Computing-Region für die Clustersteuerungsebene
  • DISK_TYPE: pd-standard (Standard) oder pd-ssd
  • KEY_PROJECT_ID: Ihre Schlüsselprojekt-ID
  • LOCATION: der Speicherort Ihres Schlüsselbunds
  • RING_NAME: der Name des Schlüsselbunds
  • KEY_NAME: der Name des Schlüssels
  • CLUSTER_PROJECT_ID: Ihre Clusterprojekt-ID
  • CLUSTER_NAME: der Name des Clusters, den Sie im vorherigen Schritt erstellt haben

Console

  1. Rufen Sie in der Cloud Console die Seite Google Kubernetes Engine auf:

    Zur Seite "Google Kubernetes Engine"

  2. Klicken Sie in der Clusterliste auf den Namen des Clusters, den Sie ändern möchten.

  3. Klicken Sie auf Knotenpool hinzufügen .

  4. Klicken Sie im Navigationsbereich auf Knoten.

  5. Prüfen Sie im Abschnitt Maschinenkonfiguration, ob der Bootlaufwerktyp entweder Nichtflüchtiger Standardspeicher oder Nichtflüchtiger SSD-Speicher ist.

  6. Aktivieren Sie das Kästchen Vom Kunden verwaltete Verschlüsselung des Bootlaufwerks aktivieren und wählen Sie den oben erstellten Cloud KMS-Verschlüsselungsschlüssel aus.

  7. Klicken Sie auf Erstellen.

CMEK-geschütztes angehängtes Laufwerk erstellen

Folgen Sie dieser Anleitung, um neu erstellte nichtflüchtige Speicher zu verschlüsseln. Sie können CMEK für einen neuen oder vorhandenen Cluster mithilfe eines neuen oder vorhandenen Cloud KMS-Schlüssels aktivieren.

Diese Schritte müssen für jeden GKE-Cluster ausgeführt werden:

StorageClass erstellen, die auf den Cloud KMS-Schlüssel verweist

  1. Kopieren Sie den nachstehenden Inhalt in eine YAML-Datei mit dem Namen gcepd-sc.yaml. Diese Konfiguration ermöglicht die dynamische Bereitstellung verschlüsselter Volumes:

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: csi-gce-pd-cmek
    provisioner: pd.csi.storage.gke.io
    volumeBindingMode: "WaitForFirstConsumer"
    allowVolumeExpansion: true
    parameters:
      type: pd-standard
      disk-encryption-kms-key: projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/RING_NAME/cryptoKeys/KEY_NAME
    
    • Das Feld disk-encryption-kms-key muss die voll qualifizierte Ressourcenkennung für den Schlüssel sein, der zum Verschlüsseln neuer Laufwerke verwendet wird.
    • Bei den Werten in disk-encryption-kms-key wird zwischen Groß- und Kleinschreibung unterschieden (z. B. keyRings und cryptoKeys). Die Bereitstellung eines neuen Volumes mit falschen Werten führt zum Fehler invalidResourceUsage.
    • Sie können die StorageClass als Standard festlegen.

    Sie können den Parameter disk-encryption-kms-key nicht einer vorhandenen StorageClass hinzufügen. Sie können die StorageClass jedoch löschen und mit demselben Namen, jedoch mit einer anderen Gruppe von Parametern neu erstellen. In diesem Fall muss der Bereitsteller der vorhandenen Klasse pd.csi.storage.gke.io sein.

  2. Stellen Sie StorageClass mithilfe von kubectlin Ihrem GKE-Cluster bereit:

    kubectl apply -f gcepd-sc.yaml
    
  3. Prüfen Sie noch, ob die StorageClass den CSI-Treiber für den nichtflüchtigen Speicher von Compute Engine verwendet hat und die ID Ihres Schlüssels enthält.

    kubectl describe storageclass csi-gce-pd-cmek
    

    Bestätigen Sie in der Ausgabe des Befehls Folgendes:

    • Der Bereitsteller wird auf pd.csi.storage.gke.io gesetzt.
    • Die ID Ihres Schlüssels folgt auf disk-encryption-kms-key.
    Name:                  csi-gce-pd-cmek
    IsDefaultClass:        No
    Annotations:           None
    Provisioner:           pd.csi.storage.gke.io
    Parameters:            disk-encryption-kms-key=projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/RING_NAME/cryptoKeys/KEY_NAME,type=pd-standard
    AllowVolumeExpansion:  unset
    MountOptions:          none
    ReclaimPolicy:         Delete
    VolumeBindingMode:     WaitForFirstConsumer
    Events:                none
    

Verschlüsselten nichtflüchtigen Speicher in GKE erstellen

In diesem Abschnitt stellen Sie verschlüsselte Kubernetes-Speicher-Volumes dynamisch mit Ihrer neuen StorageClass und Ihrem Cloud KMS-Schlüssel bereit.

  1. Kopieren Sie den folgenden Inhalt in eine neue Datei mit dem Namen pvc.yaml und achten Sie darauf, dass der Wert für storageClassName mit dem Namen Ihres StorageClass-Objekts übereinstimmt:

    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: podpvc
    spec:
      accessModes:
        - ReadWriteOnce
      storageClassName: csi-gce-pd-cmek
      resources:
        requests:
          storage: 6Gi
    
  2. Wenden Sie den PersistentVolumeClaim (PVC) auf Ihren GKE-Cluster an:

    kubectl apply -f pvc.yaml
    
  3. Wenn das volumeBindingMode-Feld für StorageClass auf WaitForFirstConsumer gesetzt ist, müssen Sie einen Pod erstellen, um den PVC zu verwenden, bevor Sie ihn prüfen können. Kopieren Sie den folgenden Inhalt in eine neue Datei mit dem Namen pod.yaml und achten Sie darauf, dass der Wert für claimName mit dem Namen Ihres PersistentVolumeClaim-Objekts übereinstimmt:

    apiVersion: v1
    kind: Pod
    metadata:
      name: web-server
    spec:
      containers:
       - name: web-server
         image: nginx
         volumeMounts:
           - mountPath: /var/lib/www/html
             name: mypvc
      volumes:
       - name: mypvc
         persistentVolumeClaim:
           claimName: podpvc
           readOnly: false
    
  4. Wenden Sie den Pod auf Ihren GKE-Cluster an:

    kubectl apply -f pod.yaml
    
  5. Rufen Sie den Status des PersistentVolumeClaim Ihres Clusters ab und prüfen Sie, ob der PVC erstellt und an ein neu bereitgestelltes PersistentVolume gebunden ist.

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

Sie können nun den durch CMEK geschützten nichtflüchtigen Speicher mit dem GKE-Cluster verwenden.

CMEK-Schutz von einem nichtflüchtigen Speicher entfernen

Folgen Sie der Anleitung in der Compute Engine-Dokumentation, um den CMEK-Schutz von einem nichtflüchtigen Speicher zu entfernen.

Nächste Schritte