Como autenticar no Cloud Platform usando contas de serviço

Neste tutorial, demonstramos como criar uma conta de serviço do Google Cloud, atribuir papéis para autenticação nos serviços do Cloud Platform e usar as credenciais dessa conta em aplicativos em execução no GKE.

Neste exemplo, usaremos o Cloud Pub/Sub, mas as instruções são aplicáveis a qualquer serviço do Cloud Platform. No aplicativo de exemplo deste tutorial, uma conta de serviço é usada para fazer autenticação no Cloud Pub/Sub e assina as mensagens publicadas em um tópico do Pub/Sub de um aplicativo baseado em Python.

Objetivos

Este tutorial inclui as etapas a seguir:

  • Como criar uma conta de serviço.
  • Como atribuir os papéis necessários para a conta de serviço trabalhar com o Cloud Pub/Sub.
  • Como salvar a chave da conta como uma chave secreta do Kubernetes.
  • Como usar a conta de serviço para configurar e implantar um aplicativo.

No aplicativo de amostra usado neste tutorial, você assina um tópico do Pub/Sub e imprime as mensagens publicadas na saída padrão. Para configurar o aplicativo com as permissões corretas, use o gcloud para publicar as mensagens e inspecione o stream de saída do contêiner para observar se as mensagens são recebidas corretamente.

Por que usar as contas de serviço?

Cada nó em um cluster de contêiner é uma instância do Compute Engine. Isso significa que os aplicativos executados em um cluster de contêiner por padrão herdam os escopos das instâncias do Compute Engine em que são implantados.

O Google Cloud Platform cria automaticamente uma conta de serviço chamada "Conta de serviço padrão do Compute Engine" e o GKE a associa aos nós criados por ela. De acordo com a configuração do projeto, a conta padrão tem ou não permissões para usar outras APIs do Cloud Platform. O GKE também atribui alguns escopos de acesso limitados para calcular instâncias. A atualização das permissões da conta de serviço padrão ou a atribuição de mais escopos de acesso para calcular instâncias não é a maneira recomendada de autenticação em outros serviços do Cloud Platform a partir de pods em execução no GKE.

Recomendamos que você crie suas próprias contas de serviço para autenticar-se nos serviços do Google Cloud Platform a partir de aplicativos em execução no GKE. O ideal é criar uma nova conta de serviço para cada aplicativo que faz solicitações às APIs do Cloud Platform.

Os benefícios de ter contas de serviço separadas para aplicativos diferentes são:

  • melhor visibilidade e auditoria das solicitações de API feitas no aplicativo

  • capacidade de revogar chaves para aplicativos específicos, em vez de compartilhar uma conta de serviço e precisar revogar o acesso à API de todos os aplicativos

  • exposição reduzida, no caso de um possível incidente de segurança em que as credenciais da conta de serviço sejam comprometidas

Antes de começar

Siga estas etapas para ativar a API do Kubernetes Engine:
  1. Acesse a página do Kubernetes Engine no Console do Google Cloud Platform.
  2. Crie ou selecione um projeto.
  3. Aguarde a ativação da API e dos serviços relacionados. Isso pode demorar alguns minutos.
  4. Verifique se o faturamento foi ativado para o projeto.

    Saiba como ativar o faturamento

Instale as seguintes ferramentas de linha de comando usadas neste tutorial:

  • A gcloud é usada para criar e excluir clusters do Kubernetes Engine. A gcloud está incluída no SDK do Google Cloud.
  • A kubectl é utilizada para gerenciar o Kubernetes, o sistema de orquestração de clusters do Kubernetes Engine. É possível instalar a kubectl usando a gcloud:
    gcloud components install kubectl

Definir padrões da ferramenta de linha de comando gcloud

Para não perder tempo digitando o código do projeto e as opções de zona do Compute Engine na ferramenta de linha de comando gcloud, defina os padrões:
gcloud config set project [PROJECT_ID]
gcloud config set compute/zone us-central1-b

Ativar a API do Pub/Sub

Neste tutorial, você precisa ativar a Cloud Pub/Sub API no projeto, uma vez que ela é usada no aplicativo de amostra para receber as mensagens do tópico do Pub/Sub:

Ativar API

Criar um cluster de contêiner

Crie um cluster de contêiner chamado pubsub-test para implantar o aplicativo assinante do Pub/Sub:

gcloud container clusters create pubsub-test

Etapa 1: criar um tópico do Pub/Sub

No aplicativo de assinante do Pub/Sub que você implanta, uma inscrição chamada echo-read é usada em um tópico do Pub/Sub chamado echo. Crie estes recursos antes de implantar o aplicativo:

gcloud pubsub topics create echo
gcloud pubsub subscriptions create echo-read --topic=echo

Etapa 2: implantar o aplicativo assinante do Pub/Sub

A próxima etapa é implantar o contêiner do aplicativo que recebe as mensagens publicadas para o tópico do Pub/Sub. Esse aplicativo foi escrito em Python com as bibliotecas de cliente do Google Cloud Pub/Sub. Veja o código-fonte no GitHub.

No arquivo de manifesto a seguir, você encontra a descrição de uma implantação que executa uma única instância da imagem do Docker desse aplicativo:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: pubsub
spec:
  selector:
    matchLabels:
      app: pubsub
  template:
    metadata:
      labels:
        app: pubsub
    spec:
      containers:
      - name: subscriber
        image: gcr.io/google-samples/pubsub-sample:v1

Para implantar esse manifesto, faça o download para sua máquina como pubsub.yaml e execute:

kubectl apply -f pubsub.yaml

Depois que o aplicativo for implantado, consulte os pods executando:

