Gerenciar e girar certificados no AKS (Serviço de Kubernetes do Azure)

Este artigo explica como gerenciar e girar certificados em clusters AKS (Serviço de Kubernetes do Azure) para manter a comunicação segura entre componentes e garantir a conformidade.

Pré-requisitos

  • CLI do Azure versão 2.0.77 ou posterior. Verifique sua versão usando o az --version comando. Para instalar ou atualizar, consulte Instalar CLI do Azure.

Verificar a data de validade do certificado da AC (autoridade de certificação) do cluster

Verifique a data de validade do certificado CA do cluster usando o comando kubectl config view.

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

Verificar a data de validade do certificado do servidor de API

Verifique a data de validade do certificado do servidor de API usando o seguinte curl comando:

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

Verificar a data de validade do certificado do nó do agente do VMSS

Verifique a data de validade do certificado de nó do agente do conjunto de dimensionamento de máquinas virtuais usando o 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"

Verificar a data de expiração do certificado da 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"

Fazer a rotação manual dos certificados de AC do cluster

Quando você rotaciona o certificado da AC do cluster, os seguintes certificados derivados também são renovados:

  • Tokens de conta de serviço (SA)
  • Certificados de servidor de API
  • Certificados de cliente kubelet
  • Certificados do servidor Kubelet (se a rotação de certificado de serviço kubelet estiver habilitada no cluster)

Aviso

Fazer a rotação dos seus certificados ao usar az aks rotate-certs recria todos os seus nós, conjuntos de dimensionamento de máquinas virtuais e discos. Esse processo pode causar até 30 minutos de tempo de inatividade para o cluster do AKS. Se o comando falhar antes de ser concluído, use o comando az aks show para verificar se o status do cluster mostra Certificate Rotating. Se o cluster estiver em um estado de falha, execute az aks rotate-certs novamente para girar seus certificados outra vez.

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

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

    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 comando kubectl, como kubectl get nodes.

    kubectl get nodes
    

    Se você não atualizou os certificados usados pelo kubectl, você verá um erro semelhante como a seguinte saída de exemplo:

    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 certificado de cliente kubectl usando o comando az aks get-credentials com a opção --overwrite-existing.

    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 serviços que sejam executados com base no AKS, poderá ser necessário atualizar os certificados relacionados a eles.

Verificar se a rotação de certificado de serviço kubelet está habilitada

Cada nó com o recurso habilitado recebe automaticamente o rótulo kubernetes.azure.com/kubelet-serving-ca=cluster. Verifique se os rótulos estão definidos usando o kubectl get nodes -L kubernetes.azure.com/kubelet-serving-ca comando.

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

Verificar se o kubelet passa pelo processo de inicialização do TLS

Quando você habilita esse recurso, cada kubelet que executa seus nós passa pelo processo de inicialização do TLS de serviço.

Verifique se o processo de inicialização está ocorrendo usando o kubectl get comando para obter os objetos CSR atuais em seu cluster.

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

Todas as CSRs em uso estão no estado Approved,Issued, o que indica que a CSR foi aprovada e que um certificado assinado foi emitido. As CSRs de serviço têm o nome de signatário 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

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

Confirme se o kubelet do nó está usando um certificado de servidor assinado pela AC do cluster, usando 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 um kubelet-server-current.pem link simbólico, o kubelet faz o bootstrap e renova seu próprio certificado de servidor por meio do processo de bootstrap de TLS, e esse certificado é assinado pela CA do cluster.

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

  1. Desative a rotação do certificado de atendimento do kubelet atualizando o pool de nós usando 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. Refaça a imagem dos nós usando uma atualização de imagem de nó ou dimensionando o pool para instâncias zero e, em seguida, aumentando novamente até o valor desejado.

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