Este documento fornece exemplos que demonstram como receber e analisar notificações sobre mudanças nos seus perfis de dados. A proteção de dados sensíveis envia essas atualizações na forma de mensagens do Pub/Sub.
Visão geral
É possível configurar a proteção de dados sensíveis para gerar perfis automaticamente sobre dados em uma organização, pasta ou projeto. Os perfis de dados contêm métricas e metadados sobre seus dados e ajudam a determinar onde os dados sensíveis e de alto risco residem. A proteção de dados sensíveis informa essas métricas em vários níveis de detalhes. Para informações sobre os tipos de dados que podem ser criados, consulte Recursos compatíveis.
Ao configurar o criador de perfil de dados, você pode ativar a opção de publicar mensagens do Pub/Sub sempre que ocorrerem mudanças significativas nos seus perfis de dados. As mensagens ajudam você a tomar medidas imediatas em resposta a essas mudanças. A seguir estão os eventos que você pode ouvir:
- Um recurso de dados é criado pela primeira vez.
- Um perfil é atualizado.
- O risco ou a pontuação de sensibilidade de um perfil aumenta.
- Há um novo erro relacionado aos seus perfis de dados.
As mensagens do Pub/Sub publicadas pelo criador de perfil de dados contêm um
DataProfilePubSubMessage objeto. Essas mensagens são sempre enviadas em formato binário. Portanto, é necessário escrever um código que as receba e analise.
Preços
Ao usar o Pub/Sub, você recebe a cobrança de acordo com os preços do Pub/Sub.
Antes de começar
Esta página pressupõe o seguinte:
- Você está familiarizado com o uso do Pub/Sub. Para uma introdução, consulte o guia de início rápido Publicar e receber mensagens no Pub/Sub usando o console.
- Você já tem uma configuração de verificação no nível da organização, pasta ou projeto.
- Você está familiarizado com a configuração de Google Cloud bibliotecas de cliente.
Antes de começar a trabalhar nos exemplos, siga estas etapas:
Crie um tópico do Pub/Sub e adicione uma assinatura a ele. Não atribua um esquema ao tópico.
Para simplificar, os exemplos nesta página ouvem apenas uma assinatura. No entanto, na prática, é possível criar um tópico e uma assinatura para cada evento compatível com a proteção de dados sensíveis.
Se você ainda não tiver feito isso, configure o criador de perfil de dados para publicar mensagens do Pub/Sub:
Edite a configuração da verificação.
Na página Editar configuração da verificação, ative a opção Publicar no Pub/Sub e selecione os eventos que você quer ouvir. Em seguida, configure as definições de cada evento.
Salve a configuração da verificação.
Conceda ao agente de serviço de proteção de dados sensíveis acesso de publicação acesso no tópico do Pub/Sub. Um exemplo de papel que tem acesso de publicação é o papel de Publicador do Pub/Sub (
roles/pubsub.publisher). O agente de serviço de proteção de dados sensíveis é um endereço de e-mail no formato:service-PROJECT_NUMBER@dlp-api.iam.gserviceaccount.comSe você estiver trabalhando com uma configuração de verificação no nível da organização ou da pasta, o PROJECT_NUMBER é o identificador numérico do contêiner do agente de serviço. Se você estiver trabalhando com uma configuração de verificação no nível do projeto, o PROJECT_NUMBER será o identificador numérico do seu projeto.
Instale e configure a biblioteca de cliente de proteção de dados sensíveis para Java ou Python.
Exemplos
Os exemplos a seguir demonstram como receber e analisar mensagens do Pub/Sub publicadas pelo criador de perfil de dados. É possível reutilizar esses exemplos e implantá-los como funções do Cloud Run acionadas por eventos do Pub/Sub. Para mais informações, consulte o tutorial do Pub/Sub (2ª geração).
Nos exemplos a seguir, substitua o seguinte:
- PROJECT_ID: o ID do projeto que contém a assinatura do Pub/Sub.
- SUBSCRIPTION_ID: o ID da assinatura do Pub/Sub.
Java
import com.google.api.core.ApiService;
import com.google.cloud.pubsub.v1.AckReplyConsumer;
import com.google.cloud.pubsub.v1.MessageReceiver;
import com.google.cloud.pubsub.v1.Subscriber;
import com.google.privacy.dlp.v2.DataProfilePubSubMessage;
import com.google.protobuf.InvalidProtocolBufferException;
import com.google.pubsub.v1.ProjectSubscriptionName;
import com.google.pubsub.v1.PubsubMessage;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
public class DataProfilePubSubMessageParser {
public static void main(String... args) throws Exception {
String projectId = "PROJECT_ID";
String subscriptionId = "SUBSCRIPTION_ID";
int timeoutSeconds = 5;
// The `ProjectSubscriptionName.of` method creates a fully qualified identifier
// in the form `projects/{projectId}/subscriptions/{subscriptionId}`.
ProjectSubscriptionName subscriptionName =
ProjectSubscriptionName.of(projectId, subscriptionId);
MessageReceiver receiver =
(PubsubMessage pubsubMessage, AckReplyConsumer consumer) -> {
try {
DataProfilePubSubMessage message = DataProfilePubSubMessage.parseFrom(
pubsubMessage.getData());
System.out.println(
"PubsubMessage with ID: " + pubsubMessage.getMessageId()
+ "; message size: " + pubsubMessage.getData().size()
+ "; event: " + message.getEvent()
+ "; profile name: " + message.getProfile().getName()
+ "; full resource: " + message.getProfile().getFullResource());
consumer.ack();
} catch (InvalidProtocolBufferException e) {
e.printStackTrace();
}
};
// Create subscriber client.
Subscriber subscriber = Subscriber.newBuilder(subscriptionName, receiver).build();
try {
ApiService apiService = subscriber.startAsync();
apiService.awaitRunning();
System.out.printf("Listening for messages on %s for %d seconds.%n", subscriptionName,
timeoutSeconds);
subscriber.awaitTerminated(timeoutSeconds, TimeUnit.SECONDS);
} catch (TimeoutException ignored) {
} finally {
subscriber.stopAsync();
}
}
}
Python
from google.cloud import pubsub_v1
from concurrent.futures import TimeoutError
from google.cloud import dlp_v2
project_id = "PROJECT_ID"
subscription_id = "SUBSCRIPTION_ID"
timeout = 5.0
subscriber = pubsub_v1.SubscriberClient()
# The `subscription_path` method creates a fully qualified identifier
# in the form `projects/{project_id}/subscriptions/{subscription_id}`
subscription_path = subscriber.subscription_path(project_id, subscription_id)
def callback(message: pubsub_v1.subscriber.message.Message) -> None:
print(f"Received {message.data}.")
dlp_msg = dlp_v2.DataProfilePubSubMessage()
dlp_msg._pb.ParseFromString(message.data)
print("Parsed message: ", dlp_msg)
print("--------")
message.ack()
streaming_pull_future = subscriber.subscribe(subscription_path, callback=callback)
print(f"Listening for messages on {subscription_path} for {timeout} seconds...")
# Wrap subscriber in a 'with' block to automatically call close() when done.
with subscriber:
try:
# When `timeout` is not set, result() will block indefinitely,
# unless an exception is encountered first.
streaming_pull_future.result(timeout=timeout)
except TimeoutError:
streaming_pull_future.cancel() # Trigger the shutdown.
streaming_pull_future.result() # Block until the shutdown is complete.
print("Done waiting.")
A seguir
- Saiba mais sobre perfis de dados.
- Aprenda a criar uma configuração de verificação no nível da organização, pasta ou projeto.
- Faça um tutorial que demonstra como escrever, implantar e acionar uma função simples do Cloud Run orientada a eventos com um gatilho do Pub/Sub trigger.