kubectl get pods -l app=pubsub
Saída:
NAME                      READY     STATUS             RESTARTS   AGE
pubsub-2009462906-1l6bh   0/1       CrashLoopBackOff   1          30s

Observe que uma falha de inicialização ocorre no contêiner e ele fica no estado CrashLoopBackOff. Para inspecionar os registros do pod, execute:

kubectl logs -l app=pubsub
Saída:
...
google.gax.errors.RetryError: GaxError(Exception occurred in retry method
that was not classified as transient, caused by <_Rendezvous of RPC that
terminated with (StatusCode.PERMISSION_DENIED, Request had insufficient
authentication scopes.) l10n-attrs-original-order="of,RPC,that,terminated,with,Request,had,insufficient,authentication">)

O rastreamento de pilha e a mensagem de erro indicam que o aplicativo não tem permissão para consultar o serviço do Cloud Pub/Sub.

Etapa 3: criar credenciais de conta de serviço

Para fornecer acesso aos serviços do Google Cloud Platform para aplicativos em execução no GKE, é preciso usar contas de serviço.

Para criar uma, acesse Contas de serviço no Console do GCP e clique em Criar conta de serviço:

  1. Especifique um Nome da conta de serviço. Por exemplo, pubsub-app.
  2. Na lista suspensa Papel, selecione "Pub/Sub → Assinante".
  3. Clique em Criar chave e escolha o tipo de chave como JSON.
  4. Clique em Criar.

Depois que a conta de serviço é criada, o download de um arquivo de chave JSON com as credenciais da conta é feito no seu computador. Esse arquivo é usado para configurar a autenticação do aplicativo na API Cloud Pub/Sub.

Etapa 4: importar credenciais como secret

O tipo de recurso de chave secreta é oferecido no Kubernetes para armazenar credenciais no cluster de contêiner e usá-las diretamente nos aplicativos implantados no GKE.

Para salvar uma chave secreta chamada pubsub-key no arquivo de chave JSON, execute o comando a seguir com o caminho do arquivo de credenciais da conta de serviço salvo:

kubectl create secret generic pubsub-key --from-file=key.json=PATH-TO-KEY-FILE.json

Com esse comando, você cria uma chave secreta chamada pubsub-key que tem um arquivo key.json com o conteúdo da chave privada transferida por download no Console do GCP. Após criar a chave secreta, remova o arquivo do seu computador.

Etapa 5: configurar o aplicativo com a chave secreta

Para usar a chave secreta pubsub-key no seu aplicativo, modifique a especificação de implantação:

  1. Defina um volume com a chave secreta.
  2. Ative o volume da chave secreta para o contêiner de aplicativo.
  3. Defina a variável de ambiente GOOGLE_APPLICATION_CREDENTIALS de modo que ela aponte para o arquivo da chave no volume montado da chave secreta.

O arquivo de manifesto atualizado ficará parecido com este:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: pubsub
spec:
  selector:
    matchLabels:
      app: pubsub
  template:
    metadata:
      labels:
        app: pubsub
    spec:
      volumes:
      - name: google-cloud-key
        secret:
          secretName: pubsub-key
      containers:
      - name: subscriber
        image: gcr.io/google-samples/pubsub-sample:v1
        volumeMounts:
        - name: google-cloud-key
          mountPath: /var/secrets/google
        env:
        - name: GOOGLE_APPLICATION_CREDENTIALS
          value: /var/secrets/google/key.json

Neste arquivo de manifesto, os seguintes itens estão definidos para que as credenciais fiquem disponíveis para o aplicativo:

  • Um volume com nome google-cloud-key que usa a chave secreta chamada pubsub-key

  • Um volume montado que disponibiliza a google-cloud-key no diretório /var/secrets/google do contêiner

  • A variável de ambiente GOOGLE_APPLICATION_CREDENTIALS definida como /var/secrets/google/key.json que contém o arquivo de credenciais quando a chave secreta é montada para o contêiner como um volume

A variável de ambiente GOOGLE_APPLICATION_CREDENTIALS é reconhecida automaticamente pelas bibliotecas de cliente do Google Cloud. Nesse caso, o cliente do Cloud Pub/Sub para Python.

Para implantar esse manifesto, faça o download para sua máquina como pubsub-with-secret.yaml e execute:

kubectl apply -f pubsub-with-secret.yaml

Depois de implantado corretamente, o status do pod passa a ser Running:

kubectl get pods -l app=pubsub
Saída:
NAME                     READY     STATUS    RESTARTS   AGE
pubsub-652482369-2d6h2   1/1       Running   0          29m

Etapa 6: testar o recebimento das mensagens do Pub/Sub

Agora que você configurou o aplicativo, publique uma mensagem para o tópico do Pub/Sub chamado echo:

gcloud pubsub topics publish echo --message="Hello, world!"

Em alguns segundos, uma mensagem é recebida pelo aplicativo e impressa no stream de saída. Para inspecionar os registros do pod implantado, execute:

kubectl logs -l app=pubsub
Saída:
Pulling messages from Pub/Sub subscription...
[2017-06-19 12:31:42.501123] ID=130941112144812 Data=Hello, world!

Você configurou com sucesso a autenticação de um aplicativo no GKE na API do Pub/Sub usando credenciais de conta de serviço.

Como fazer a limpeza

Para evitar que os recursos usados neste tutorial sejam cobrados na conta do Google Cloud Platform:

  1. Remova a inscrição e o tópico do Pub/Sub:

    gcloud pubsub subscriptions delete echo-read
    gcloud pubsub topics delete echo
  2. Exclua o cluster de contêiner:

    gcloud container clusters delete pubsub-test

Próximas etapas

Esta página foi útil? Conte sua opinião sobre:

Enviar comentários sobre…

Tutoriais do Kubernetes Engine