Todos os produtos
Search
Central de documentação

Container Service for Kubernetes:Use ServiceAccount token volume projection

Última atualização: Jun 27, 2026

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.

    1.png

    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-issuer

    Emissor do token, mapeado para o campo iss no payload do JWT

    https://kubernetes.default.svc

    Sim

    api-audiences

    Identificadores de API usados para validar tokens recebidos. Separe vários valores com vírgulas (,).

    https://kubernetes.default.svc

    Sim

    service-account-signing-key-file

    Caminho para a chave privada usada para assinar tokens

    /etc/kubernetes/pki/sa.key

    Nã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).

  1. 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
  2. Aplique o manifesto:

    kubectl apply -f nginx.yaml

Verifique a expiração do token

  1. Confirme se o pod está em execução:

    kubectl get pod nginx

    Saída esperada:

    NAME    READY   STATUS    RESTARTS   AGE
    nginx   1/1     Running   0          3m15s
  2. Extraia o token do contêiner:

    kubectl exec -t nginx -- cat /var/run/secrets/tokens/vault-token > vault-token
  3. 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