Classificação automatizada de dados enviados ao Cloud Storage com a API DLP e o Cloud Functions

1. Visão geral

Na organização moderna, há uma quantidade cada vez maior de dados provenientes de diversas fontes. Com frequência, isso requer colocar em quarentena e classificar os dados para armazená-los e protegê-los estrategicamente, uma tarefa que rapidamente se tornará cara e impossível se permanecer manual.

Neste codelab, veremos como classificar automaticamente os dados enviados ao Cloud Storage e movê-los para um bucket de armazenamento correspondente. Para isso, usaremos o Cloud Pub/Sub, o Cloud Functions, o Cloud Data Loss Prevention e o Cloud Storage.

Atividades deste laboratório

  • Criar buckets do Cloud Storage a serem usados como parte do pipeline de quarentena e classificação.
  • Criar uma função simples do Cloud que invoca a API DLP quando os arquivos são enviados.
  • Criar um tópico e uma assinatura do Pub/Sub para notificá-lo quando o processamento do arquivo for concluído.
  • Fazer upload de arquivos de amostra no 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 do Google Cloud com o faturamento configurado. Se não tiver, você vai precisar criar uma.

2. Etapas da configuração

Neste codelab, vamos provisionar e gerenciar diferentes recursos e serviços de nuvem usando a linha de comando com o Cloud Shell. O comando a seguir vai abrir o Cloud Shell junto com o Cloud Shell Editor e clonar o repositório do projeto complementar:

Verifique se você está usando o projeto correto, definindo-o com gcloud config set project [PROJECT_ID]

Ativar APIs

Ative as APIs necessárias no projeto do Google Cloud:

  • API Cloud Functions: gerencia funções leves fornecidas pelo usuário e executadas em resposta a eventos.
  • API Cloud Data Loss Prevention (DLP): oferece métodos para detecção, análise de risco e desidentificação de fragmentos 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 de contas de serviço

Uma conta de serviço é um tipo especial de conta usado 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 projeto do Cloud em nome dos apps em execução no App Engine. Essa conta de serviço existe no seu projeto por padrão com o papel de Editor atribuído.

Primeiro, vamos conceder à conta de serviço o papel de administrador de DLP necessário 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 vai conceder à conta de serviço permissões 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 de DLP

Além da conta de serviço do App Engine, também usaremos uma conta de serviço de DLP. Essa conta de serviço foi criada automaticamente quando a API DLP foi ativada e, inicialmente, não tem papéis. Vamos conceder a ela o papel 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, precisamos criar três buckets do Cloud Storage para armazenar nossos dados:

  • Bucket de quarentena: primeiro, o upload dos nossos dados será feito aqui.
  • Bucket de dados confidenciais: os dados que a API DLP determina como confidenciais serão movidos para este local.
  • Bucket de dados não confidenciais: os dados determinados pela API DLP que não são sensíveis serão movidos para este local

É possível 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 fornece muitas a muitas mensagens assíncronas entre aplicativos. Um editor cria uma mensagem e a publica em um feed de mensagens chamado tópico. Um assinante recebe essas mensagens como uma assinatura. Com base nessa assinatura, no nosso caso, uma função do Cloud moverá os arquivos para os respectivos buckets após a execução de um job de DLP.

Primeiro, vamos criar um tópico. Uma mensagem será publicada aqui sempre que um arquivo for adicionado ao bucket de armazenamento em quarentena. Vamos chamá-lo de "classify-topic"

gcloud pubsub topics create classify-topic

Uma assinatura será notificada 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 acionará uma segunda função do Cloud que iniciará um job de DLP que inspecionará o arquivo e o moverá para o local adequado.

5. Cloud Functions

O Cloud Functions nos permite implantar funções leves, assíncronas e baseadas em eventos de finalidade única, sem a necessidade de 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 criarmos nossas funções, precisamos substituir algumas variáveis no arquivo main.py.

