Identidade do serviço

Sobre a conta de serviço padrão

Por padrão, as revisões do Cloud Run são executadas como a conta de serviço padrão do Compute Engine. A conta de serviço padrão do Compute Engine tem o papel do IAM Editor do projeto que concede permissões de leitura e gravação em todos os recursos do projeto do Google Cloud.

Embora isso possa ser conveniente, em vez de usar a conta de serviço padrão, o Google recomenda criar sua própria conta de serviço gerenciada pelo usuário com as permissões mais granulares e atribuí-la como identidade do serviço do Cloud Run. Neste documento, descrevemos como configurar identidades por serviço com o Cloud Run.

Como usar a identidade por serviço

O Google recomenda dar a cada serviço do Cloud Run uma identidade dedicada, atribuindo a ele uma conta de serviço gerenciada pelo usuário em vez de usar a conta de serviço padrão. As contas de serviço gerenciadas pelo usuário permitem que você controle o acesso concedendo um conjunto mínimo de permissões usando o Identity and Access Management.

A ferramenta de linha de comando gcloud e as bibliotecas de cliente do Google Cloud detectam automaticamente quando estão em execução no Google Cloud e usam o ambiente de execução conta de serviço da revisão atual do Cloud Run. Isso significa que, se o código usar a ferramenta gcloud ou uma biblioteca de cliente oficial do Google Cloud, ele detectará e autenticará automaticamente como a conta de serviço do ambiente de execução do serviço do Cloud Run. Essa estratégia é chamada de Application Default Credentials e permite a portabilidade de código em vários ambientes.

Permissões necessárias em contas de serviço gerenciadas pelo usuário

Para implantar um serviço do Cloud Run usando uma conta de serviço gerenciada pelo usuário, você precisa ter permissão para personificar (iam.serviceAccounts.actAs) essa conta de serviço. Essa permissão pode ser concedida por meio do papel roles/iam.serviceAccountUser do IAM. Todos os principais (por exemplo, usuários, contas de serviço) precisam ter essa permissão na conta de serviço gerenciada pelo usuário para implantar um serviço do Cloud Run como a conta de serviço gerenciada pelo usuário.

Conceda essa permissão usando o Console do Cloud, por meio da API (YAML) ou usando a ferramenta gcloud da seguinte maneira:

gcloud iam service-accounts add-iam-policy-binding "SERVICE_ACCOUNT_EMAIL" \
    --member "user@example.com" \
    --role "roles/iam.serviceAccountUser"

Para saber como conceder permissões, consulte Como conceder, alterar e revogar acesso a recursos.

Como implantar um novo serviço com uma conta de serviço gerenciada pelo usuário

Se você ainda não tiver uma conta de serviço gerenciada pelo usuário, primeiro crie uma conta de serviço.

É possível definir a conta de serviço do Cloud Run usando o Console do Cloud, a ferramenta gcloud ou a API (YAML) ao criar um novo serviço ou implantar uma nova revisão:

Console

  1. Acessar o Cloud Run

  2. Clique em Criar serviço se estiver configurando um novo serviço em que fará uma implantação. Se você estiver configurando um serviço atual, clique nele e em Editar e implantar nova revisão.

  3. Se você estiver configurando um novo serviço, preencha a página inicial de configurações de serviço conforme desejado e clique em Avançar > Configurações avançadas para acessar a página de configuração de serviço.

  4. Clique na guia Segurança.

    imagem

  5. Clique no menu suspenso Conta de serviço e selecione a conta de serviço desejada.

  6. Clique em Criar ou Implantar.

gcloud

É possível atualizar um serviço existente para ter uma nova conta de serviço de ambiente de execução usando o seguinte comando:

gcloud run services update SERVICE --service-account SERVICE_ACCOUNT

Substitua:

  • SERVICE pelo nome do serviço;
  • SERVICE_ACCOUNT pela conta de serviço associada à nova identidade: esse valor é o endereço de e-mail da conta de serviço, por exemplo, example@myproject.iam.gserviceaccount.com.

Também é possível definir uma conta de serviço durante a implantação usando o comando:

gcloud run deploy --image IMAGE_URL --service-account SERVICE_ACCOUNT

Substitua:

  • IMAGE_URL por uma referência à imagem de contêiner. Por exemplo, us-docker.pkg.dev/cloudrun/container/hello:latest;
  • SERVICE_ACCOUNT pela conta de serviço associada à nova identidade: esse valor é o endereço de e-mail da conta de serviço, por exemplo, example@myservice.iam.gserviceaccount.com.

YAML

