Conta de Serviço no Kubernetes: Autenticação e Configuração de Acesso

  1. Autenticação: Verificar se o cliente tem permisssão de acesso. Métodos incluem tokens compartilhados e certificados SSL mútuos.
  2. Autorização: Confirmar se o usuário tem permissões específicas, usando ABAC, RBAC, NODE ou Webhooks.
  3. Controle de Admissão: Validar permissões para recursos associados à operação.

O Kubernetes avalia atributos específicos da requisição:

  • Identidade do usuário (nome, UID) e grupos.
  • Caminho da API, como /apis/apps/v1/namespaces/{nome-ns}/pods.
  • Verbo HTTP mapeado para ações (ex.: GET → list, POST → create).
  • Recurso, sub-recurso e namespace alvo.

Contas de serviço facilitam a interação de processos dentro de pods com a API do Kubernetes ou serviços externos. Diferem das contas de usuário:

  • Contas de usuário são para humanos; contas de serviço são para processos em pods.
  • Contas de serviço são limitadas ao namespace, enquanto contas de usuário são globais.
  • Cada namespace tem uma conta de serviço padrão criada automatticamente.
  • Um controlador de tokens gera secrets para contas de serviço.
  • Ao habilitar o controlador de admissão de ServiceAccount:
  • Pods são configurados com a conta de serviço padrão se não especificada.
  • Secrets de imagem são herdadas da conta de serviço.
  • Um token e certificado CA são montados em /var/run/secrets/kubernetes.io/serviceaccount/.

Criar um namespace e verificar a conta de serviço padrão:

kubectl create ns demo-ns
kubectl get sa -n demo-ns
kubectl get secrets -n demo-ns

Saída esperada:

NAME      SECRETS   AGE
default   1         10s

Arquivo pod-exemplo.yaml:

apiVersion: v1
kind: Pod
metadata:
  name: pod-web
  namespace: demo-ns
spec:
  containers:
  - name: web-container
    image: nginx:latest
    ports:
    - containerPort: 80
  serviceAccountName: default

Aplicar e inspecionar:

kubectl apply -f pod-exemplo.yaml
kubectl describe pod pod-web -n demo-ns

Note que o token da conta de serviço é montado automaticamente.

Criar uma nova conta de serviço:

kubectl create serviceaccount gerente
kubectl describe sa gerente

Associar a um pod:

apiVersion: v1
kind: Pod
metadata:
  name: pod-gerente
spec:
  containers:
  - name: app
    image: python:3.9
  serviceAccountName: gerente

O kubeconfig armazena informações de cluster, usuário e contexto. Exemplo de visualização:

kubectl config view

Para criar um usuário personalizado:

  1. Gerar certificados com a CA do cluster:
openssl genrsa -out usuario.key 2048
openssl req -new -key usuario.key -out usuario.csr -subj "/CN=usuario"
openssl x509 -req -in usuario.csr -CA ca.crt -CAkey ca.key -out usuario.crt -days 365
  1. Adicionar usuário ao kubeconfig:
kubectl config set-credentials usuario --client-certificate=usuario.crt --client-key=usuario.key
  1. Criar um contexto:
kubectl config set-context usuario@meu-cluster --cluster=meu-cluster --user=usuario
  1. Alternar contexto:
kubectl config use-context usuario@meu-cluster

Testar o acesso:

kubectl get pods  # Deve retornar erro de permissão se não houver RBAC

Principais subcomendos:

  • kubectl config current-context: Exibe o contexto atual.
  • kubectl config set-cluster: Define um novo cluster.
  • kubectl config set-context: Configura um contexto.

Exemplo de configuração de cluster em arquivo separado:

kubectl config set-cluster cluster-dev --server=https://192.168.1.10:6443 --certificate-authority=ca.pem --kubeconfig=dev.conf

Tags: kubernetes Service Account rbac kubeconfig autenticacao

Publicado em 6-2 16:15 por Thomas