Hantera och rotera certifikat i Azure Kubernetes Service (AKS)

Den här artikeln beskriver hur du hanterar och roterar certifikat i Azure Kubernetes Service (AKS) kluster för att upprätthålla säker kommunikation mellan komponenter och säkerställa efterlevnad.

Förutsättningar

  • Azure CLI version 2.0.77 eller senare. Kontrollera din version med hjälp az --version av kommandot . Information om hur du installerar eller uppgraderar finns i Installera Azure CLI.

Kontrollera certifikatets förfallodatum för klustercertifikatutfärdare

Kontrollera utgångsdatumet för klustrets CA-certifikat med kommandot kubectl config view.

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

Kontrollera förfallodatum för API-servercertifikat

Kontrollera förfallodatumet för API-servercertifikatet med hjälp av följande curl kommando:

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

Kontrollera förfallodatum för VMSS-agentens nodcertifikat

Kontrollera förfallodatumet för agentnodcertifikatet för skalningsuppsättningen för virtuella maskiner med kommandot 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"

Kontrollera förfallodatum för fristående VM-certifikat

Kontrollera förfallodatumet för en fristående virtuell dator med kommandot az vm run-command invoke .

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"

Rotera klustrets CA-certifikat manuellt

När du byter ut klustrets CA-certifikat uppdateras även följande underliggande certifikat:

  • Tjänstkontotoken (SA)
  • API-servercertifikat
  • Kubelet-klientcertifikat
  • Kubelet-servercertifikat (om kubelet som hanterar certifikatrotation är aktiverat i klustret)

Varning

När du roterar dina certifikat med az aks rotate-certs skapas alla dina noder, VM-skalningsuppsättningar och diskar på nytt. Den här processen kan orsaka upp till 30 minuters stilleståndstid för ditt AKS-kluster. Om kommandot misslyckas innan det slutförs använder du kommandot az aks show för att kontrollera att klustrets status visas som Certificate Rotating. Om klustret är i ett feltillstånd, kör az aks rotate-certs för att rotera dina certifikat igen.

  1. Anslut till klustret med kommandot az aks get-credentials .

    az aks get-credentials --resource-group <resource-group> --name <cluster-name>
    
  2. Rotera alla certifikat, certifikatutfärdare och serviceavtal i klustret med hjälp av az aks rotate-certs kommandot .

    az aks rotate-certs --resource-group <resource-group> --name <cluster-name>
    
  3. Kontrollera att de gamla certifikaten inte längre är giltiga med något kubectl kommando, till exempel kubectl get nodes.

    kubectl get nodes
    

    Om du inte har uppdaterat certifikaten som används av kubectlvisas ett fel som liknar följande exempelutdata:

    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")
    

Uppdatera kubectl klientcertifikat

  1. Uppdatera klientcertifikatet med kommandot az aks get-credentials med flaggan --overwrite-existing.

    az aks get-credentials --resource-group <resource-group> --name <cluster-name> --overwrite-existing
    
  2. Kontrollera att certifikaten har uppdaterats med hjälp av kubectl get kommandot .

    kubectl get nodes
    

    Note

    Om du har tjänster som körs ovanpå AKS kan du behöva uppdatera deras certifikat.

Kontrollera att kubelet som betjänar certifikatrotation är aktiverat

Varje nod med funktionen aktiverad får automatiskt etiketten kubernetes.azure.com/kubelet-serving-ca=cluster. Kontrollera att etiketterna är inställda genom att använda kommandot kubectl get nodes -L kubernetes.azure.com/kubelet-serving-ca.

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

Kontrollera att kubelet går igenom TLS-bootstrappingprocessen

När du aktiverar den här funktionen går varje kubelet som kör noderna igenom TLS-startprocessen.

Kontrollera att bootstrapping-processen pågår med kommandot kubectl get för att hämta de aktuella CSR-objekten i klustret.

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

Alla aktuella CSR:er är i tillståndet Approved,Issued, vilket innebär att CSR:n godkändes och att ett signerat certifikat utfärdades. Server-CSR:er har ett undertecknarnamn på kubernetes.io/kubelet-serving. Ett exempel:

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

Kontrollera att kubelet använder ett certifikat som hämtats från serverns TLS-start

Kontrollera om nodens kubelet använder ett servercertifikat som signerats av klustercertifikatutfärdaren med kommandot [kubectl debug][kubectl-debug] för att undersöka innehållet i kubelets PKI-katalog.

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

Om det finns en kubelet-server-current.pem symlink startar kubelet och roterar sitt eget servercertifikat via TLS-startprocessen och signeras av klustercertifikatutfärdaren.

Inaktivera kubelet som betjänar certifikatrotation

  1. Inaktivera kubelet som betjänar certifikatrotation genom att uppdatera nodpoolen az aks nodepool update med kommandot och ange taggen 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. Återskapa noderna med hjälp av en nodbilduppgradering eller genom att skala poolen till noll instanser och sedan justera tillbaka till önskat värde.

Mer information om AKS-säkerhet finns i följande artiklar: