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). Per controllare delle tue chiavi, puoi utilizzare Cloud Key Management Service e per proteggere i dischi permanenti collegati e i dischi di avvio personalizzati nel tuo cluster GKE.

Panoramica

Per impostazione predefinita, Google Cloud cripta i contenuti at-rest dei clienti, e GKE gestisce la crittografia per te senza che sia necessario alcun intervento parte.

Se vuoi controllare e gestire autonomamente la rotazione delle chiavi di crittografia, puoi utilizzare le chiavi CMEK. Queste chiavi criptano le chiavi di crittografia dei dati che criptano i tuoi dati. Per maggiori informazioni, consulta la sezione Gestione delle chiavi.

Puoi anche criptare i segreti 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: i dischi di avvio dei nodi e i 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 del nodo criptato con CMEK quando crei cluster e pool di nodi.
Dischi collegati
I dischi collegati sono volumi permanenti utilizzati dai pod per lo stoccaggio duraturo. I dischi permanenti criptati con CMEK sono disponibili in GKE come oggetto PersistentVolume con provisioning dinamico.

Per scoprire 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, sono necessari due progetti Google Cloud:

    • Progetto chiavi: è qui che crei una chiave di crittografia.

    • Progetto cluster: è dove crei un cluster che abilita tramite 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 avere autorizzazioni IAM seguenti:

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

    Queste autorizzazioni vengono concesse all'entità predefinita roles/cloudkms.admin Ruolo Identity and Access Management. Puoi scoprire di più sulla concessione delle autorizzazioni per la gestione delle chiavi nella documentazione di Cloud KMS.

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

    Abilita l'API Cloud KMS

  5. Assicurati di aver installato gcloud CLI.

  6. Aggiorna gcloud alla versione più recente:

    gcloud components update
    

Crea una chiave Cloud KMS

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

Il keyring e la chiave hanno i seguenti requisiti:

  • La chiave deve utilizzare la crittografia simmetrica.

  • Devi concedere le autorizzazioni dell'account di servizio GKE a la chiave.

  • Il keyring deve avere una posizione corrispondente a quella del cluster GKE:

    • Un cluster di zona deve utilizzare un keyring da una posizione superset. Ad esempio, un cluster in La zona us-central1-a può usare una chiave solo nella regione us-central1.

    • Un cluster a livello di regione deve utilizzare un keyring della stessa posizione. Ad esempio, un cluster La regione asia-northeast1 deve essere protetta con un keyring della regione asia-northeast1.

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

Per istruzioni su come creare un mazzo di chiavi e una chiave, consulta la sezione Creazione di chiavi simmetriche.

Concedi l'autorizzazione per utilizzare la chiave

Devi assegnare all'account di servizio Compute Engine utilizzato dai nodi del cluster il ruolo Autore crittografia/decrittografia CryptoKey Cloud KMS. Questo è necessario per consentire ai dischi permanenti GKE di accedere e utilizzare la chiave di crittografia.

Il nome dell'account di servizio Compute Engine ha il seguente formato:

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

Sostituisci PROJECT_NUMBER con il numero del progetto del tuo cluster.

Per concedere l'accesso all'account di servizio, puoi utilizzare il comando gcloud o la console Google Cloud.

gcloud

Concedi al tuo account di servizio Compute Engine Ruolo Autore crittografia/decrittografia CryptoKey Cloud KMS:

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

Sostituisci quanto segue:

  • KEY_NAME: il nome della chiave.
  • LOCATION: la regione in cui hai creato il keyring.
  • RING_NAME: il nome del tuo keyring.
  • SERVICE_ACCOUNT: il nome del tuo account servizio Compute Engine.
  • KEY_PROJECT_ID: l'ID del tuo progetto principale.

Console

Concedi al tuo account di servizio Compute Engine il ruolo Autore crittografia/decrittografia CryptoKey Cloud KMS:

  1. Apri il browser Chiavi di Cloud Key Management Service nella console Google Cloud.
    Apri il browser delle chiavi Cloud KMS
  2. Fai clic sul nome del keyring contenente la chiave che ti interessa.

  3. Seleziona la casella di controllo della chiave desiderata.

    La scheda Autorizzazioni nel riquadro della finestra a destra diventa disponibile.

  4. Nella finestra di dialogo Aggiungi membri, specifica l'indirizzo email Account di servizio Compute Engine a cui stai concedendo l'accesso.

  5. Nel menu a discesa Seleziona un ruolo, seleziona Cloud KMS CryptoKey Encrypter/Decrypter.

  6. Fai clic su Salva.

Usa 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 su un perché non puoi modificare il tipo di disco di avvio di un cluster o di un nodo esistente. piscina. Tuttavia, puoi creare un nuovo pool di nodi per il tuo cluster con la crittografia gestita dal cliente abilitata ed eliminare il pool di nodi precedente.

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

Creare un cluster con un disco di avvio del nodo protetto da CMEK

Puoi creare un cluster con un disco di avvio del nodo protetto da CMEK utilizzando il metodo con gcloud CLI o la console Google Cloud.

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 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 un chiave CMEK, utilizza il seguente comando:

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

Creare 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 \
    --region COMPUTE_REGION \
    --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.
  • COMPUTE_REGION: la regione di calcolo per il piano di controllo del cluster.
  • KEY_PROJECT_ID: l'ID progetto chiave.
  • LOCATION: la posizione del keyring.
  • RING_NAME: il nome del tuo keyring.
  • KEY_NAME: il nome della chiave.
  • CLUSTER_PROJECT_ID è l'ID progetto del 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, svolgi i seguenti passaggi:

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

    Vai a Google Kubernetes Engine

  2. Fai clic su Crea.

  3. Nella sezione Standard, fai clic su Configura.

  4. Configura il cluster come preferisci.

  5. Nel riquadro di navigazione, in Pool di nodi, fai clic su Nodi.

  6. Nell'elenco a discesa Tipo di disco di avvio, seleziona 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 scegli la chiave di crittografia di Cloud KMS che hai creato in precedenza.

  8. Fai clic su Crea.

Creare un cluster Autopilot

Per creare un cluster Autopilot il cui disco di avvio è criptato con un chiave CMEK, svolgi i seguenti passaggi:

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

    Vai a Google Kubernetes Engine

  2. Fai clic su Crea.

  3. Nella sezione Autopilot, fai clic su Configura.

  4. Configura il cluster come preferisci.

  5. Espandi la sezione Opzioni avanzate e individua le opzioni Sicurezza.

  6. Seleziona la casella di controllo Abilita la crittografia gestita dal cliente per il disco di avvio e scegli la chiave di crittografia di Cloud KMS che hai creato in precedenza.

  7. 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 abilitata su un cluster standard esistente, puoi utilizzare gcloud CLI o la console Google Cloud.

gcloud

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

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

Sostituisci quanto segue:

  • NODE_POOL_NAME: il nome scelto per il pool di nodi.
  • COMPUTE_REGION: la regione di calcolo per il piano di controllo del cluster.
  • DISK_TYPE: pd-standard (valore predefinito) o pd-ssd.
  • KEY_PROJECT_ID: il tuo ID progetto principale.
  • LOCATION: la posizione del portachiavi.
  • RING_NAME: il nome del tuo keyring.
  • KEY_NAME: il nome della chiave.
  • CLUSTER_PROJECT_ID: ID progetto del cluster.
  • CLUSTER_NAME: il nome del cluster standard creato nel passaggio precedente.

Console

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

    Vai a Google Kubernetes Engine

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

  3. Fai clic su Aggiungi pool di nodi.

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

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

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

  7. Fai clic su Crea.

Utilizza istanze Filestore o dischi permanenti protetti da CMEK

Le seguenti informazioni spiegano come criptare i file Filestore appena creati di Compute Engine o dischi permanenti. 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 un StorageClass che fa riferimento alla chiave Cloud KMS

  1. Copia il contenuto seguente in un file YAML denominato cmek-sc.yaml. Questo 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 il identificatore risorsa completo per la chiave che verrà utilizzata per criptare le nuove istanze Filestore.
    • I valori in instance-encryption-kms-key sono sensibili alle maiuscole (ad esempio: keyRings e cryptoKeys). È in corso il provisioning di un nuovo volume con genera un errore invalidResourceUsage.
    • Non puoi aggiungere il parametro instance-encryption-kms-key a un StorageClass esistente. Tuttavia, puoi eliminare StorageClass e lo ricrea con lo stesso nome, ma con un insieme diverso parametri.

    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 il identificatore di risorsa completo per la chiave che verrà utilizzata per criptare i nuovi dischi.
    • I valori in disk-encryption-kms-key sono sensibili alle maiuscole (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 rigenerarlo con lo stesso nome, ma con un insieme diverso di parametri. Marca assicurati che il provisioner della classe esistente sia pd.csi.storage.gke.io.

    Puoi impostare StorageClass come predefinito.

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

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

    Istanze Filestore

    kubectl describe storageclass csi-filestore-cmek
    

    Nell'output del comando, verifica quanto segue:

    • Il provisioning è impostato su filestore.csi.storage.gke.io.
    • L'ID della tua 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 provisioning è impostato su 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
    

Creare un volume di archiviazione criptato in GKE

In questa sezione, esegui il provisioning dinamico dei volumi di archiviazione Kubernetes criptati con la nuova chiave StorageClass e 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) al cluster GKE:

    kubectl apply -f pvc.yaml
    
  3. Se il campo volumeBindingMode di StorageClass è impostato su WaitForFirstConsumer, devi creare un pod per utilizzare la PVC prima di poter verificarlo. 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 al tuo cluster GKE:

    kubectl apply -f pod.yaml
    
  5. Ottieni lo stato di PersistentVolumeClaim del cluster e verifica che La PVC viene creata e associata 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 tuo cluster GKE.

Rimuovere la protezione CMEK

Per rimuovere la protezione CMEK da un Persistent Disk, segui le istruzioni riportate nella Documentazione di Compute Engine.

Impossibile rimuovere la crittografia CMEK dalle istanze Filestore.

Criteri dell'organizzazione GKE e CMEK

GKE supporta Criteri 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 è nell'elenco dei servizi del criterio Deny per la Vincolo di constraints/gcp.restrictNonCmekServices, GKE rifiuta per creare le risorse seguenti 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 un criterio dell'organizzazione, GKE crea Risorse protette da CMEK che usano una chiave di crittografia di un progetto consentito cartella o organizzazione.

Passaggi successivi