Utilizzo delle chiavi di crittografia gestite dal cliente (CMEK)

Questa pagina descrive come utilizzare le chiavi di crittografia gestite dal cliente (CMEK) su Google Kubernetes Engine (GKE). Se devi controllare la gestione delle chiavi, puoi utilizzare Cloud Key Management Service e CMEK per proteggere i dischi permanenti collegati e i dischi di avvio personalizzati nel cluster GKE.

Panoramica

Per impostazione predefinita, Google Cloud cripta i contenuti dei clienti at-rest, e GKE gestisce la crittografia senza che tu debba eseguire alcuna azione da parte tua.

Se vuoi controllare e gestire autonomamente rotazione della chiave di crittografia, puoi utilizzare CMEK. Queste chiavi criptano le chiavi di crittografia dei dati che criptano i tuoi dati. Per ulteriori informazioni, vedi Gestione delle chiavi.

Puoi anche criptare i secret nel cluster utilizzando le chiavi che gestisci. Per maggiori dettagli, vedi Crittografia dei secret a livello di applicazione.

In GKE, CMEK può proteggere i dati di due tipi di dischi di archiviazione: dischi di avvio dei nodi e dischi collegati.

Dischi di avvio dei nodi
I dischi di avvio dei nodi fanno parte dei pool di nodi del cluster. Puoi creare un disco di avvio dei nodi criptato con CMEK quando crei cluster e pool di nodi.
Dischi collegati
I dischi collegati sono PersistentVolume utilizzati dai pod per l'archiviazione durevole. I dischi permanenti collegati criptati con CMEK sono disponibili in GKE come un PersistentVolume con provisioning dinamico.

Per saperne di più sui dischi di archiviazione, vedi Opzioni di archiviazione. I dischi del piano di controllo, utilizzati per i piani di controllo GKE, non possono essere protetti con CMEK.

Prima di iniziare

  1. Per eseguire gli esercizi di questo argomento, hai bisogno di due Google Cloud progetti:

    • Progetto chiave: qui crei una chiave di crittografia.

    • Progetto cluster: qui crei un cluster che abilita CMEK.

  2. Nel progetto chiave, assicurati di aver abilitato l'API Cloud KMS.

    Abilita l'API Cloud KMS

  3. Nel progetto chiave, l'utente che crea il keyring e la chiave deve disporre delle seguenti autorizzazioni IAM:

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

    Queste autorizzazioni vengono concesse al ruolo roles/cloudkms.admin Identity and Access Management predefinito. Puoi scoprire di più sulla concessione delle autorizzazioni per gestire chiavi nella documentazione di Cloud KMS.

  4. Nel progetto cluster, assicurati di aver abilitato l'API Cloud KMS.

    Abilita l'API Cloud KMS

  5. Assicurati di aver installato gcloud CLI.

  6. Aggiorna gcloud all'ultima versione:

    gcloud components update
    

Crea una chiave Cloud KMS

Prima di poter proteggere il disco di avvio del nodo o il disco collegato con una CMEK, devi disporre di un keyring e di una chiave Cloud KMS.

Il keyring e la chiave devono soddisfare i seguenti requisiti:

  • La chiave deve utilizzare la crittografia simmetrica.

  • Devi concedere al account di servizio GKE le autorizzazioni per utilizzare la chiave.

  • Il keyring deve avere una località che corrisponda a quella del cluster GKE:

    • Un cluster di zona deve utilizzare un keyring da una località superset. Ad esempio, un cluster in the us-central1-a zone può utilizzare solo una chiave nella regione us-central1.

    • Un cluster regionale deve utilizzare un keyring della stessa località. Ad esempio, un cluster nella regione asia-northeast1 deve essere protetto con un keyring della regione asia-northeast1.

    • La regione global di Cloud KMS non è supportata per l'utilizzo con GKE.

Per istruzioni su come creare un keyring e una chiave, vedi Creazione di chiavi simmetriche.

Concedi l'autorizzazione per utilizzare la chiave

Devi concedere il ruolo IAM Cloud KMS CryptoKey Encrypter/Decrypter (roles/cloudkms.cryptoKeyEncrypterDecrypter) sulla chiave Cloud KMS al service agent Compute Engine nel progetto cluster. La concessione di questo ruolo consente ai dischi permanenti GKE di accedere alla chiave di crittografia e utilizzarla.

Per concedere il ruolo roles/cloudkms.cryptoKeyEncrypterDecrypter al service agent Compute Engine, seleziona una delle seguenti opzioni:

gcloud

Esegui questo comando:

gcloud kms keys add-iam-policy-binding KEY_NAME \
    --location LOCATION \
    --keyring RING_NAME \
    --member serviceAccount:service-PROJECT_NUMBER@compute-system.iam.gserviceaccount.com \
    --role roles/cloudkms.cryptoKeyEncrypterDecrypter \
    --project KEY_PROJECT_ID

