Função Identidade (1ª geração)

Para fins de segurança, a maioria das interações entre entidades no Google Cloud exige que cada entidade tenha uma identidade verificável, protegida por algum tipo de secret, como uma senha ou chave. Assim como outras entidades precisam de uma identidade para acessar o Cloud Run functions, as próprias funções geralmente precisam de acesso a outros recursos no Google Cloud para realizar o trabalho. Cada função é associada a uma conta de serviço que serve como identidade quando a função acessa outros recursos. A conta de serviço usada por uma função como identidade também é conhecida como conta de serviço do ambiente de execução.

Para uso em produção, o Google recomenda que você atribua a cada função uma identidade dedicada, atribuindo a ela uma conta de serviço gerenciada pelo usuário. 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.

Conta de serviço do ambiente de execução

A menos que você especifique uma conta de serviço de ambiente de execução diferente ao implantar uma função, o Cloud Run functions usará uma conta de serviço padrão como identidade para a execução da função:

Essas contas de serviço padrão têm o papel de Editor, o que permite amplo acesso a muitos serviços do Google Cloud. Embora essa seja a maneira mais rápida de desenvolver funções, o Google recomenda o uso dessa conta de serviço padrão apenas para teste e desenvolvimento. Para produção, conceda à conta de serviço apenas o conjunto mínimo de permissões necessárias para atingir a meta.

Para proteger as funções na produção:

Como alterar permissões na conta de serviço padrão do ambiente de execução

Console

  1. Acesse a página "IAM" no Console do Google Cloud.

    Acessar o Console do Google Cloud

  2. Selecione a Conta de serviço padrão do App Engine ou a Conta de serviço de computação padrão na tabela.

  3. Clique no lápis ao lado direito da linha para mostrar a guia Editar permissões.

  4. Adicione ou remova papéis na lista suspensa de papéis para fornecer acesso com menos privilégios.

  5. Clique em Salvar.

gcloud

Remova o papel Editor e use o comando gcloud projects add-iam-policy-binding para adicionar uma nova função:

# Remove the Editor role
gcloud projects remove-iam-policy-binding PROJECT_ID \
--member="SERVICE_ACCOUNT_EMAIL" \
--role="roles/editor"

# Add the desired role
gcloud projects add-iam-policy-binding PROJECT_ID \
--member="SERVICE_ACCOUNT_EMAIL" \
--role="ROLE"

Em que PROJECT_ID é o ID do projeto que você está usando, SERVICE_ACCOUNT_EMAIL é o endereço de e-mail da conta de serviço do ambiente de execução padrão, conforme mostrado anteriormente em Conta de serviço do ambiente de execução, e ROLE é o novo papel para atribuir à conta de serviço de ambiente de execução padrão.

Como usar contas de serviço individuais para suas funções

Para oferecer maior flexibilidade no controle de acesso para suas funções, é possível fornecer a cada uma delas a própria conta de serviço gerenciada pelo usuário.

  1. Crie sua conta de serviço. Anote o nome dela.
  2. Conceder os papéis apropriados com base nos recursos que a função precisa acessar para realizar o trabalho.
  3. Se a conta de serviço e a função estiverem em projetos diferentes, a partir do projeto em que a conta de serviço está localizada:

    1. Configure a conta de serviço para trabalhar em vários projetos.
    2. Conceda o papel Criador de token da conta de serviço (roles/iam.serviceAccountTokenCreator) ao agente de serviço do Cloud Run functions (service-PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com), em que PROJECT se refere ao projeto em que a função reside. O agente de serviço do Cloud Run functions gerencia o acesso entre projetos para sua conta de serviço.

    3. Conceda a permissão iam.serviceaccounts.actAs ao agente de serviço do Cloud Run functions na conta de serviço do projeto diferente.

  4. Conceda à conta de serviço acesso ao recurso. O método para fazer isso depende do tipo de recurso.

  5. Conecte a conta de serviço à sua função. Faça isso no momento da implantação ou atualizando uma função implantada anteriormente.

Como adicionar uma conta de serviço gerenciada pelo usuário na implantação

Console

  1. Acesse o Console do Google Cloud:

    Acessar o Console do Google Cloud

  2. Especifique e configure a função como quiser.

  3. Clique em Ambiente de execução, build... para mostrar outras configurações.

  4. Selecione a guia Ambiente de execução.

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

  6. Clique em Próximo e em Implantar.

gcloud

Ao implantar uma função usando gcloud functions deploy, adicione a sinalização --service-account. Por exemplo:

gcloud functions deploy --no-gen2 FUNCTION_NAME --service-account SERVICE_ACCOUNT_EMAIL

em que FUNCTION_NAME é o nome da função e SERVICE_ACCOUNT_EMAIL é o e-mail da conta de serviço.

Como atualizar a conta de serviço de uma função existente

É possível atualizar a conta de serviço do ambiente de execução de uma função existente.

Console

  1. Acesse o Console do Google Cloud:

    Acessar o Console do Google Cloud

  2. Clique no nome da função desejada para acessar a página de detalhes.

  3. Clique no lápis Editar na parte superior da página de detalhes para editar a função.

  4. Clique em Ambiente de execução, build... para mostrar outras configurações.

  5. Selecione a guia Ambiente de execução.

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

  7. Clique em Próximo e em Implantar.

gcloud

Ao implantar uma função usando gcloud functions deploy, adicione a sinalização --service-account:

gcloud functions deploy FUNCTION_NAME --service-account SERVICE_ACCOUNT_EMAIL

em que FUNCTION_NAME é o nome da função e SERVICE_ACCOUNT_EMAIL é a conta de serviço.

A função reimplantada agora usa a nova conta de serviço do ambiente de execução.

Como usar o servidor de metadados para adquirir tokens

Ainda que as contas de serviço definidas pelo IAM sejam o método preferido para gerenciamento de acesso no Google Cloud, alguns serviços podem exigir outros modos, como uma chave de API, o cliente OAuth 2.0 ou a chave da conta de serviço. O acesso a um recurso externo também pode exigir métodos alternativos.

Se o serviço de destino exigir que você apresente um token de identidade do OpenID Connect ou um token de ID do Oauth 2.0, talvez seja possível usar o Compute Metadata Server para buscar esses tokens em vez de configurar um cliente OAuth completo.

Tokens de identidade

Use o Compute Metadata Server para buscar tokens de ID com um público-alvo específico da maneira a seguir:

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

Onde AUDIENCE é o público-alvo JWT solicitado, por exemplo: o URL de um serviço que você está chamando, como https://service.domain.com, ou o ID do cliente OAuth de um recurso protegido por IAP, como 1234567890.apps.googleusercontent.com.

Tokens de acesso

Os tokens de acesso do OAuth 2.0 usam escopos para definir as permissões de acesso. Por padrão, dentro dos tokens de acesso do Google Cloud está o escopo cloud-platform. Para acessar outras APIs do Google ou do Google Cloud, é necessário buscar um token de acesso com o escopo apropriado.

Use o Compute Metadata Server para buscar tokens de acesso.

Se você precisa de um token de acesso com um escopo específico, é possível gerar um como este:

curl "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token?scopes=SCOPES" \
  -H "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.

Próximas etapas

Saiba como autorizar o acesso às funções ou autenticar desenvolvedores e outras funções para que eles possam invocar suas funções.