Os tokens de ServiceAccount autenticam a comunicação entre pods e o servidor de API do Kubernetes. A abordagem tradicional armazena tokens em Secrets e os monta como arquivos, deixando os pods expostos a ataques de impersonação, escalonamento de privilégios e tokens obsoletos sem expiração. A projeção de volume de token do ServiceAccount elimina esses riscos ao montar tokens de curta duração e vinculados a uma audiência específica diretamente como volumes projetados, sem depender de Secrets.
Contexto
Os tokens tradicionais de ServiceAccount apresentam quatro fraquezas estruturais de segurança:
Audiência não vinculada: Os JSON Web Tokens (JWTs) não possuem restrição de
audience, permitindo que um token comprometido seja reutilizado contra qualquer serviço no cluster para executar ataques de impersonação.Secrets com privilégios excessivos: Os tokens ficam armazenados em Secrets e são entregues como arquivos aos nós. Tokens de componentes do sistema frequentemente carregam permissões além do necessário para cargas de trabalho individuais, ampliando a superfície de ataque.
Ausência de expiração: Os JWTs permanecem válidos durante todo o ciclo de vida do ServiceAccount. A rotação exige a substituição manual da chave de assinatura, processo que o client-go não automatiza.
Proliferação de Secrets: A criação de um Secret por ServiceAccount prejudica a elasticidade do cluster em grande escala.
A projeção de volume de token do ServiceAccount resolve todos esses problemas. Os tokens limitam-se a uma audiência específica, expiram após um período configurável e o kubelet os rotaciona automaticamente, sem necessidade de Secrets.
Funcionamento
Ao iniciar um pod com volume projetado de token de ServiceAccount, o kubelet solicita um token assinado de curta duração ao servidor de API e o grava no caminho de montagem configurado dentro do contêiner. O kubelet monitora o token e solicita proativamente uma substituição antes da expiração. A aplicação deve recarregar o arquivo de token quando ele for rotacionado; para a maioria das cargas de trabalho, uma verificação a cada cinco minutos é suficiente.
Pré-requisitos
Antes de começar, verifique se você possui:
Um cluster gerenciado ACK, cluster dedicado ACK ou cluster ACK Serverless executando Kubernetes 1.20 ou posterior. Consulte Criar um cluster gerenciado ACK, Criar um cluster dedicado ACK (descontinuado) e Criar um cluster ACK Serverless.
-
A projeção de volume de token do ServiceAccount ativada no cluster. Esse recurso vem ativado por padrão em clusters com Kubernetes 1.22 ou posterior. Para atualizar, consulte Atualizar manualmente clusters ACK.

Quando ativado, o servidor de API e o controller-manager configuram automaticamente os seguintes parâmetros de inicialização:
Parâmetro
Descrição
Valor padrão
Configurável no console
service-account-issuerEmissor do token, mapeado para o campo
issno payload do JWThttps://kubernetes.default.svcSim
api-audiencesIdentificadores de API usados para validar tokens recebidos. Separe vários valores com vírgulas (
,).https://kubernetes.default.svcSim
service-account-signing-key-fileCaminho para a chave privada usada para assinar tokens
/etc/kubernetes/pki/sa.keyNão (fixo no padrão)
Etapa 1: Crie um ServiceAccount
Cada namespace inclui um ServiceAccount default. Execute kubectl get serviceaccounts para listar as contas existentes no namespace atual.
Para atribuir uma identidade distinta a um pod, crie um ServiceAccount dedicado:
kubectl apply -f - <<EOF
apiVersion: v1
kind: ServiceAccount
metadata:
name: build-robot
EOF
Verifique se o ServiceAccount foi criado:
kubectl get serviceaccounts/build-robot -o yaml
Etapa 2: Implante um pod com projeção de volume de token
O exemplo a seguir monta um token projetado de ServiceAccount em um pod nginx. O token limita-se à audiência vault e expira após duas horas (7200 segundos).
-
Crie um arquivo chamado
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 o manifesto:
kubectl apply -f nginx.yaml
Verifique a expiração do token
-
Confirme se o pod está em execução:
kubectl get pod nginxSaída esperada:
NAME READY STATUS RESTARTS AGE nginx 1/1 Running 0 3m15s -
Extraia o token do contêiner:
kubectl exec -t nginx -- cat /var/run/secrets/tokens/vault-token > vault-token -
Decodifique o token e exiba seu horário de expiração:
cat vault-token | awk -F '.' '{print $2}' | base64 -d 2>/dev/null | jq '.exp' | xargs -I {} date -d @{}Exemplo de saída:
Mon Aug 26 15:45:59 CST 2024
Observações de uso
Rotação de tokens: O kubelet rotaciona automaticamente o token antes que ele expire. Configure sua aplicação para recarregar o arquivo de token periodicamente — uma verificação a cada cinco minutos é suficiente, independentemente do TTL real.
Compatibilidade com SDK: O recarregamento automático de tokens em Go requer a versão 10.0.0 ou posterior do client-go.
Permissões de arquivo: Ao usar a projeção de volume de token vinculado, a permissão do arquivo de token do ServiceAccount muda de 644 para 600. Se fsGroup estiver definido no contexto de segurança do pod, a permissão será 640.
Próximos passos
Configure permissões RAM do ServiceAccount para controle de acesso a pods via RRSA: Use RAM Roles for Service Accounts (RRSA) para aplicar permissões RAM no nível do pod e restringir o acesso a recursos específicos da nuvem.
Alibaba Cloud KMS para criptografia de disco: Criptografe chaves secretas do Kubernetes em clusters ACK Pro usando o Key Management Service (KMS).
Configure service accounts para pods: Documentação oficial do Kubernetes sobre configuração de service accounts.