Os tokens de ServiceAccount autenticam a comunicação entre pods e o servidor da API Kubernetes. A abordagem tradicional armazena tokens em Secrets e os monta como arquivos, o que deixa os pods expostos a ataques de personificação, escalonamento de privilégios e tokens obsoletos sem data de expiração. A projeção de volume de token do ServiceAccount elimina esses riscos ao montar tokens de curta duração e vinculados a um público-alvo específico diretamente como volumes projetados, sem depender de Secrets.
Contexto
Os tokens tradicionais de ServiceAccount apresentam quatro fraquezas estruturais de segurança:
Público-alvo não vinculado: Os JSON Web Tokens (JWTs) não possuem restrição de
audience. Assim, um token comprometido pode ser reutilizado contra qualquer service no cluster, permitindo ataques de personificaçã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 das necessárias para workloads 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. Para rotacioná-los, é preciso substituir manualmente a chave de assinatura, um 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.
O recurso de projeção de volume de token do ServiceAccount resolve todos esses quatro problemas. Os tokens têm escopo limitado a um público-alvo específico, expiram após um período configurável e são rotacionados automaticamente pelo kubelet, sem necessidade de Secrets.
Funcionamento
Quando um pod com volume projetado de token do ServiceAccount inicia, o kubelet solicita um token assinado de curta duração ao servidor da 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 dos workloads, uma verificação a cada cinco minutos é suficiente.
Pré-requisitos
Antes de começar, certifique-se de que você tem:
Um cluster ACK gerenciado, cluster ACK dedicado ou cluster ACK Serverless executando Kubernetes 1.20 ou posterior. Consulte Criar um cluster ACK gerenciado, Criar um cluster ACK dedicado (descontinuado) e Criar um cluster ACK Serverless.
-
A projeção de volume de token do ServiceAccount ativada no cluster. Esse recurso vem habilitado por padrão em clusters com Kubernetes 1.22 ou posterior. Para fazer upgrade, consulte Fazer upgrade manual de clusters ACK.
Quando ativado, o servidor da 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 da API usados para validar tokens recebidos. Separe múltiplos valores com vírgulas (
,).https://kubernetes.default.svcSim
service-account-signing-key-fileCaminho para a chave privada usada na assinatura dos 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 abaixo monta um token projetado de ServiceAccount em um pod nginx. O token tem escopo restrito ao público-alvo 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 da expiração. 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 de pods via RRSA: Utilize 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 cloud.
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.