Los tokens de ServiceAccount autentican la comunicación entre los pods y el servidor de la API de Kubernetes. El enfoque tradicional almacena estos tokens en Secrets y los monta como archivos, lo que expone a los pods a ataques de suplantación de identidad, escalada de privilegios y tokens obsoletos que nunca caducan. La proyección de volúmenes de tokens de ServiceAccount elimina estos riesgos porque monta tokens de corta duración y vinculados a una audiencia específica directamente como volúmenes proyectados, sin depender de Secrets.
Contexto
Los tokens tradicionales de ServiceAccount presentan cuatro debilidades estructurales de seguridad:
Audiencia no vinculada: los JSON Web Tokens (JWT) no incluyen ninguna restricción de
audience. Por ello, un token comprometido se puede reutilizar contra cualquier servicio del clúster, lo que facilita los ataques de suplantación de identidad.Secrets con permisos excesivos: los tokens se almacenan en Secrets y se entregan como archivos a los nodos. Los tokens de los componentes del sistema suelen tener más permisos de los que necesitan las cargas de trabajo individuales, lo que amplía la superficie de ataque.
Sin caducidad: los JWT siguen siendo válidos durante toda la vida útil del ServiceAccount. Rotarlos exige reemplazar manualmente la clave de firma, un proceso que client-go no automatiza.
Proliferación de Secrets: crear un Secret por cada ServiceAccount degrada la elasticidad del clúster a gran escala.
La proyección de volúmenes de tokens de ServiceAccount resuelve estos cuatro problemas. Los tokens se limitan a una audiencia específica, caducan tras un periodo configurable y el kubelet los rota automáticamente, sin necesidad de usar Secrets.
Cómo funciona
Cuando se inicia un pod con un volumen proyectado de token de ServiceAccount, el kubelet solicita un token firmado de corta duración al servidor de la API y lo escribe en la ruta de montaje configurada dentro del contenedor. El kubelet supervisa el token y solicita uno nuevo de forma proactiva antes de que caduque. La aplicación debe recargar el archivo del token cuando este rota; para la mayoría de las cargas de trabajo basta con consultarlo cada cinco minutos.
Requisitos previos
Antes de empezar, asegúrese de contar con lo siguiente:
Un clúster administrado de ACK, un clúster dedicado de ACK o un clúster serverless de ACK que ejecute Kubernetes 1.20 o posterior. Consulte Create an ACK managed cluster, Create an ACK dedicated cluster (discontinued) y Create an ACK Serverless cluster.
-
La proyección de volúmenes de tokens de ServiceAccount habilitada en el clúster. Esta función está activada de forma predeterminada en los clústeres con Kubernetes 1.22 o posterior. Para actualizar, consulte Manually upgrade ACK clusters.
Al habilitarla, el servidor de la API y controller-manager configuran automáticamente los siguientes parámetros de inicio:
Parámetro
Descripción
Valor predeterminado
Configurable desde la consola
service-account-issuerEmisor del token, asignado al campo
issen la carga útil del JWThttps://kubernetes.default.svcSí
api-audiencesIdentificadores de la API que se usan para validar los tokens entrantes. Separe varios valores con comas (
,).https://kubernetes.default.svcSí
service-account-signing-key-fileRuta a la clave privada que se usa para firmar los tokens
/etc/kubernetes/pki/sa.keyNo (fijo en el valor predeterminado)
Paso 1: Crear un ServiceAccount
Cada namespace incluye un ServiceAccount default. Ejecute kubectl get serviceaccounts para listar las cuentas existentes en el namespace actual.
Para asignar una identidad distinta a un pod, cree un ServiceAccount específico:
kubectl apply -f - <<EOF
apiVersion: v1
kind: ServiceAccount
metadata:
name: build-robot
EOF
Compruebe que el ServiceAccount se haya creado:
kubectl get serviceaccounts/build-robot -o yaml
Paso 2: Desplegar un pod con proyección de volumen de token
En el siguiente ejemplo se monta un token de ServiceAccount proyectado en un pod de nginx. El token se limita a la audiencia vault y caduca después de dos horas (7200 segundos).
-
Cree un archivo llamado
nginx.yaml:apiVersion: v1 kind: Pod metadata: name: nginx spec: containers: - image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 name: nginx volumeMounts: - mountPath: /var/run/secrets/tokens name: vault-token serviceAccountName: build-robot volumes: - name: vault-token projected: sources: - serviceAccountToken: path: vault-token expirationSeconds: 7200 audience: vault -
Aplique el manifiesto:
kubectl apply -f nginx.yaml
Comprobar la caducidad del token
-
Confirme que el pod esté ejecutándose:
kubectl get pod nginxResultado esperado:
NAME READY STATUS RESTARTS AGE nginx 1/1 Running 0 3m15s -
Extraiga el token del contenedor:
kubectl exec -t nginx -- cat /var/run/secrets/tokens/vault-token > vault-token -
Decodifique el token y muestre su hora de caducidad:
cat vault-token | awk -F '.' '{print $2}' | base64 -d 2>/dev/null | jq '.exp' | xargs -I {} date -d @{}Ejemplo de resultado:
Mon Aug 26 15:45:59 CST 2024
Notas de uso
Rotación de tokens: el kubelet rota el token automáticamente antes de que caduque. Configure su aplicación para que recargue el archivo del token de forma programada; consultarlo cada cinco minutos es suficiente, independientemente del TTL real.
Compatibilidad con SDK: la recarga automática de tokens en Go requiere la versión 10.0.0 o posterior de client-go.
Permisos de archivo: el permiso del archivo del token de ServiceAccount cambia de 644 a 600 cuando se usa la proyección de volumen de token vinculado. Si se establece fsGroup en el contexto de seguridad del pod, el permiso será 640.
Pasos siguientes
Configure ServiceAccount RAM permissions for pod access control through RRSA: use RAM Roles for Service Accounts (RRSA) para aplicar permisos de RAM a nivel de pod y restringir el acceso a recursos específicos de la nube.
Alibaba Cloud KMS for disk encryption: cifre las claves de los secrets de Kubernetes en clústeres ACK Pro mediante Key Management Service (KMS).
Configure service accounts for pods: documentación oficial de Kubernetes sobre la configuración de cuentas de servicio.