Configurar destinos de registro com contas de serviço gerenciado pelo usuário

Esta página descreve como encaminhar entradas de registro criando coletores configurados com contas de serviço gerenciadas pelo usuário. Por padrão, o Logging usa uma conta de serviço do Logging para todos os destinos em um recurso. No entanto, se os destinos de registro estiverem em projetos diferentes, você poderá criar e gerenciar sua própria conta de serviço gerenciada pelo usuário, que permite gerenciar centralmente as permissões de Identity and Access Management do projeto que contém a conta de serviço gerenciada pelo usuário.

Só é possível criar um destino que usa uma conta de serviço gerenciada pelo usuário quando o destino é um bucket de registro ou um projeto do Google Cloud. O exemplo neste documento ilustra como configurar um sink que usa uma conta de serviço gerenciada pelo usuário, em que o destino é um bucket de registro.

Antes de começar

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. Verifique se você tem uma conta de serviço gerenciada pelo usuário e defina as variáveis a seguir com os valores apropriados para a conta de serviço gerenciada pelo usuário:

    • CUSTOM_SA_PROJECT_ID: o ID do projeto que contém sua conta de serviço gerenciada pelo usuário.

    • CUSTOM_SA: o endereço de e-mail da sua conta de serviço gerenciada pelo usuário.

    Para saber como criar uma conta de serviço, consulte Criar contas de serviço.

  3. Verifique se você tem um bucket de registro que possa servir como destino de um coletor de registros e defina as seguintes variáveis para valores adequados para o bucket de registro. Se necessário, crie um bucket de registro:

    • LOG_BUCKET_PROJECT_ID: o ID do projeto que contém o bucket de registros.

    • LOCATION: o local do bucket de registro.

    • BUCKET_NAME: o nome do bucket de registro.

  4. Identifique o nome da conta de serviço de registro que existe no projeto em que você planeja criar o sink de registro e defina as seguintes variáveis para os valores apropriados:

    • SINK_PROJECT_ID: o ID do projeto em que você planeja criar o sink de registro.

    • LOGGING_SA: o endereço de e-mail da conta de serviço de registro padrão. Para encontrar esse endereço, execute o seguinte comando:

      gcloud logging settings describe --project=SINK_PROJECT_ID
      

      Na resposta, a linha que começa com loggingServiceAccountId lista o endereço de e-mail da sua conta de serviço.

  5. No projeto que contém a conta de serviço gerenciada pelo usuário, verifique se a restrição booleana da política da organização iam.disableCrossProjectServiceAccountUsage não foi aplicada. Por padrão, essa restrição é aplicada. Para desativar essa restrição e poder anexar uma conta de serviço a um recurso em outro projeto, execute o seguinte comando:

    gcloud resource-manager org-policies disable-enforce \
    iam.disableCrossProjectServiceAccountUsage \
    --project=CUSTOM_SA_PROJECT_ID
    

    Para mais informações sobre como ativar contas de serviço em projetos, consulte Ativar a vinculação de contas de serviço entre projetos.

Conceder papéis do IAM

Esta seção descreve os pré-requisitos para criar um sink que usa uma conta de serviço gerenciada pelo usuário.

Permitir que a conta de serviço gerenciada pelo usuário grave entradas de registro no destino do coletor

Conceda à conta de serviço gerenciada pelo usuário as permissões necessárias para gravar entradas de registro no destino do coletor que você vai criar em uma etapa subsequente. O destino do coletor será um bucket de registro armazenado no projeto chamado LOG_BUCKET_PROJECT_ID.

Para conceder as permissões necessárias à conta de serviço gerenciada pelo usuário, conceda a ela o papel de escritor do bucket de registros (roles/logging.bucketWriter) no projeto que contém o bucket de registros:

gcloud projects add-iam-policy-binding LOG_BUCKET_PROJECT_ID \
--member='serviceAccount:CUSTOM_SA' \
--role='roles/logging.bucketWriter'

Para mais informações sobre o comando anterior, consulte gcloud projects add-iam-policy-binding.

Configurar a representação da conta de serviço

Configure a conta de serviço padrão do Cloud Logging, LOGGING_SA, para que ela possa personificar a conta de serviço gerenciada pelo usuário, CUSTOM_SA. A conta de serviço padrão do Cloud Logging existe no projeto do Google Cloud em que você quer criar sinks de registro que usam a conta de serviço gerenciada pelo usuário.

Para configurar a representação de conta de serviço, conceda o papel Criador de token da conta de serviço (roles/iam.serviceAccountTokenCreator) à conta de serviço do Cloud Logging na conta de serviço gerenciada pelo usuário:

gcloud iam service-accounts add-iam-policy-binding CUSTOM_SA \
--project=CUSTOM_SA_PROJECT_ID \
--member='serviceAccount:LOGGING_SA' \
--role='roles/iam.serviceAccountTokenCreator'

A representação de uma conta de serviço envolve dois principais: a conta de serviço que não tem permissões para acessar um recurso e a conta de serviço com privilégios que tem as permissões para acessar um recurso. Nesse caso, a conta de serviço gerenciada pelo usuário é a conta com privilégios, porque ela pode gravar entradas de registro no destino do coletor, que é um bucket de registro no projeto chamado LOG_BUCKET_PROJECT_ID. A conta de serviço do Logging tem os privilégios para rotear entradas de registro.

Para mais informações sobre o papel de criador de token da conta de serviço, consulte Papel de criador de token da conta de serviço.

Para mais informações sobre a representação de uma conta de serviço, consulte Sobre a representação de uma conta de serviço.

Permitir que o principal execute operações como a conta de serviço gerenciada pelo usuário

Dê ao principal que vai criar o sink as permissões necessárias para executar operações como a conta de serviço gerenciada pelo usuário.

Para conceder as permissões necessárias, conceda ao principal o papel de usuário da conta de serviço (roles/iam.serviceAccountUser) no projeto do Google Cloud que armazena a conta de serviço gerenciada pelo usuário, CUSTOM_SA_PROJECT_ID.

Antes de executar o comando a seguir, faça as seguintes substituições:

  • PRINCIPAL: um identificador do principal a quem você quer conceder o papel. Os identificadores dos principais geralmente têm o seguinte formato: PRINCIPAL-TYPE:ID. Por exemplo, user:my-user@example.com. Para uma lista completa dos formatos que PRINCIPAL pode ter, consulte Identificadores principais.

Execute o comando gcloud iam service-accounts add-iam-policy-binding:

gcloud iam service-accounts add-iam-policy-binding CUSTOM_SA \
--project=CUSTOM_SA_PROJECT_ID \
--member='PRINCIPAL' \
--role='roles/iam.serviceAccountUser'

Se você usar papéis personalizados, o principal vai precisar da permissão iam.serviceAccounts.actAs.

Para mais informações sobre o papel de usuário da conta de serviço, consulte Papel de usuário da conta de serviço.

Criar um sink de registro que usa uma conta de serviço gerenciada pelo usuário

Para criar um sink com uma conta de serviço gerenciada pelo usuário, execute o comando gcloud logging sinks create e inclua a opção --custom-writer-identity.

Antes de executar o comando a seguir, faça as seguintes substituições:

  • SINK_NAME: o nome do coletor de registros.

Execute o comando gcloud logging sinks create:

gcloud logging sinks create SINK_NAME \
logging.googleapis.com/projects/LOG_BUCKET_PROJECT_ID/locations/LOCATION/buckets/BUCKET_NAME \
--custom-writer-identity=serviceAccount:CUSTOM_SA \
--project=SINK_PROJECT_ID

Verificar se o coletor está roteando entradas de registro

Nesta seção, você vai usar a CLI gcloud para gravar e ler uma entrada de registro e verificar se o sink está roteando as entradas de registro corretamente.

Para verificar se o coletor está roteando as entradas de registro corretamente, faça o seguinte:

  1. Execute o comando gcloud logging write:

    Antes de executar o comando a seguir, faça as seguintes substituições:

    • LOG_NAME: o nome do registro. Por exemplo, é possível definir esse campo como mylog.

    Execute o comando gcloud logging write:

    gcloud logging write LOG_NAME "Test log entry" --project=SINK_PROJECT_ID
    

    O comando anterior retorna a seguinte mensagem: Created log entry.

  2. Para ler a entrada de registro que você acabou de gravar, execute o seguinte comando:

    gcloud logging read 'textPayload="Test log entry"' \
    --bucket=BUCKET_NAME --location=LOCATION \
    --view=_AllLogs --project=SINK_PROJECT_ID
    

A seguir