Sostituisci quanto segue:

  • KEY_NAME: il nome della chiave.
  • LOCATION: la regione in cui hai creato il keyring.
  • RING_NAME: il nome del keyring.
  • PROJECT_NUMBER: il numero del progetto del cluster.
  • KEY_PROJECT_ID: l'ID progetto.

Console

  1. Nella Google Cloud console, vai alla pagina Gestione delle chiavi.

    Vai a Gestione delle chiavi

  2. Fai clic sul nome del keyring che contiene la chiave.

  3. Fai clic sul nome della chiave che vuoi modificare.

  4. Fai clic sulla scheda Autorizzazioni.

  5. Fai clic su Concedi l'accesso. Si apre il riquadro Concedi l'accesso alla chiave.

  6. Nel campo Nuove entità, inserisci il nome del service agent Compute Engine:

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

    Sostituisci PROJECT_NUMBER con il numero del progetto del cluster.

  7. Nel menu Seleziona un ruolo, seleziona Cloud KMS CryptoKey Encrypter/Decrypter.

  8. Fai clic su Salva.

Utilizza i dischi di avvio dei nodi protetti da CMEK

In questa sezione, crei un nuovo cluster o pool di nodi con un disco di avvio protetto da CMEK.

Non puoi abilitare la crittografia gestita dal cliente per i dischi di avvio dei nodi in un cluster esistente, perché non puoi modificare il tipo di disco di avvio di un cluster o di un node pool esistente. Tuttavia, puoi creare un nuovo pool di nodi per il cluster con la crittografia gestita dal cliente abilitata ed eliminare il pool di nodi precedente.

Inoltre, non puoi disabilitare la crittografia gestita dal cliente per i dischi di avvio dei nodi in un cluster esistente o in un pool di nodi esistente. Tuttavia, puoi creare un nuovo node pool per il cluster con la crittografia gestita dal cliente disabilitata ed eliminare il pool di nodi precedente.

Crea un cluster con un disco di avvio dei nodi protetto da CMEK

Puoi creare un cluster con un disco di avvio dei nodi protetto da CMEK utilizzando la gcloud CLI o la Google Cloud console.

Per i cluster Standard, solo un disco permanente standard (pd-standard) o un disco permanente SSD (pd-ssd) può essere criptato con una chiave CMEK.

gcloud

Per creare un cluster il cui disco di avvio è criptato con una chiave CMEK, specifica un valore per il parametro --boot-disk-kms-key nel comando di creazione del cluster.

Crea un cluster Standard

Per creare un cluster Standard il cui disco di avvio è criptato con una chiave CMEK, utilizza il seguente comando:

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

Crea un cluster Autopilot

Per creare un cluster Autopilot il cui disco di avvio è criptato con una chiave CMEK, utilizza il seguente comando:

gcloud container clusters create-auto CLUSTER_NAME \
    --cluster-version=latest \
    --location CONTROL_PLANE_LOCATION \
    --boot-disk-kms-key projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/RING_NAME/cryptoKeys/KEY_NAME \
    --project CLUSTER_PROJECT_ID

Sostituisci quanto segue:

  • CLUSTER_NAME: il nome del nuovo cluster.
  • CONTROL_PLANE_LOCATION: la località Compute Engine del piano di controllo del cluster. Fornisci una regione per i cluster Standard e Autopilot regionali o una zona per i cluster Standard di zona.
  • KEY_PROJECT_ID: l'ID progetto.
  • LOCATION: la località del keyring.
  • RING_NAME: il nome del keyring.
  • KEY_NAME: il nome della chiave.
  • CLUSTER_PROJECT_ID è l'ID del progetto cluster.
  • DISK_TYPE: pd-standard (valore predefinito) o pd-ssd.

Console

Crea un cluster Standard

Per creare un cluster Standard il cui disco di avvio è criptato con una chiave CMEK, segui questi passaggi:

  1. Nella Google Cloud console, vai alla pagina Crea un cluster Kubernetes.

    Vai a Crea un cluster Kubernetes

  2. Configura il cluster come preferisci.
  3. Nel riquadro di navigazione, in Pool di nodi, fai clic su Nodi.
  4. Nell'elenco a discesa Tipo di disco di avvio, seleziona Disco permanente standard o Disco permanente SSD.
  5. Seleziona la casella di controllo Abilita la crittografia gestita dal cliente per il disco di avvio e scegli la chiave di crittografia Cloud KMS che hai creato in precedenza.
  6. Fai clic su Crea.

Crea un cluster Autopilot

Per creare un cluster Autopilot il cui disco di avvio è criptato con una chiave CMEK, segui questi passaggi:

  1. Nella Google Cloud console, vai alla pagina Crea un cluster Autopilot.

    Vai a Crea un cluster Autopilot

  2. Configura il cluster come preferisci.
  3. Espandi la sezione Opzioni avanzate e individua le opzioni Sicurezza.
  4. Seleziona la casella di controllo Abilita la crittografia gestita dal cliente per il disco di avvio e scegli la chiave di crittografia Cloud KMS che hai creato in precedenza.
  5. Fai clic su Crea.

Crea un nuovo pool di nodi con dischi di avvio dei nodi protetti da CMEK

Per creare un nuovo pool di nodi con CMEK abilitato in un cluster Standard esistente, puoi utilizzare gcloud CLI o la console. Google Cloud

gcloud

Per creare un pool di nodi con la crittografia gestita dal cliente per i dischi di avvio dei nodi, specifica un valore per il parametro --boot-disk-kms-key nel comando di creazione.

gcloud container node-pools create NODE_POOL_NAME \
    --location CONTROL_PLANE_LOCATION \
    --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

Sostituisci quanto segue:

  • NODE_POOL_NAME: il nome che scegli per il pool di nodi.
  • CONTROL_PLANE_LOCATION: la località Compute Engine del piano di controllo del cluster. Fornisci una regione per i cluster regionali o una zona per i cluster di zona.
  • DISK_TYPE: pd-standard (valore predefinito) o pd-ssd.
  • KEY_PROJECT_ID:l'ID progetto.
  • LOCATION: la località del keyring.
  • RING_NAME: il nome del keyring.
  • KEY_NAME: il nome della chiave.
  • CLUSTER_PROJECT_ID: l'ID progetto del cluster.
  • CLUSTER_NAME: il nome del cluster Standard che hai creato nel passaggio precedente.

Console

  1. Vai alla pagina Google Kubernetes Engine nella Google Cloud console.

    Vai a Google Kubernetes Engine

  2. Nell'elenco dei cluster, fai clic sul nome del cluster da modificare.

  3. Fai clic sulla scheda Nodi.

  4. Fai clic su Crea node pool gestito dall'utente.

  5. Nel riquadro di navigazione, fai clic su Nodi.

  6. Nella sezione Configurazione macchina, assicurati che Tipo di disco di avvio sia Disco permanente standard o Disco permanente SSD.

  7. Seleziona la casella di controllo Abilita la crittografia gestita dal cliente per il disco di avvio e seleziona la chiave di crittografia Cloud KMS che hai creato.

  8. Fai clic su Crea.

Utilizza le istanze Filestore o i dischi permanenti protetti da CMEK

Le seguenti informazioni riguardano come criptare le istanze Filestore o i dischi permanenti appena creati. Puoi abilitare CMEK su un cluster nuovo o esistente, utilizzando una chiave Cloud KMS nuova o esistente.

Queste istruzioni devono essere completate una volta per ogni cluster GKE:

Crea una StorageClass che faccia riferimento alla chiave Cloud KMS

  1. Copia i contenuti riportati di seguito in un file YAML denominato cmek-sc.yaml. Questa configurazione consente il provisioning dinamico dei volumi criptati.

    Istanze Filestore

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: csi-filestore-cmek
    provisioner: filestore.csi.storage.gke.io
    allowVolumeExpansion: true
    parameters:
      tier: enterprise
      instance-encryption-kms-key: projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/RING_NAME/cryptoKeys/KEY_NAME
    
    • Il campo instance-encryption-kms-key deve essere l' identificatore di risorsa completo della chiave che verrà utilizzata per criptare le nuove istanze Filestore.
    • I valori in instance-encryption-kms-key fanno distinzione tra maiuscole e minuscole (ad esempio: keyRings e cryptoKeys). Il provisioning di un nuovo volume con valori errati genera un errore invalidResourceUsage.
    • Non puoi aggiungere il parametro instance-encryption-kms-key a un oggetto StorageClass esistente. Tuttavia, puoi eliminare l'oggetto StorageClass e ricrearlo con lo stesso nome, ma con un insieme di parametri diverso.

    Dischi permanenti

    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
    
    • Il campo disk-encryption-kms-key deve essere l' identificatore di risorsa completo della chiave che verrà utilizzata per criptare i nuovi dischi.
    • I valori in disk-encryption-kms-key fanno distinzione tra maiuscole e minuscole (ad esempio: keyRings e cryptoKeys). Il provisioning di un nuovo volume con valori errati genera un errore invalidResourceUsage.
    • Non puoi aggiungere il parametro disk-encryption-kms-key a un oggetto StorageClass esistente. Tuttavia, puoi eliminare l'oggetto StorageClass e ricrearlo con lo stesso nome, ma con un insieme di parametri diverso. Assicurati che il provisioner della classe esistente sia pd.csi.storage.gke.io.

    Puoi impostare StorageClass come predefinita.

  2. Esegui il deployment di StorageClass nel cluster GKE utilizzando kubectl:

    kubectl apply -f cmek-sc.yaml
    
  3. Verifica che StorageClass abbia utilizzato il driver CSI per il disco permanente di Compute Engine o Filestore e includa l'ID della chiave:

    Istanze Filestore

    kubectl describe storageclass csi-filestore-cmek
    

    Nell'output del comando, verifica quanto segue:

    • Il provisioner è impostato come filestore.csi.storage.gke.io.
    • L'ID della chiave segue instance-encryption-kms-key.
    Name:                  csi-filestore-cmek
    IsDefaultClass:        No
    Annotations:           None
    Provisioner:           filestore.csi.storage.gke.io
    Parameters:            instance-encryption-kms-key=projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/RING_NAME/cryptoKeys/KEY_NAME,type=pd-standard
    AllowVolumeExpansion:  true
    MountOptions:          none
    ReclaimPolicy:         Delete
    VolumeBindingMode:     WaitForFirstConsumer
    Events:                none
    

    Dischi permanenti

    kubectl describe storageclass csi-gce-pd-cmek
    

    Nell'output del comando, verifica quanto segue:

    • Il provisioner è impostato come pd.csi.storage.gke.io.
    • L'ID della chiave segue 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
    

Crea un volume di archiviazione criptato in GKE

In questa sezione, esegui il provisioning dinamico dei volumi di archiviazione Kubernetes criptati con la nuova StorageClass e la chiave Cloud KMS.

  1. Copia i seguenti contenuti in un nuovo file denominato pvc.yaml e assicurati che il valore di storageClassName corrisponda al nome dell'oggetto StorageClass:

    Istanze Filestore

    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: podpvc
    spec:
      accessModes:
        - ReadWriteMany
      storageClassName: csi-filestore-cmek
      resources:
        requests:
          storage: 1Ti
    

    Dischi permanenti

    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: podpvc
    spec:
      accessModes:
        - ReadWriteOnce
      storageClassName: csi-gce-pd-cmek
      resources:
        requests:
          storage: 6Gi
    
  2. Applica PersistentVolumeClaim (PVC) nel cluster GKE:

    kubectl apply -f pvc.yaml
    
  3. Se il campo volumeBindingMode di StorageClass è impostato su WaitForFirstConsumer, devi creare un pod per utilizzare il PVC prima di poterlo verificare. Copia i seguenti contenuti in un nuovo file denominato pod.yaml e assicurati che il valore di claimName corrisponda al nome dell'oggetto PersistentVolumeClaim:

    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. Applica il pod nel cluster GKE:

    kubectl apply -f pod.yaml
    
  5. Recupera lo stato di PersistentVolumeClaim del cluster e verifica che il PVC sia creato e associato a un PersistentVolume di cui è stato eseguito il provisioning di recente.

    Istanze Filestore

    kubectl get pvc
    

    L'output è simile al seguente:

    NAME      STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS     AGE
    podpvc    Bound     pvc-e36abf50-84f3-11e8-8538-42010a800002   1Ti        RWO            csi-filestore-cmek  9s
    

    Dischi permanenti

    kubectl get pvc
    

    L'output è simile al seguente:

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

Ora puoi utilizzare il Persistent Disk protetto da CMEK con il cluster GKE.

Rimuovi la protezione CMEK

Quando cripti un Persistent Disk utilizzando una chiave Cloud KMS, la crittografia è permanente. Non puoi rimuovere la chiave di crittografia da quel disco specifico, anche se elimini o disabiliti la chiave Cloud KMS. L'unico modo per modificare la chiave di crittografia o rimuovere la protezione CMEK da un Persistent Disk è creare un nuovo Persistent Disk basato su uno snapshot del disco esistente. Per ulteriori informazioni, vedi Rimuovi la chiave di crittografia Cloud KMS da un disco permanente.

La crittografia CMEK non può essere rimossa dalle istanze Filestore.

Policy dell'organizzazione GKE e CMEK

GKE supporta le policy dell'organizzazione CMEK (anteprima) che possono richiedere la protezione CMEK e limitare le chiavi Cloud KMS che puoi utilizzare per la protezione CMEK.

Quando container.googleapis.com si trova nell'elenco dei servizi Deny per il vincolo constraints/gcp.restrictNonCmekServices, GKE rifiuta di creare le seguenti risorse se non abiliti la protezione CMEK:

  • Nuovi cluster e pool di nodi
  • Nuove istanze Filestore e dischi permanenti

Quando il vincolo constraints/gcp.restrictNonCmekCryptoKeyProjects è configurato in una policy dell'organizzazione, GKE crea solo risorse protette da CMEK che utilizzano una chiave di crittografia di un progetto, una cartella o un'organizzazione consentiti.

Passaggi successivi