Come cifrare ETCD di Kubernetes con OVHcloud KMS

Vedi come Markdown

Scopri come configurare Kubernetes per cifrare lo storage ETCD con l'interfaccia KMIP di OVHcloud KMS

Obiettivo

Questa guida spiega come configurare il provider di crittografia del kube-apiserver che permette ai cluster Kubernetes di cifrare e decifrare i dati a riposo utilizzando OVHcloud KMS tramite il protocollo KMIP.

Prerequisiti

Procedura

Installazione del binario

Il binario può essere installato direttamente dai pacchetti Go.

go install github.com/ovh/okms-k8s-encryption-provider@latest

Oppure è possibile compilarlo a partire dai sorgenti.

git clone https://github.com/ovh/okms-k8s-encryption-provider.git
cd okms-k8s-encryption-provider
go build -o okms-k8s-encryption-provider

Configurazione di OVHcloud KMS (OKMS)

Per utilizzare OVHcloud KMS come provider di crittografia per Kubernetes, sono necessari i seguenti elementi:

  • Un utente OVHcloud e i permessi per gestire le chiavi KMIP di OKMS.
  • Un certificato di accesso per il tuo dominio OKMS.
  • Una chiave KMIP AES nel tuo OKMS.

Creazione dell'utente e dei diritti di accesso

Crea un utente locale IAM con diritti di accesso sul tuo dominio.

Se utilizzi invece delle policy IAM, l'utente deve disporre almeno dei seguenti diritti sul dominio OKMS:

  • okms:kmip:encrypt
  • okms:kmip:decrypt
  • okms:kmip:locate

In caso contrario, l'utente deve appartenere a un gruppo dotato del ruolo ADMIN.

In alternativa, è possibile creare un utente utilizzando la CLI OVHcloud:

ovhcloud iam user create --login "etcd-encryption" --group ADMIN --description "A user created for ETCD encryption" --password "xxxxxxxxx" --email "xxxxx@mycompany.com"

Creazione del certificato di accesso

Crea un certificato di accesso OKMS e collega l'utente creato in precedenza.

Salva il certificato cert.pem e la chiave privata key.pem generati, poiché saranno necessari per la configurazione del provider di crittografia.

Creazione della chiave KMIP AES

Per creare una chiave KMIP AES, puoi utilizzare la CLI OKMS:

Inizia scaricando il binario dell'ultima versione oppure compilandolo a partire dai sorgenti.

Successivamente, puoi creare una chiave utilizzando:

okms-cli kmip create symmetric --alg aes --size 256

Conserva l'ID della chiave generata. Per il resto della guida utilizzeremo l'ID 70001308-5674-43fe-93dd-6270ecac0710 come esempio.

Per maggiori dettagli sull'utilizzo di okms-cli, consulta il repository GitHub.

Configurazione del provider di crittografia

Il provider di crittografia può essere eseguito direttamente sugli host kube-apiserver con il seguente comando:

./okms-k8s-encryption-provider \
  --client-cert "~/.ovh-kms/cert.pem" \
  --client-key "~/.ovh-kms/key.pem" \
  --kmip-addr "eu-west-par.okms.ovh.net:5696" \
  --kmip-key-id "70001308-5674-43fe-93dd-6270ecac0710"

Il provider di crittografia supporta le seguenti opzioni:

OpzioneDescrizionePredefinito
--client-certPercorso del file del certificato client per l'autenticazione su OVHcloud KMS."" (obbligatorio)
--client-keyPercorso del file della chiave privata associata al certificato client."" (obbligatorio)
--kmip-addrIndirizzo del server KMIP. Disponibile nella . (ad esempio: eu-west-rbx.okms.ovh.net:5696)."" (obbligatorio)
--kmip-key-idIdentificativo della chiave di crittografia da utilizzare sul server KMIP."" (obbligatorio)
--sockPercorso del socket Unix su cui il provider resterà in ascolto. Deve essere montato all'interno dell'apiserver di Kubernetes./var/run/okms_etcd_plugin.sock
--timeoutTimeout per le operazioni del server gRPC.10s
--debugAttiva le tracce di debug.false

Configurazione di Kubernetes

Sulla base della guida ufficiale di Kubernetes per cifrare i dati con un provider KMS, aggiungi le seguenti opzioni al tuo kube-apiserver:

  --encryption-provider-config=<path/to>/encryption-config.yaml
  # Opzionale: ricarica il file se viene aggiornato
  --encryption-provider-config-automatic-reload=true

Assicurati di montare nel kube-apiserver la directory che contiene il socket Unix su cui è in ascolto il server KMS.

Un esempio di encryption-config.yaml:

apiVersion: apiserver.config.k8s.io/v1
kind: EncryptionConfiguration
resources:
  - resources:
    - secrets
    providers:
    - kms:
        name: okms-encryption-provider
        endpoint: unix:///var/run/okms_etcd_plugin.sock
        cachesize: 1000
        timeout: 3s
    - identity: {}

Convalida della configurazione

Crea un secret con kubectl create secret generic okms-test-secret -n default --from-literal=mykey=mydata, quindi verifica il contenuto del secret nello storage ETCD eseguendo il seguente comando:

ETCDCTL_API=3 etcdctl \
    --key /rootfs/etc/kubernetes/pki/kube-apiserver/etcd-client.key \
    --cert  /rootfs/etc/kubernetes/pki/kube-apiserver/etcd-client.crt \
    --cacert /rootfs/etc/kubernetes/pki/kube-apiserver/etcd-ca.crt  \
    --endpoints "https://etcd-a.internal.${CLUSTER}:4001" get /registry/secrets/default/okms-test-secret

L'output dovrebbe essere illeggibile:

0m`�He.0�cryption-provider:�1x��%�B���#JP��J���*ȝ���΂@\n�96�^��ۦ�~0| *�H��
                    `q�*�J�.P��;&~��o#�O�8m��->8L��0�C3���A7�����~���f�V�ܬ���X��_��`�H#�D��z)+�81��qW��y��`�q��}1<LF, ��N��p����i*�aC#E�߸�s������s��l�?�a
�AźR������.��8H�4�O

Implementazione della rotazione delle chiavi

Per ruotare la tua chiave, dovrai eseguire due provider di crittografia, ciascuno in ascolto su un socket Unix diverso.

Di seguito è riportato un esempio di file di configurazione della crittografia per tutti i server API prima di utilizzare la nuova chiave:

apiVersion: apiserver.config.k8s.io/v1
kind: EncryptionConfiguration
resources:
  - resources:
    - secrets
    providers:
    # provider che utilizza la vecchia chiave
    - kms:
        name: okms-encryption-provider
        endpoint: unix:///var/run/kmsplugin/socket.sock
        cachesize: 1000
        timeout: 3s
    # provider che utilizza la nuova chiave
    - kms:
        name: okms-encryption-provider-2
        endpoint: unix:///var/run/kmsplugin/socket2.sock
        cachesize: 1000
        timeout: 3s
    - identity: {}

Una volta che tutti i server API sono stati riavviati e sono in grado di decifrare utilizzando la nuova chiave, sposta il provider con la nuova chiave in cima.

Una volta che tutti i secret sono stati ricifrati con la nuova chiave, puoi rimuovere il vecchio provider di crittografia.

Per saperne di più

Contatta la nostra Community di utenti.

Scopri come utilizzare Kubernetes External Secrets Operator con Secret Manager.

Questa pagina ti è stata utile?