Gerir e renovar certificados no Azure Kubernetes Service (AKS)

Este artigo explica como gerir e rodar certificados em clusters Azure Kubernetes Service (AKS) para manter uma comunicação segura entre componentes e garantir a conformidade.

Pré-requisitos

  • CLI do Azure versão 2.0.77 ou posterior. Verifica a tua versão usando o az --version comando. Para instalar ou atualizar, consulte Install CLI do Azure.

Verifique a data de expiração do certificado da autoridade certificadora (CA) do cluster

Verifique a data de expiração do certificado de CA do cluster usando o kubectl config view comando.

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

Verifique a data de expiração do certificado do servidor de API

Verifique a data de expiração do certificado do servidor API usando o seguinte curl comando:

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

Verifique a data de expiração do certificado do nó do agente VMSS

Verifique a data de expiração do certificado do nó do agente do conjunto de escala da máquina virtual usando o az vmss run-command invoke comando.

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"

Verifique a data de expiração do certificado de VM independente

Verifique a data de validade de uma VM autónoma usando o 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"

Efetuar manualmente a rotação dos certificados de CA do cluster

Quando efetua a rotação do certificado da AC do cluster, os seguintes certificados subordinados também são atualizados:

  • Tokens da conta de serviço (SA)
  • Certificados de servidor API
  • Certificados de cliente Kubelet
  • Certificados de servidor Kubelet (se a rotação de certificados de serviço Kubelet estiver ativada no cluster)

Warning

A rotação dos teus certificados com az aks rotate-certs recria todos os teus nós, conjuntos de dimensionamento de máquinas virtuais e discos. Este processo pode causar até 30 minutos de indisponibilidade para o seu cluster AKS. Se o comando falhar antes de estar concluído, use o comando az aks show para verificar se o estado do cluster aparece como Certificate Rotating. Se o cluster estiver em um estado de falha, execute az aks rotate-certs novamente para girar seus certificados novamente.

  1. Conecte-se ao cluster usando o az aks get-credentials comando.

    az aks get-credentials --resource-group <resource-group> --name <cluster-name>
    
  2. Gire todos os certificados, CAs e SAs no cluster usando o az aks rotate-certs comando.

    az aks rotate-certs --resource-group <resource-group> --name <cluster-name>
    
  3. Verifique se os certificados antigos não são mais válidos usando qualquer kubectl comando, como kubectl get nodes.

    kubectl get nodes
    

    Se não atualizou os certificados usados por kubectl, verá um erro semelhante ao seguinte exemplo de saída:

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

Atualizar kubectl certificados do cliente

  1. Atualize o kubectl certificado do cliente usando o az aks get-credentials comando com a --overwrite-existing bandeira.

    az aks get-credentials --resource-group <resource-group> --name <cluster-name> --overwrite-existing
    
  2. Verifique se os certificados são atualizados usando o kubectl get comando.

    kubectl get nodes
    

    Note

    Se você tiver algum serviço executado em cima do AKS, talvez seja necessário atualizar seus certificados.

Verifique se a rotação do certificado de serviço kubelet está ativada

Cada nó com o recurso ativado recebe automaticamente o rótulo kubernetes.azure.com/kubelet-serving-ca=cluster. Verifique se as etiquetas estão definidas usando o kubectl get nodes -L kubernetes.azure.com/kubelet-serving-ca comando.

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

Verifique se o kubelet passa pelo processo de inicialização TLS

Quando ativa esta funcionalidade, cada kubelet em execução nos seus nós passa pelo processo de inicialização TLS de serviço.

Verifica se o processo de bootstrapping está a decorrer usando o kubectl get comando para obter os objetos CSR atuais dentro do teu cluster.

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

Todos os CSRs ativos estão no estado Approved,Issued, o que indica que o CSR foi aprovado e que foi emitido um certificado assinado. As CSRs de serviço têm um nome de signatário de kubernetes.io/kubelet-serving. Por exemplo:

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

Verifique se o kubelet está usando um certificado obtido da inicialização do servidor TLS

Confirme se o kubelet do nó está a usar um certificado de servidor assinado pela autoridade de certificação (CA) do cluster, utilizando o comando [kubectl debug][kubectl-debug] para examinar o conteúdo do diretório PKI do 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 existir uma kubelet-server-current.pem ligação simbólica, o kubelet inicializa e renova o seu próprio certificado de servidor através do processo de arranque TLS, e esse certificado é assinado pela AC do cluster.

Desativar a rotação do certificado de serviço kubelet

  1. Desative a rotação do certificado de servidor do kubelet atualizando o conjunto de nós utilizando o comando az aks nodepool update e especificando a 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. Reimagina os teus nós usando uma atualização de imagem de nós ou escalando o pool para zero instâncias e depois volta ao valor desejado.

Para mais informações sobre a segurança do AKS, consulte os seguintes artigos: