Identidade do serviço

Mantenha tudo organizado com as coleções Salve e categorize o conteúdo com base nas suas preferências.
Cada revisão do Cloud Run está vinculada a uma conta de serviço. Essa conta de serviço é usada automaticamente pelas bibliotecas de cliente do Google Cloud para fazer a autenticação com as APIs do Google Cloud. Alguns exemplos de APIs do Google Cloud com os quais o código do seu serviço pode interagir: Cloud Storage, Firestore, Cloud SQL, Pub/Sub ou Cloud Tasks.

Se você não especificar uma conta de serviço, o Cloud Run vinculará uma revisão à conta de serviço padrão que tem permissões amplas em todas as APIs do Google Cloud. O Google recomenda o uso de identidade por serviço e a concessão de permissões seletivas.

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 CLI do Google Cloud 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 CLI 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.

Há dois aspectos na atribuição da identidade por serviço:

Permissões necessárias para atribuir 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 Google Cloud, por meio da API (YAML) ou usando a CLI 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 Google Cloud, a CLI 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 Contêiner, conexões, segurança para expandir a página de configuração do 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

Terraform

Para criar uma conta de serviço, adicione o seguinte recurso ao seu arquivo main.tf atual:

resource "google_service_account" "cloudrun_service_identity" {
  account_id   = "my-service-account"
}

Crie ou atualize um serviço do Cloud Run e inclua sua conta de serviço:

resource "google_cloud_run_service" "default" {
  name     = "cloud-run-srv"
  location = "us-central1"

  template {
    spec {
      containers {
        image = "gcr.io/cloudrun/hello"
      }
      service_account_name = google_service_account.cloudrun_service_identity.email
    }
  }

  traffic {
    percent         = 100
    latest_revision = true
  }
}

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.

Permissões exigidas por contas de serviço gerenciadas pelo usuário para operar o Cloud Run

Se um serviço do Cloud Run não acessar outras partes do Google Cloud, a conta de serviço não precisará receber nenhum papel ou permissão.

Quando você cria uma nova conta de serviço no Console do Google Cloud, a etapa opcional "Conceder a essa conta de serviço acesso ao projeto" é para qualquer acesso adicional necessário. Por exemplo, um serviço do Cloud Run pode invocar outro serviço particular do Cloud Run ou pode acessar um banco de dados do Cloud SQL, ambos que exigem papéis específicos do IAM. Consulte a documentação sobre como gerenciar o acesso para mais informações.

Como buscar tokens de identidade e acesso usando o servidor de metadados

Se o código do serviço do Cloud Run usar uma biblioteca de cliente do Google Cloud, a biblioteca adquirirá automaticamente os tokens apropriados para autenticar as solicitações do código usando a conta de serviço do ambiente de execução do serviço.

Se você estiver usando seu próprio código personalizado, use o servidor de metadados para buscar tokens de identidade e acessá-los manualmente. Observação: não é possível consultar esse servidor 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.