Esta página explica como configurar e usar notificações de eventos para seus segredos no Secret Manager.
Visão geral
O Secret Manager se integra ao Pub/Sub para fornecer notificações de eventos sobre mudanças em secrets e versões de secrets. É possível usar essas notificações para iniciar fluxos de trabalho, como reiniciar um aplicativo quando uma nova versão do secret é adicionada ou notificar engenheiros de segurança quando um secret é excluído. Para mais informações sobre como usar essas notificações para iniciar fluxos de trabalho, consulte a documentação do Pub/Sub.
Como as notificações de eventos funcionam no Gerenciador de secrets
Os secrets podem ser configurados com uma lista de até 10 tópicos do Pub/Sub. Sempre que uma operação
for realizada que modifique o secret ou uma das versões dele, o Secret Manager vai publicar automaticamente
uma mensagem em cada um dos tópicos do Pub/Sub nesse secret.
As chamadas Get
, List
e Access
não resultam em publicações de mensagens.
As mensagens do Pub/Sub têm um conjunto de pares de chave-valor de atributo que contêm metadados sobre
o evento, além de um campo data
com uma serialização JSON completa do recurso
Secret
ou
SecretVersion
que foi criado ou modificado. Esse JSON é uma string codificada em UTF-8 que representa o recurso Secret
ou SecretVersion
exatamente no formato especificado pela API pública do Secret Manager, codificado em JSON, conforme especificado no Mapeamento JSON de proto3.
Tipos de evento
Confira a seguir uma lista dos tipos de evento compatíveis com o Secret Manager.
Tipo de evento | Descrição |
---|---|
SECRET_CREATE |
É enviado quando um novo secret é criado. |
SECRET_UPDATE |
É enviado quando uma nova chave secreta é atualizada. |
SECRET_DELETE |
É enviado quando uma chave secreta é excluída, seja por uma solicitação iniciada pelo usuário ou pela expiração da chave secreta. |
SECRET_VERSION_ADD |
É enviado quando uma nova versão do secret é adicionada. |
SECRET_VERSION_ENABLE |
É enviado quando uma versão do secret é ativada. |
SECRET_VERSION_DISABLE |
É enviado quando uma versão do secret é desativada. |
SECRET_VERSION_DESTROY |
É enviado quando uma versão do secret é destruída. |
SECRET_VERSION_DESTROY_SCHEDULED |
É enviado quando uma duração de atraso de destruição é configurada no secret e o usuário tenta destruir uma versão do secret. |
SECRET_ROTATE |
É enviado quando é hora de fazer a rotação de um secret. Consulte Criar programações de rotação para mais informações. |
TOPIC_CONFIGURED |
Esta é uma mensagem de teste sem corpo ou atributos diferentes de Uma mensagem Sempre que os tópicos são atualizados em um secret, uma mensagem |
Formato da notificação
As notificações enviadas ao tópico do Pub/Sub são compostas de duas partes:
-
Atributos: um conjunto de pares de chave-valor com a descrição do evento.
-
Payload: uma string de caracteres que contém os metadados do objeto alterado.
Atributos
Os atributos são pares de chave-valor contidos em notificações enviadas pelo Secret Manager para seu tópico do Pub/Sub. Todas as notificações, exceto as mensagens de teste TOPIC_CONFIGURED
,
sempre contêm o seguinte conjunto de pares de chave-valor, independentemente dos dados da notificação:
Exemplo | Descrição | |
---|---|---|
eventType |
SECRET_CREATE |
Tipo de evento que acabou de ocorrer. Consulte Tipos de evento para conferir uma lista de valores possíveis. |
dataFormat |
JSON_API_V1 |
O formato dos dados do objeto. |
secretId |
projects/p/secrets/my-secret |
O nome completo do recurso do secret em que o evento ocorreu. |
timestamp |
2021-01-20T11:17:45.081104-08:00 |
Hora em que o evento ocorreu |
Além disso, as notificações às vezes contêm o seguinte conjunto de pares de chave-valor:
Exemplo | Descrição | |
---|---|---|
versionId |
projects/p/secrets/my-secret/versions/456 |
É o nome da versão do secret em que o evento ocorreu.
Isso está presente apenas nas notificações de eventos |
deleteType |
REQUESTED |
Se a exclusão foi solicitada por um usuário (REQUESTED ) ou devido à expiração do secret (EXPIRATION ). Presente apenas em notificações de eventos SECRET_DELETE .
|
Dados
O campo de dados é uma string UTF-8 que contém os metadados do objeto alterado. Os dados são um secret ou uma versão do secret.
Para notificações SECRET_DELETE
, os metadados contidos no campo de dados representam os metadados do objeto como eram antes da exclusão. Para todas as outras notificações, os metadados incluídos no
campo de dados representam os metadados do objeto após a mudança ocorrer.
Limitações
As notificações de eventos estão disponíveis apenas na API Secret Manager v1 e na Google Cloud CLI.
Antes de começar
É possível armazenar todos os recursos no mesmo projeto ou armazenar segredos e tópicos do Pub/Sub em projetos separados.
-
Para configurar o Secret Manager, faça o seguinte:
-
Crie ou use um projeto atual para armazenar os recursos do Secret Manager.
-
Se necessário, conclua as etapas mencionadas na página Ativar a API Secret Manager.
-
-
Para configurar o Pub/Sub, faça o seguinte:
-
Crie ou use um projeto atual para armazenar seus recursos do Pub/Sub.
-
Se necessário, ative a API Pub/Sub.
-
-
Autentique-se no Google Cloud usando o seguinte comando:
$ gcloud auth login --update-adc
Criar uma identidade de agente de serviço
Para criar uma identidade de agente de serviço para cada projeto que exige segredos com notificações de eventos, siga estas etapas:
-
Para criar uma identidade de serviço com a Google Cloud CLI, execute o seguinte comando:
$ gcloud beta services identity create \ --service "secretmanager.googleapis.com" \ --project "PROJECT_ID"
Esse comando retorna um nome de conta de serviço com o seguinte formato:
service-PROJECT_ID@gcp-sa-secretmanager.iam.gserviceaccount.com
-
Conceda permissão a essa conta de serviço para publicar nos tópicos do Pub/Sub configurados nos seus segredos.
-
Salve o nome da conta de serviço como uma variável de ambiente usando o seguinte comando:
# This is from the output of the command above $ export SM_SERVICE_ACCOUNT="service-...."
As variáveis de ambiente para o projeto do Secret Manager, o projeto do Pub/Sub e a conta de serviço do Secret Manager precisam ser definidas durante todo o procedimento que você está seguindo.
Criar tópicos Pub/Sub
Siga o guia de início rápido do Pub/Sub para criar tópicos no seu projeto do Pub/Sub no console do Google Cloud. Como alternativa, crie tópicos na Google Cloud CLI usando o seguinte comando:
gcloud
Antes de usar os dados do comando abaixo, faça estas substituições:
- PROJECT_ID: o ID do projeto do Google Cloud que contém o segredo
- PUBSUB_PROJECT_ID: o ID do projeto em que as assinaturas serão criadas
- PUBSUB_TOPIC_NAME: o nome do tópico
Execute o seguinte comando:
Linux, macOS ou Cloud Shell
gcloud pubsub topics create "projects/PUBSUB_PROJECT_ID/topics/PUBSUB_TOPIC_NAME"
Windows (PowerShell)
gcloud pubsub topics create "projects/PUBSUB_PROJECT_ID/topics/PUBSUB_TOPIC_NAME"
Windows (cmd.exe)
gcloud pubsub topics create "projects/PUBSUB_PROJECT_ID/topics/PUBSUB_TOPIC_NAME"
Repita essa ação várias vezes se quiser criar vários tópicos do Pub/Sub no secret.
Conceda permissão à conta de serviço do Secret Manager para publicar nos tópicos
É possível conceder permissões à conta de serviço do Secret Manager pelo console do Google Cloud ou pela Google Cloud CLI.
Para conceder o papel Publicador do Pub/Sub (roles/pubsub.publisher
) no tópico do Pub/Sub, use o seguinte comando:
gcloud
Antes de usar os dados do comando abaixo, faça estas substituições:
- PUBSUB_TOPIC_NAME: o nome do tópico
Execute o seguinte comando:
Linux, macOS ou Cloud Shell
gcloud pubsub topics create add-iam-policy-binding PUBSUB_TOPIC_NAME \ --member "serviceAccount:${SM_SERVICE_ACCOUNT}" \ --role "roles/pubsub.publisher"
Windows (PowerShell)
gcloud pubsub topics create add-iam-policy-binding PUBSUB_TOPIC_NAME ` --member "serviceAccount:${SM_SERVICE_ACCOUNT}" ` --role "roles/pubsub.publisher"
Windows (cmd.exe)
gcloud pubsub topics create add-iam-policy-binding PUBSUB_TOPIC_NAME ^ --member "serviceAccount:${SM_SERVICE_ACCOUNT}" ^ --role "roles/pubsub.publisher"
Criar assinaturas do Pub/Sub
Para visualizar as mensagens publicadas em um tópico, você também precisa criar uma assinatura dele. Siga o guia de início rápido do Pub/Sub para criar assinaturas no seu projeto do Pub/Sub no console do Google Cloud. Como alternativa, crie tópicos na Google Cloud CLI usando o seguinte comando:
gcloud
Antes de usar os dados do comando abaixo, faça estas substituições:
- PUBSUB_PROJECT_ID: o ID do projeto em que as assinaturas serão criadas
- PUBSUB_SUBSCRIPTION_NAME: o nome da assinatura
- PUBSUB_TOPIC_NAME: o nome do tópico
Execute o seguinte comando:
Linux, macOS ou Cloud Shell
gcloud pubsub subscriptions create projects/PUBSUB_PROJECT_ID/subscriptions/PUBSUB_SUBSCRIPTION_NAME \ --topic projects/PUBSUB_PROJECT_ID/topics/PUBSUB_TOPIC_NAME
Windows (PowerShell)
gcloud pubsub subscriptions create projects/PUBSUB_PROJECT_ID/subscriptions/PUBSUB_SUBSCRIPTION_NAME ` --topic projects/PUBSUB_PROJECT_ID/topics/PUBSUB_TOPIC_NAME
Windows (cmd.exe)
gcloud pubsub subscriptions create projects/PUBSUB_PROJECT_ID/subscriptions/PUBSUB_SUBSCRIPTION_NAME ^ --topic projects/PUBSUB_PROJECT_ID/topics/PUBSUB_TOPIC_NAME
Criar um secret com tópicos configurados
Crie um secret com uma lista de até 10 tópicos configurados. Todos os tópicos configurados em um secret recebem notificações de eventos quando o secret ou uma das versões dele muda.
gcloud
Antes de usar os dados do comando abaixo, faça estas substituições:
- SECRET_ID: o ID do secret ou do identificador totalmente qualificado
- PUBSUB_TOPIC_NAME: o nome do tópico
- LOCATION: o local do Google Cloud do segredo
Execute o seguinte comando:
Linux, macOS ou Cloud Shell
gcloud secrets create SECRET_ID --topics PUBSUB_TOPIC_NAME --location=LOCATION
Windows (PowerShell)
gcloud secrets create SECRET_ID --topics PUBSUB_TOPIC_NAME --location=LOCATION
Windows (cmd.exe)
gcloud secrets create SECRET_ID --topics PUBSUB_TOPIC_NAME --location=LOCATION
Atualizar tópicos secretos
Modifique os tópicos do Pub/Sub configurados em um secret atualizando-o com os novos nomes de recursos dos tópicos do Pub/Sub. Com a CLI do Google Cloud, é possível adicionar ou remover um ou mais tópicos de um secret, além de limpar todos os tópicos dele.
Adicionar tópicos
Para adicionar um ou mais tópicos a um secret, use o seguinte comando:
gcloud
Antes de usar os dados do comando abaixo, faça estas substituições:
- SECRET_ID: o ID do secret ou do identificador totalmente qualificado
- LOCATION: o local do Google Cloud do segredo
- PROJECT_ID: o ID do projeto do Google Cloud que contém o segredo
- PUBSUB_PROJECT_ID: o ID do projeto em que as assinaturas serão criadas
- PUBSUB_TOPIC_1_NAME e PUBSUB_TOPIC_2_NAME: os nomes dos tópicos que você está adicionando ao secret.
Execute o seguinte comando:
Linux, macOS ou Cloud Shell
gcloud secrets update SECRET_ID --location=LOCATION \ --project PROJECT_ID \ --add-topics projects/PUBSUB_PROJECT_ID/topics/PUBSUB_TOPIC_1_NAME,projects/PUBSUB_PROJECT_ID/topics/PUBSUB_TOPIC_2_NAME
Windows (PowerShell)
gcloud secrets update SECRET_ID --location=LOCATION ` --project PROJECT_ID ` --add-topics projects/PUBSUB_PROJECT_ID/topics/PUBSUB_TOPIC_1_NAME,projects/PUBSUB_PROJECT_ID/topics/PUBSUB_TOPIC_2_NAME
Windows (cmd.exe)
gcloud secrets update SECRET_ID --location=LOCATION ^ --project PROJECT_ID ^ --add-topics projects/PUBSUB_PROJECT_ID/topics/PUBSUB_TOPIC_1_NAME,projects/PUBSUB_PROJECT_ID/topics/PUBSUB_TOPIC_2_NAME
Remover tópicos
Para remover um ou mais tópicos de um secret, use o seguinte comando:
gcloud
Antes de usar os dados do comando abaixo, faça estas substituições:
- SECRET_ID: o ID do secret ou do identificador totalmente qualificado
- LOCATION: o local do Google Cloud do segredo
- PROJECT_ID: o projeto do Google Cloud que contém o segredo
- PUBSUB_PROJECT_ID: o ID do projeto em que as assinaturas serão criadas
- PUBSUB_TOPIC_1_NAME e PUBSUB_TOPIC_2_NAME: os nomes dos tópicos que você está removendo do secret.
Execute o seguinte comando:
Linux, macOS ou Cloud Shell
gcloud secrets update SECRET_ID --location=LOCATION \ --project PROJECT_ID \ --remove-topics "projects/PUBSUB_PROJECT_ID/topics/PUBSUB_TOPIC_1_NAME,projects/PUBSUB_PROJECT_ID/topics/PUBSUB_TOPIC_2__NAME
Windows (PowerShell)
gcloud secrets update SECRET_ID --location=LOCATION ` --project PROJECT_ID ` --remove-topics "projects/PUBSUB_PROJECT_ID/topics/PUBSUB_TOPIC_1_NAME,projects/PUBSUB_PROJECT_ID/topics/PUBSUB_TOPIC_2__NAME
Windows (cmd.exe)
gcloud secrets update SECRET_ID --location=LOCATION ^ --project PROJECT_ID ^ --remove-topics "projects/PUBSUB_PROJECT_ID/topics/PUBSUB_TOPIC_1_NAME,projects/PUBSUB_PROJECT_ID/topics/PUBSUB_TOPIC_2__NAME
Limpar temas
Para remover todos os tópicos de um secret, use o seguinte comando:
gcloud
Antes de usar os dados do comando abaixo, faça estas substituições:
- SECRET_ID: o ID do secret ou do identificador totalmente qualificado
- PROJECT_ID: o projeto do Google Cloud que contém o segredo
- LOCATION: o local do Google Cloud do segredo
Execute o seguinte comando:
Linux, macOS ou Cloud Shell
gcloud secrets update SECRET_ID --location=LOCATION \ --project PROJECT_ID \ --clear-topics
Windows (PowerShell)
gcloud secrets update SECRET_ID --location=LOCATION ` --project PROJECT_ID ` --clear-topics
Windows (cmd.exe)
gcloud secrets update SECRET_ID --location=LOCATION ^ --project PROJECT_ID ^ --clear-topics
Consumir notificações de eventos com funções do Cloud Run
As notificações de eventos podem ser usadas para iniciar fluxos de trabalho, criando funções do Cloud Run para
consumir as mensagens do Pub/Sub. Consulte a documentação das funções do Cloud Run para mais informações. O exemplo de código a seguir é para uma função do Cloud Run que imprime eventType
,
secretId
e metadados sempre que um evento é publicado no tópico.
C#
Para executar esse código, primeiro configure um ambiente de desenvolvimento em C# e instale o SDK do C# do Secret Manager. No Compute Engine ou no GKE, você precisa fazer a autenticação com o escopo do cloud-platform.
using CloudNative.CloudEvents; using Google.Cloud.Functions.Framework; using Google.Events.Protobuf.Cloud.PubSub.V1; using System; using System.Threading; using System.Threading.Tasks; // Triggered from a message on a Cloud Pub/Sub topic. // The printed value will be visible in Cloud Logging // (https://cloud.google.com/functions/docs/monitoring/logging). namespace PubSubSample { public class Function : ICloudEventFunction<MessagePublishedData> { public Task HandleAsync(CloudEvent cloudEvent, MessagePublishedData data, CancellationToken cancellationToken) { string eventType = data.Message.Attributes["eventType"]; string secretId = data.Message.Attributes["secretId"]; string secretMetadata = data.Message.TextData; Console.WriteLine($"Received {eventType} for {secretId}. New metadata: {secretMetadata}."); return Task.CompletedTask; } } }
Go
Para executar esse código, primeiro configure um ambiente de desenvolvimento do Go e instale o SDK do Go do Secret Manager. No Compute Engine ou no GKE, você precisa fazer a autenticação com o escopo do cloud-platform.
Java
Para saber como instalar e usar a biblioteca de cliente do Secret Manager, consulte Bibliotecas de cliente do Secret Manager.
Para autenticar no Secret Manager, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.
Node.js
Para executar esse código, primeiro configure um ambiente de desenvolvimento do Node.js e instale o SDK do Node.js do Secret Manager. No Compute Engine ou no GKE, você precisa fazer a autenticação com o escopo do cloud-platform.
/** * Triggered from a message on a Cloud Pub/Sub topic. * The printed value will be visible in Cloud Logging * (https://cloud.google.com/functions/docs/monitoring/logging). * * @param {!Object} event Event payload. * @param {!Object} context Metadata for the event. */ exports.smEventsFunction = (event, context) => { const eventType = event.attributes.eventType; const secretID = event.attributes.secretId; const secretMetadata = Buffer.from(event.data, 'base64').toString(); console.log(`Received ${eventType} for ${secretID}. New metadata: ${secretMetadata}.`); };
Python
Para executar esse código, primeiro configure um ambiente de desenvolvimento do Python e instale o SDK do Python do Secret Manager. No Compute Engine ou no GKE, você precisa fazer a autenticação com o escopo do cloud-platform.
Ruby
Para executar esse código, primeiro configure um ambiente de desenvolvimento em Ruby e instale o SDK do Ruby do Secret Manager. No Compute Engine ou no GKE, você precisa fazer a autenticação com o escopo do cloud-platform.
require "functions_framework" require "base64" # Triggered from a message on a Cloud Pub/Sub topic. # The printed value will be visible in Cloud Logging # (https://cloud.google.com/functions/docs/monitoring/logging). FunctionsFramework.cloud_event "sm_events_function" do |event| message = event.data["message"] event_type = message["attributes"]["eventType"] secret_id = message["attributes"]["secretId"] message_data = Base64.decode64 message["data"] FunctionsFramework.logger.info "Received %s for %s. New metadata: %s." % [event_type, secret_id, message_data] end
Para conferir uma lista de todos os tipos de evento, consulte Tipos de evento.
Tópicos configurados incorretamente
Se os tópicos do Pub/Sub forem adicionados a um secret em uma operação Create ou Update, mas o Secret Manager não puder publicar mensagens no tópico devido a uma configuração incorreta, a operação vai falhar com uma mensagem de erro indicando o motivo da falha na publicação. Isso pode acontecer, por exemplo, se o tópico não existir ou se a conta de serviço do Secret Manager não tiver permissão para publicar.
Se os tópicos do Pub/Sub forem adicionados a um secret e depois forem alterados para
que o Secret Manager não possa mais publicar mensagens (por exemplo, se o tópico for excluído ou
as permissões da conta de serviço do Secret Manager forem removidas), o Secret Manager vai gravar
registros no Secret
do Secret Manager
com uma mensagem indicando por que a publicação falhou.