É possível fazer o download e ver a configuração do serviço atual usando o comando gcloud run services describe --format export, que produz resultados limpos no formato YAML. Em seguida, modifique os campos descritos abaixo e faça upload do YAML modificado usando o comando gcloud run services replace. Modifique os campos somente conforme documentado.

  1. Para visualizar e fazer o download da configuração:

    gcloud run services describe SERVICE --format export > service.yaml
  2. Atualize o atributo serviceAccountName::

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE
    spec:
      template:
        spec:
          serviceAccountName: SERVICE_ACCOUNT

    Substitua:

    • SERVICE pelo nome do serviço do Cloud Run;
    • SERVICE_ACCOUNT pela conta de serviço associada à nova identidade: esse valor é o endereço de e-mail da conta de serviço, por exemplo, example@myproject.iam.gserviceaccount.com.
  3. Substitua o serviço pela nova configuração usando o seguinte comando:

    gcloud run services replace service.yaml

Como usar contas de serviço em outros projetos

Também é possível usar uma conta de serviço gerenciada pelo usuário que reside em um projeto do Google Cloud diferente do serviço do Cloud Run. Se a conta de serviço e o serviço do Cloud Run estiverem em projetos diferentes:

  • O projeto que contém essa conta de serviço requer que a política organizacional iam.disableCrossProjectServiceAccountUsage seja definida como falsa/não executada no nível da pasta ou herdada das configurações para envolvidos no projeto. Por padrão, essa opção é definida como true.

  • A conta de serviço requer uma assinatura de papel de roles/iam.serviceAccountTokenCreator para o agente de serviço do projeto sendo implantado:

    service-PROJECT_NUMBER@serverless-robot-prod.iam.gserviceaccount.com
    

    em que PROJECT_NUMBER é o número do projeto.

  • A conta de serviço requer uma associação de papel de roles/iam.serviceAccountUser para a identidade (usuário ou automação) que está executando a operação de implantação.

É possível aplicar associações de papéis diretamente ao recurso da conta de serviço ou herdar de níveis mais altos na hierarquia de recursos.

Como buscar identidades e tokens de acesso

Não é necessário buscar tokens de acesso ou de identidade se o código do serviço do Cloud Run usar uma biblioteca de cliente do Google Cloud. Essas bibliotecas de cliente detectarão e autenticarão automaticamente usando a conta de serviço do ambiente de execução do serviço do Cloud Run.

Seu código personalizado em execução em um serviço do Cloud Run pode usar o servidor de metadados para buscar tokens de identidade e de acesso. Não é possível consultar esse servidor de metadados diretamente de sua máquina local, porque o servidor de metadados só está disponível para cargas de trabalho em execução no Google Cloud.

Tokens de acesso

Você usa tokens de acesso do OAuth 2.0 ao chamar a maioria das APIs do Google. Para gerar um token de acesso:

curl "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token" \
    --header "Metadata-Flavor: Google"

Por padrão, os tokens de acesso têm o escopo cloud-platform, que permite o acesso a todas as APIs do Google Cloud Platform, supondo que o IAM também permita o acesso. Para acessar outras APIs do Google ou do Google Cloud, será preciso buscar um token de acesso com o escopo apropriado. Para especificar escopos diferentes:

curl "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token?scopes=SCOPES" \
    --header "Metadata-Flavor: Google"

Onde SCOPES é uma lista separada por vírgulas de escopos OAuth solicitados, por exemplo:

https://www.googleapis.com/auth/drive,https://www.googleapis.com/auth/spreadsheets

Consulte a lista completa de escopos do Google OAuth para descobrir quais escopos você precisa. Saiba mais sobre como buscar tokens de acesso.

Tokens de identidade

Use tokens de identidade ao chamar outros serviços do Cloud Run ou ao invocar qualquer serviço que possa validar um token de identidade.

Use o Compute Metadata Server para buscar um token de identidade com um público específico:

curl "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/identity?audience=AUDIENCE" \
    --header "Metadata-Flavor: Google"

Em que AUDIENCE é o público-alvo JWT solicitado.

Para serviços do Cloud Run, o público-alvo precisa ser o URL do serviço que você está chamando:

https://service.domain.com

Para outros recursos, é provável que ele seja um ID do cliente OAuth de um recurso protegido pelo IAP:

1234567890.apps.googleusercontent.com

Como receber recomendações para criar contas de serviço dedicadas

O serviço do recomendador fornece recomendações automaticamente para criar contas de serviço dedicadas com o conjunto mínimo de permissões necessárias.

Próximas etapas

Aprenda a gerenciar o acesso ou a autenticar desenvolvedores, serviços e usuários finais aos seus serviços de maneira segura.

Para ver instruções completas de um aplicativo que usa a identidade de serviço para minimizar os riscos de segurança, siga o tutorial sobre como proteger os serviços do Cloud Run.