No editor do Cloud Shell, ajuste o main.py substituindo os valores do ID do projeto e as variáveis do bucket nas linhas 28 a 34 usando os 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 do Pub/Sub 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, altere os diretórios para gcs-dlp-classification-python onde está o arquivo main.py:

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. Esta função é acionada quando novos arquivos são enviados para o bucket de quarentena do Cloud Storage designado e cria um job de 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 para ele. Essa função detecta a notificação do Pub/Sub iniciada no job de DLP subsequente da função acima. Assim que recebe a notificação do Pub/Sub, ele coleta os resultados do job do DLP e move o arquivo para o bucket confidencial ou não confidencial da maneira adequada:

gcloud functions deploy resolve_DLP --runtime python37 \
--trigger-topic classify-topic

Verificar

Verifique se as duas funções do Cloud foram implantadas com o comando gcloud functions describe:

gcloud functions describe create_DLP_job
gcloud functions describe resolve_DLP

A saída lerá ACTIVE para o status quando a implantação tiver sido bem-sucedida.

6. Testar com dados de amostra

Com todas as partes no lugar, agora podemos fazer alguns testes 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 com vários dados. Os arquivos com o prefixo "sample_s" vão conter dados sensíveis, e aquelas com o prefixo "sample_n" não. Por exemplo, sample_s20.csv contém o que é formatado para se parecer com números de 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 no 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 saber como a configuração tratará os arquivos, vamos fazer upload de todos os arquivos de teste para a quarentena

bucket:

gsutil -m cp * gs://[YOUR_QUARANTINE_BUCKET]

Inicialmente, nossos arquivos ficam no bucket de quarentena onde foram enviados. Para verificar isso, liste o conteúdo do bucket em quarentena imediatamente após o upload dos arquivos:

gsutil ls gs://[YOUR_QUARANTINE_BUCKET]

Para conferir a série de eventos que iniciamos, comece navegando até a página do Cloud Functions:

Clique no menu "Ações" para a função create_DLP_job e selecione "Ver registros":

89211a959bf30392.png

No registro dessa função, há pelo menos quatro entradas para cada um dos arquivos, o que indica:

  • 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 executar

c864dff5a03c75a9.png

Depois que a função create_DLP_job for concluída para cada arquivo, um job de DLP correspondente será iniciado. Acesse a página "Jobs de DLP" para ver uma lista dos jobs de DLP na fila:

Você verá uma lista de jobs pendentes, em execução ou concluídos. Cada um deles corresponde a um dos arquivos que enviamos:

6af34e72ecb83faf.png

Você pode clicar 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 8 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 do DLP correspondente
  • Um código de status
  • o número de instâncias de dados sensíveis (se houver)
  • O bucket para o qual o arquivo será movido
  • O job de DLP terminou de analisar o arquivo
  • A função terminou de executar

5025bd672cba90a0.png

Assim que todas as chamadas para a função resolve_DLP forem concluídas, verifique novamente o conteúdo do bucket em quarentena:

gsutil ls gs://[YOUR_QUARANTINE_BUCKET]

Desta vez, ele deve estar completamente vazio. No entanto, se você executar o mesmo comando acima para os outros buckets, vai encontrar nossos arquivos perfeitamente separados nos respectivos buckets.

7. Limpeza

Agora que vimos como usar a API DLP com o Cloud Functions para classificar dados, vamos limpar todos os recursos criados no nosso projeto.

Excluir o projeto

Se preferir, exclua o projeto inteiro. 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.

Como alternativa, é possível excluir todo o projeto diretamente no Cloud Shell com a gcloud:

gcloud projects delete [PROJECT_ID]

Se preferir excluir os diferentes componentes um por um, prossiga para a próxima seção.

Cloud Functions

Exclua as duas funções do Cloud com a 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 a 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 a 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 confidenciais contidos neles
  • Fizemos o upload dos dados de teste e conferimos as funções Registros do Stackdriver para ver o processo em ação