Administración y rotación de certificados en Azure Kubernetes Service (AKS)

En este artículo se explica cómo administrar y rotar certificados en clústeres de Azure Kubernetes Service (AKS) para mantener una comunicación segura entre los componentes y garantizar el cumplimiento.

Prerequisites

  • CLI de Azure versión 2.0.77 o posterior. Compruebe la versión mediante el az --version comando . Para la instalación o la actualización, consulte Instalación de la CLI de Azure.

Comprobación de la fecha de expiración del certificado de la entidad de certificación (CA) del clúster

Compruebe la fecha de expiración del certificado de entidad de certificación del clúster mediante el kubectl config view comando .

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

Comprobar la fecha de expiración del certificado del servidor API

Compruebe la fecha de expiración del certificado del servidor de API mediante el comando siguiente curl :

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

Comprobación de la fecha de expiración del certificado del nodo del agente de VMSS

Compruebe la fecha de expiración del certificado del nodo del agente del conjunto de escalado de máquinas virtuales usando el 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"

Comprobación de la fecha de expiración del certificado de máquina virtual independiente

Compruebe la fecha de expiración de una máquina virtual independiente mediante el 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"

Rotar manualmente los certificados de la CA del clúster

Al rotar el certificado de entidad de certificación del clúster, también se actualizan los siguientes certificados secundarios:

  • Tokens de cuenta de servicio (SA)
  • Certificados de servidor de API
  • Certificados de cliente de Kubelet
  • Certificados de servidor kubelet (si la rotación de certificados de servicio de kubelet está habilitada en el clúster)

Warning

Al rotar los certificados con az aks rotate-certs, se vuelven a crear todos los nodos, conjuntos de escalado de máquinas virtuales y discos. Este proceso puede provocar hasta 30 minutos de tiempo de inactividad para el clúster de AKS. Si el comando falla antes de completarse, use el comando az aks show para verificar que el estado del clúster muestre Rotación de certificados. Si el clúster se encuentra en un estado de error, vuelva a ejecutar az aks rotate-certs para rotar los certificados otra vez.

  1. Conéctese a su clúster usando el comando az aks get-credentials.

    az aks get-credentials --resource-group <resource-group> --name <cluster-name>
    
  2. Rote todos los certificados, CA y SA de su clúster usando el comando az aks rotate-certs.

    az aks rotate-certs --resource-group <resource-group> --name <cluster-name>
    
  3. Compruebe que los certificados antiguos ya no son válidos usando cualquier comando kubectl, como kubectl get nodes.

    kubectl get nodes
    

    Si no actualizó los certificados usados por kubectl, verá un error similar al siguiente resultado de ejemplo:

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

Actualización de kubectl certificados de cliente

  1. Actualice el certificado de cliente kubectl mediante el comando az aks get-credentials con el indicador --overwrite-existing.

    az aks get-credentials --resource-group <resource-group> --name <cluster-name> --overwrite-existing
    
  2. Compruebe que los certificados se actualizan mediante el kubectl get comando .

    kubectl get nodes
    

    Note

    Si tiene algún servicio que se ejecute sobre AKS, es posible que también tenga que actualizar los certificados.

Comprobación de que la rotación de certificados de servicio de kubelet está habilitada

A cada nodo con la característica habilitada se le asigna automáticamente la etiqueta kubernetes.azure.com/kubelet-serving-ca=cluster. Compruebe que las etiquetas se establecen mediante el kubectl get nodes -L kubernetes.azure.com/kubelet-serving-ca comando .

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

Comprobación de que kubelet pasa por el proceso de arranque de TLS

Al habilitar esta característica, cada kubelet que ejecuta los nodos pasa por el proceso de arranque de TLS de servicio.

Compruebe que el proceso de arranque se está llevando a cabo mediante el kubectl get comando para obtener los objetos CSR actuales dentro del clúster.

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

Todas las CSR en servicio están en estado Approved,Issued, lo que indica que la solicitud de firma de certificado fue aprobada y que se emitió un certificado firmado. Los CSR activos tienen un nombre de firmante de kubernetes.io/kubelet-serving. Por ejemplo:

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

Comprobación de que kubelet usa un certificado obtenido del arranque TLS del servidor

Confirme si el kubelet del nodo usa un certificado de servicio firmado por la ENTIDAD de certificación del clúster mediante el comando [kubectl debug][kubectl-debug] para examinar el contenido del directorio PKI de 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

Si existe un enlace simbólico kubelet-server-current.pem, el kubelet inicia y rota su propio certificado de servidor mediante el proceso de arranque de TLS, y está firmado por la autoridad de certificación del clúster.

Deshabilitación de la rotación de certificados de servicio de kubelet

  1. Deshabilite la rotación del certificado de servicio de kubelet actualizando el grupo de nodos mediante el comando az aks nodepool update y especifique la etiqueta 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. Restablezca la imagen inicial de sus nodos utilizando una actualización de imagen de nodo o escalando el grupo a cero instancias y luego nuevamente al valor deseado.

Para más información sobre la seguridad de AKS, consulte los siguientes artículos: