1. Visão geral
Nas organizações modernas, há um volume cada vez maior de dados provenientes de várias fontes. Isso geralmente exige quarentena e classificação dos dados para armazená-los e protegê-los de forma estratégica, uma tarefa que rapidamente se torna cara e impossível se permanecer manual.
Neste codelab, vamos mostrar como classificar automaticamente os dados enviados para o Cloud Storage e movê-los para um bucket de armazenamento correspondente. Vamos fazer isso usando o Cloud Pub/Sub, o Cloud Functions, o Cloud Data Loss Prevention e o Cloud Storage.
Atividades deste laboratório
- Crie buckets do Cloud Storage a serem usados como parte do pipeline de quarentena e classificação.
- Criar uma Função do Cloud simples que invoca a API DLP quando os arquivos são enviados.
- Crie um tópico e uma assinatura do Pub/Sub para receber uma notificação quando o processamento do arquivo for concluído.
- Fazer upload de arquivos de amostra para o bucket de quarentena para invocar uma função do Cloud
- Use a API DLP para inspecionar e classificar os arquivos e movê-los para o bucket apropriado.
O que é necessário
- Um projeto na nuvem do Google Cloud com o faturamento configurado. Se você não tiver uma, crie uma.
2. Etapas da configuração
Ao longo deste codelab, vamos provisionar e gerenciar diferentes recursos e serviços de nuvem usando a linha de comando pelo Cloud Shell. O seguinte comando vai abrir o Cloud Shell e o editor do Cloud Shell, além de clonar o repositório do projeto complementar:
Defina o projeto correto com gcloud config set project [PROJECT_ID]
Ativar APIs
Ative as APIs necessárias no seu projeto na nuvem do Google Cloud:
- API Cloud Functions: gerencia funções leves fornecidas pelo usuário e executadas como resposta a eventos.
- API Cloud Data Loss Prevention (DLP): oferece métodos para detecção, análise de risco e desidentificação de fragmentos com informações confidenciais em textos, imagens e repositórios de armazenamento do Google Cloud Platform.
- Cloud Storage: o Google Cloud Storage é um serviço RESTful para armazenar e acessar seus dados na infraestrutura do Google.
Permissões das contas de serviço
Uma conta de serviço é um tipo especial de conta usada por aplicativos e máquinas virtuais para fazer chamadas de API autorizadas.
Conta de serviço padrão do App Engine
A conta de serviço padrão do App Engine é usada para executar tarefas no seu projeto na nuvem em nome dos apps em execução no App Engine. Essa conta de serviço existe no projeto por padrão com o papel de editor atribuído.
Primeiro, vamos conceder à nossa conta de serviço a função de administrador da DLP, que é necessária para administrar jobs de prevenção contra perda de dados:
gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \ --member serviceAccount:$GOOGLE_CLOUD_PROJECT@appspot.gserviceaccount.com \ --role roles/dlp.admin
Por fim, conceda o papel de agente de serviço da API DLP, que permite as permissões da conta de serviço para BigQuery, Storage, Datastore, Pub/Sub e serviço de gerenciamento de chaves:
gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \ --member serviceAccount:$GOOGLE_CLOUD_PROJECT@appspot.gserviceaccount.com \ --role roles/dlp.serviceAgent
Conta de serviço da DLP
Além da conta de serviço do App Engine, também vamos usar uma conta de serviço da DLP. Essa conta de serviço foi criada automaticamente quando a API DLP foi ativada e não recebe papéis inicialmente. Vamos conceder a função de leitor:
gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \ --member serviceAccount:service-`gcloud projects list --filter="PROJECT_ID:$GOOGLE_CLOUD_PROJECT" --format="value(PROJECT_NUMBER)"`@dlp-api.iam.gserviceaccount.com \ --role roles/viewer
3. Buckets do Cloud Storage
Agora, vamos criar três buckets do Cloud Storage para armazenar nossos dados:
- Bucket de quarentena: nossos dados serão enviados inicialmente para cá.
- Bucket de dados sensíveis: os dados determinados pela API DLP como sensíveis serão movidos para cá.
- Bucket de dados não sensíveis: os dados que a API DLP determinar que não são sensíveis serão movidos para cá.
Podemos usar o comando gsutil para criar todos os três buckets de uma só vez:
gsutil mb gs://[YOUR_QUARANTINE_BUCKET] \ gs://[YOUR_SENSITIVE_DATA_BUCKET] \ gs://[YOUR_NON_SENSITIVE_DATA_BUCKET]
Anote os nomes dos buckets que você acabou de criar. Vamos precisar deles mais tarde.
4. Tópico e assinatura do Pub/Sub
O Cloud Pub/Sub oferece mensagens assíncronas de muitos para muitos entre aplicativos. Um publisher cria uma mensagem e a publica em um feed de mensagens chamado tópico. Um assinante recebe essas mensagens por uma assinatura. Com base nessa assinatura, no nosso caso, uma função do Cloud vai mover os arquivos para os respectivos buckets depois que um job do DLP for executado.
Primeiro, vamos criar um tema. Uma mensagem será publicada aqui sempre que um arquivo for adicionado ao nosso bucket de armazenamento em quarentena. Vamos chamá-lo de "classify-topic".
gcloud pubsub topics create classify-topic
Uma assinatura vai receber uma notificação quando o tópico publicar uma mensagem. Vamos criar uma assinatura do Pub/Sub chamada "classify-sub":
gcloud pubsub subscriptions create classify-sub --topic classify-topic
Essa assinatura vai acionar uma segunda função do Cloud que inicia um job da DLP para inspecionar o arquivo e movê-lo para o local adequado.
5. Cloud Functions
Com o Cloud Functions, é possível implantar funções leves, assíncronas, de finalidade única e baseadas em eventos sem precisar gerenciar um servidor ou um ambiente de execução. Vamos implantar duas funções do Cloud usando o arquivo main.py fornecido, localizado em dlp-cloud-functions-tutorials/gcs-dlp-classification-python/.
Substituir variáveis
Antes de criar as funções, precisamos substituir algumas variáveis no arquivo main.py.
No editor do Cloud Shell, ajuste o arquivo main.py substituindo os valores do ID do projeto e das variáveis de bucket nas linhas 28 a 34 pelos buckets correspondentes criados anteriormente:
main.py
PROJECT_ID = '[PROJECT_ID_HOSTING_STAGING_BUCKET]'
"""The bucket the to-be-scanned files are uploaded to."""
STAGING_BUCKET = '[YOUR_QUARANTINE_BUCKET]'
"""The bucket to move "sensitive" files to."""
SENSITIVE_BUCKET = '[YOUR_SENSITIVE_DATA_BUCKET]'
"""The bucket to move "non sensitive" files to."""
NONSENSITIVE_BUCKET = '[YOUR_NON_SENSITIVE_DATA_BUCKET]'
Além disso, substitua o valor da variável de tópico do Pub/Sub pelo tópico criado na etapa anterior:
""" Pub/Sub topic to notify once the DLP job completes."""
PUB_SUB_TOPIC = 'classify-topic'
Implantar funções
No Cloud Shell, mude os diretórios para gcs-dlp-classification-python, onde o arquivo main.py está localizado:
cd ~/cloudshell_open/dlp-cloud-functions-tutorials/gcs-dlp-classification-python
É hora de implantar algumas funções.
Primeiro, implante a função create_DLP_job, substituindo [YOUR_QUARANTINE_BUCKET] pelo nome correto do bucket. Essa função é acionada quando novos arquivos são enviados para o bucket de quarentena designado do Cloud Storage e cria um job do DLP para cada arquivo enviado:
gcloud functions deploy create_DLP_job --runtime python37 \ --trigger-event google.storage.object.finalize \ --trigger-resource [YOUR_QUARANTINE_BUCKET]
Em seguida, implante a função resolve_DLP, indicando nosso tópico como o gatilho dela. Essa função detecta a notificação do Pub/Sub iniciada pelo job de DLP subsequente da função acima. Assim que recebe a notificação do Pub/Sub, ele coleta os resultados do job da DLP e move o arquivo para o bucket sensível ou não sensível, conforme necessário:
gcloud functions deploy resolve_DLP --runtime python37 \ --trigger-topic classify-topic
Verificar
Verifique se as duas funções do Cloud foram implantadas com sucesso usando o comando gcloud functions describe:
gcloud functions describe create_DLP_job
gcloud functions describe resolve_DLP
A saída vai mostrar ACTIVE para o status quando a implantação for concluída.
6. Testar com dados de amostra
Com todas as partes no lugar, agora podemos testar com alguns arquivos de amostra. No Cloud Shell, mude o diretório de trabalho atual para sample_data:
cd ~/cloudshell_open/dlp-cloud-functions-tutorials/sample_data
Nossos arquivos de amostra consistem em arquivos txt e csv que contêm vários dados. Os arquivos com o prefixo "sample_s" contêm dados sensíveis, enquanto os com o prefixo "sample_n" não. Por exemplo, sample_s20.csv contém o que está formatado para parecer números da Previdência Social dos EUA:
sample_s20.csv
Name,SSN,metric 1,metric 2
Maria Johnson,284-73-5110,5,43
Tyler Parker,284-73-5110,8,17
Maria Johnson,284-73-5110,54,63
Maria Johnson,245-25-8698,53,19
Tyler Parker,475-15-8499,6,67
Maria Johnson,719-12-6560,75,83
Maria Johnson,616-69-3226,91,13
Tzvika Roberts,245-25-8698,94,61
Por outro lado, os dados em sample_n15.csv não seriam considerados sensíveis:
sample_n15.csv
record id,metric 1,metric 2,metric 3
1,59,93,100
2,53,13,17
3,59,67,53
4,52,93,34
5,14,22,88
6,18,88,3
7,32,49,5
8,93,46,14
Para ver como nossa configuração vai tratar os arquivos, vamos fazer upload de todos os arquivos de teste para a quarentena.
bucket:
gsutil -m cp * gs://[YOUR_QUARANTINE_BUCKET]
Inicialmente, os arquivos vão ficar no bucket de quarentena em que foram enviados. Para verificar isso, imediatamente após fazer upload dos arquivos, liste o conteúdo do bucket de quarentena:
gsutil ls gs://[YOUR_QUARANTINE_BUCKET]
Para conferir a série de eventos que iniciamos, navegue até a página do Cloud Functions:
Clique no menu "Ações" da função create_DLP_job e selecione "Ver registros":

No nosso registro dessa função, vemos pelo menos quatro entradas para cada um dos nossos arquivos, indicando:
- A execução da função foi iniciada
- A função foi acionada para um arquivo específico
- Um job foi criado
- A função terminou de ser executada

Quando a função "create_DLP_job" é concluída para cada arquivo, um job de DLP correspondente é iniciado. Acesse a página "Jobs da DLP" para conferir uma lista dos jobs da DLP na fila:
Você vai ver uma lista de jobs pendentes, em execução ou concluídos. Cada um deles corresponde a um dos arquivos que enviamos:

Clique no ID de qualquer um desses jobs para ver mais detalhes.
Se você voltar à página do Cloud Functions e verificar os registros da função resolve_DLP, verá pelo menos oito entradas para cada arquivo, indicando:
- A execução da função foi iniciada
- Uma notificação do Pub/Sub foi recebida
- O nome do job da DLP correspondente
- Um código de status
- O número de instâncias de dados sensíveis (se houver)
- O bucket para onde o arquivo será movido
- O job de DLP terminou de analisar o arquivo.
- A função terminou de ser executada

Assim que todas as chamadas para a função resolve_DLP forem concluídas, confira o conteúdo do bucket de quarentena novamente:
gsutil ls gs://[YOUR_QUARANTINE_BUCKET]
Desta vez, ele precisa estar completamente vazio. No entanto, se você executar o mesmo comando acima para os outros intervalos, vai encontrar nossos arquivos perfeitamente separados nos intervalos correspondentes.
7. Limpeza
Agora que já vimos como usar a API DLP com o Cloud Functions para classificar dados, vamos limpar nosso projeto de todos os recursos que criamos.
Excluir o projeto
Se preferir, exclua todo o projeto. No Console do GCP, acesse a página Cloud Resource Manager:
Na lista de projetos, selecione o projeto em que estamos trabalhando e clique em Excluir. Você precisará digitar o ID do projeto. Depois de fazer isso, clique em Desligar.
Outra opção é excluir todo o projeto diretamente no Cloud Shell com gcloud:
gcloud projects delete [PROJECT_ID]
Se preferir excluir os diferentes componentes um por um, siga para a próxima seção.
Cloud Functions
Exclua as duas funções do Cloud com o gcloud:
gcloud functions delete -q create_DLP_job && gcloud functions delete -q resolve_DLP
Buckets de armazenamento
Remova todos os arquivos enviados e exclua os buckets com o gsutil:
gsutil rm -r gs://[YOUR_QUARANTINE_BUCKET] \ gs://[YOUR_SENSITIVE_DATA_BUCKET] \ gs://[YOUR_NON_SENSITIVE_DATA_BUCKET]
Pub/Sub
Primeiro, exclua a assinatura do Pub/Sub com a gcloud:
gcloud pubsub subscriptions delete classify-sub
Por fim, exclua o tópico do Pub/Sub com gcloud:
gcloud pubsub topics delete classify-topic
8. Parabéns!
Uhu! Você conseguiu! Você aprendeu a usar a API DLP com o Cloud Functions para automatizar a classificação de arquivos.
O que aprendemos
- Criamos buckets do Cloud Storage para armazenar nossos dados sensíveis e não sensíveis.
- Criamos um tópico e uma assinatura do Pub/Sub para acionar uma função do Cloud.
- Criamos o Cloud Functions, projetado para iniciar um job de DLP que categoriza arquivos com base nos dados sensíveis contidos neles.
- Enviamos dados de teste e verificamos os registros do Stackdriver do Cloud Functions para ver o processo em ação.