Gestire e ruotare i certificati in Servizio Azure Kubernetes (AKS)

Questo articolo illustra come gestire e ruotare i certificati nei cluster Servizio Azure Kubernetes (AKS) per mantenere la comunicazione sicura tra i componenti e garantire la conformità.

Prerequisiti

Controllare la data di scadenza del certificato dell'autorità di certificazione del cluster

Controllare la data di scadenza del certificato della CA del cluster usando il kubectl config view comando .

kubectl config view --raw -o jsonpath="{.clusters[?(@.name == '')].cluster.certificate-authority-data}" | base64 -d | openssl x509 -text | grep -A2 Validity

Controllare la data di scadenza del certificato del server API

Controllare la data di scadenza del certificato del server API usando il comando seguente curl :

curl https://{apiserver-fqdn} -k -v 2>&1 | grep expire

Controllare la data di scadenza del certificato del nodo agente VMSS

Controllare la data di scadenza del certificato del nodo dell’agente del set di scalabilità di macchine virtuali utilizzando il comando az vmss run-command invoke.

az vmss run-command invoke \
    --resource-group <node-resource-group> \
    --name <vmss-name> \
    --command-id RunShellScript \
    --instance-id 1 \
    --scripts "openssl x509 -in  /var/lib/kubelet/pki/kubelet-client-current.pem -noout -enddate" \
    --query "value[0].message"

Controllare la data di scadenza del certificato della macchina virtuale autonoma

Controllare la data di scadenza di una macchina virtuale autonoma usando il az vm run-command invoke comando .

az vm run-command invoke \
    --resource-group <resource-group> \
    --name <vm-name> \
    --command-id RunShellScript \
    --scripts "openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem -noout -enddate" \
    --query "value[0].message"

Ruotare manualmente i certificati CA del cluster

Quando si ruota il certificato ca del cluster, vengono aggiornati anche i certificati figlio seguenti:

  • Token dell'account di servizio (SA)
  • Certificati del server API
  • Certificati client di Kubelet
  • Certificati del server Kubelet (se la rotazione del certificato kubelet è abilitata nel cluster)

Avvertimento

La rotazione dei certificati tramite az aks rotate-certs ricrea tutti i nodi, i set di scalabilità di macchine virtuali e i dischi. Questo processo può causare fino a 30 minuti di inattività per il cluster del servizio Azure Kubernetes. Se il comando non riesce prima del completamento, usare il comando az aks show per verificare che lo stato del cluster mostri Certificate Rotating. Se il cluster si trova in uno stato di errore, eseguire di nuovo az aks rotate-certs per ruotare nuovamente i certificati.

  1. Connettersi al cluster utilizzando il comando az aks get-credentials.

    az aks get-credentials --resource-group <resource-group> --name <cluster-name>
    
  2. Ruotare tutti i certificati, le autorità di certificazione e gli account di servizio nel cluster utilizzando il comando az aks rotate-certs.

    az aks rotate-certs --resource-group <resource-group> --name <cluster-name>
    
  3. Verificare che i certificati precedenti non siano più validi usando un comando kubectl qualsiasi, ad esempio kubectl get nodes.

    kubectl get nodes
    

    Se i certificati usati da kubectlnon sono stati aggiornati, viene visualizzato un errore simile all'output di esempio seguente:

    Unable to connect to the server: x509: certificate signed by unknown authority (possibly because of "crypto/rsa: verification error" while trying to verify candidate authority certificate "ca")
    

Aggiornare kubectl i certificati client

  1. Aggiornare il certificato client kubectl utilizzando il comando az aks get-credentials con l'opzione --overwrite-existing.

    az aks get-credentials --resource-group <resource-group> --name <cluster-name> --overwrite-existing
    
  2. Verificare che i certificati vengano aggiornati usando il kubectl get comando .

    kubectl get nodes
    

    Note

    Se si dispone di servizi eseguiti sul servizio Azure Kubernetes, potrebbe essere necessario aggiornare i certificati.

Verificare che la rotazione del certificato kubelet sia abilitata

A ogni nodo con la funzionalità abilitata viene assegnata automaticamente l'etichetta kubernetes.azure.com/kubelet-serving-ca=cluster. Verificare che le etichette siano impostate usando il kubectl get nodes -L kubernetes.azure.com/kubelet-serving-ca comando .

kubectl get nodes -L kubernetes.azure.com/kubelet-serving-ca

Verificare che kubelet esegua il processo di bootstrap TLS

Quando si abilita questa funzionalità, ogni kubelet che esegue i nodi passa attraverso il processo di bootstrap TLS.

Verifica che il processo di bootstrap sia effettivamente in esecuzione usando il comando kubectl get per ottenere gli oggetti CSR attualmente presenti nel cluster.

kubectl get csr --field-selector=spec.signerName=kubernetes.io/kubelet-serving

Tutti i CSR attivi si trovano nello stato Approved,Issued, il che indica che la richiesta di firma del certificato è stata approvata e che è stato rilasciato un certificato firmato. I CSR attivi hanno un nome firmatario kubernetes.io/kubelet-serving. Per esempio:

NAME        AGE    SIGNERNAME                                    REQUESTOR                    REQUESTEDDURATION   CONDITION
csr-1ab2c   113s   kubernetes.io/kube-apiserver-client-kubelet   system:bootstrap:abcd1e      none              Approved,Issued
csr-defgh   111s   kubernetes.io/kubelet-serving                 system:node:akswinp1000000   none              Approved,Issued
csr-ij3kl   46m    kubernetes.io/kubelet-serving                 system:node:akswinp2000000   none              Approved,Issued
csr-mn4op   46m    kubernetes.io/kube-apiserver-client-kubelet   system:bootstrap:ab1cde      none              Approved,Issued

Verificare che kubelet usi un certificato ottenuto dal bootstrap TLS del server

Verificare se il kubelet del nodo usa un certificato di servizio firmato dalla CA del cluster usando il comando [kubectl debug][kubectl-debug] per esaminare il contenuto della directory PKI di kubelet.

kubectl debug node/<node> -ti --image=mcr.microsoft.com/azurelinux/base/core:3.0 -- ls -l /host/var/lib/kubelet/kubelet-server-current.pem

Se esiste un kubelet-server-current.pem collegamento simbolico, il kubelet inizializza tramite bootstrap e ruota il proprio certificato server attraverso il processo di bootstrap TLS, che è firmato dalla CA del cluster.

Disabilitare la rotazione dei certificati di servizio in kubelet

  1. Disabilitare la rotazione del certificato in kubelet aggiornando il pool di nodi usando il az aks nodepool update comando e specificando il tag aks-disable-kubelet-serving-certificate-rotation=true.

    az aks nodepool update \
        --cluster-name <cluster-name> \
        --resource-group <resource-group> \
        --name <node-pool-name> \
        --tags aks-disable-kubelet-serving-certificate-rotation=true
    
  2. Riformatta i nodi usando un aggiornamento dell'immagine del nodo o ridimensionando il pool a zero istanze e poi ridimensionandolo di nuovo al valore desiderato.

Per altre informazioni sulla sicurezza del servizio Azure Kubernetes, vedere gli articoli seguenti: