Classificação e controle de acesso a dados sensíveis em Data Lake no GCP
Tags: bigquery, dataflow, lgpd, ptbr
Published: 2021-01-29 13:32:54

# Introdução

## Contexto

Vivemos em tempos onde dados valem ouro e são inúmeras as ferramentas, plataformas e tecnologias para a produção e gerenciamento de grandes quantidades de dados. Porém, também vivemos em tempos onde a responsabilidade sobre a propriedade de um determinado dado vem sendo levada cada vez mais em consideração haja visto avanços em leis de proteção de dados como LGPD e GDPR trazendo mais alguns desafios para quem cuida de repositórios de dados (Data Lake).

É importante ressaltar que não existe uma bala de prata, ou seja, não existe uma única solução para suportar questões de leis de proteção de dados à repositórios de dados, sendo assim, recomenda-se considerar tais leis ao conceber ou adequar uma solução de gerenciamento e armazenamento de dados de larga escala. 

Mais especificamente no Brasil, a Lei Geral de Proteção de Dados - LGPD contempla os seguintes princípios: finalidade, adequação, necessidade, livre acesso, qualidade dos dados, transparência, segurança, prevenção, não discriminação, responsabilização e prestação de contas. Dentre estes importantes princípios, neste artigo, praticaremos principalmente:

* **Segurança**: utilização de medidas técnicas e administrativas aptas a proteger os dados pessoais de acessos não autorizados e de situações acidentais ou ilícitas de destruição, perda, alteração, comunicação ou difusão;
* **Prevenção**: adoção de medidas para prevenir a ocorrência de danos em virtude do tratamento de dados pessoais;

## Glossário

Nesse artigo exploraremos uma solução onde teremos produção, processamento, classificação, restrição e verificação de exposição de dados. Para isso, utilizaremos as seguintes ferramentas oferecidas pela Google Cloud Platform - Plataforma de Cloud do Google (GCP):

* [Pub/Sub](https://cloud.google.com/pubsub/docs): Serviço de mensagens gerenciado, permite a comunicação entre produtores e consumidores de forma independente.
* [Dataflow](https://cloud.google.com/dataflow/docs): Serviço gerenciado para processamento de dados (stream e batch).
* [BigQuery](https://cloud.google.com/bigquery/docs): Serviço gerenciado de data warehouse analítico.
* [Data Catalog](https://cloud.google.com/data-catalog/docs): Serviço de gerenciamento de metadados que permite acesso, descoberta e compreensão fácil de dados.
* [Data Loss Prevention](https://cloud.google.com/dlp/docs) - Prevenção contra perda de dados (DLP): Serviço que fornece uma plataforma de inspeção, classificação e desidentificação de dados sensíveis.
* [Cloud SDK](https://cloud.google.com/sdk/docs/quickstart): Conjunto de ferramentas para gerenciar recursos do GCP, por exemplo comandos: `gcloud` e `bq`.

## Solução-exemplo

### Diagrama

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/opop3eb314g7t7y1aaju.png)

1. Eventos (JSON) serão publicados em um tópico do Pub/Sub.
2. Tais eventos serão processados por uma pipeline do Dataflow que irá persistir os dados no BigQuery.
3. Serão realizadas consultas aos dados no BigQuery.
4. Realizaremos verificações para levantar possíveis exposições de dados sensíveis utilizando Data Catalog e Data Loss Prevention.

### Implementação

#### Requisitos

A fim de garantir a correta execução dos comandos seguintes, certifique-se de:
* Possuir `gcloud` instalado, caso contrário clique [aqui](https://cloud.google.com/sdk/docs/quickstart).
* Possuir um projeto GCP (`your_project_id`) , caso contrário clique aqui.
* Que o projeto GCP possua as seguintes APIs habilitadas: [API Pub/Sub](https://console.cloud.google.com/flows/enableapi?apiid=pubsub.googleapis.com), [API Data Catalog](https://console.cloud.google.com/flows/enableapi?apiid=datacatalog.googleapis.com&redirect=https%3A%2F%2Fconsole.cloud.google.com&hl=pt-br&_ga=2.123281611.1101498027.1601408812-1411173193.1601056852), [API BigQuery](https://console.cloud.google.com/flows/enableapi?apiid=bigquery.googleapis.com&redirect=https%3A%2F%2Fconsole.cloud.google.com&hl=pt-br&_ga=2.123281611.1101498027.1601408812-1411173193.1601056852) e [API Data Loss Prevention](https://console.cloud.google.com/flows/enableapi?apiid=dlp.googleapis.com&redirect=https%3A%2F%2Fconsole.cloud.google.com&hl=pt-br&_ga=2.123281611.1101498027.1601408812-1411173193.1601056852).
* Preferencialmente possuir a permissão `Proprietário`.

Configure o `gcloud` para utilizar seu projeto:

```
gcloud config set project your_project_id
```

#### Produzindo eventos

Para produção de eventos vamos publicar mensagens em formato JSON em um tópico do PubSub, para isso vamos:

* Criar o tópico **test-input-topic**:
```
gcloud pubsub topics create test-input-topic
```

* Criar a inscrição **test-input-subscription**:
```
gcloud pubsub subscriptions create test-input-subscription --topic=test-input-topic
```

* Enviar um evento em formato JSON:
```
gcloud pubsub topics publish test-input-topic --message "{\"id\":2, \"nome\": \"Mary\", \"idade\": 2, \"email\": \"mary@email.com\"}"
```

#### Classificando dados sensíveis

* Acesse [Data Catalog - Tags de política](https://console.cloud.google.com/datacatalog/taxonomies?hl=pt-br) no console
* Clique em `Criar`
* Em `Nome da Taxonomia` preencha `Dados sensíveis de usuário`
* Em `Tags de política/Nome da tag` de política preencha `Idade`
* Clique em `Salvar`
* Copie o ID da tag gerada, ela segue o seguinte padrão:
```
projects/your_project_id/locations/us/taxonomies/taxonomy_id/policyTags/tag_id
```
* Ative o check `Aplicar controle de acesso`
* Clique em `ATIVAR CONTROLE DE ACESSO`

#### Criando tabelas

* Criar conjunto de dados (dataset):
```
bq mk test_dataset
```
* Criar tabela:
```
echo '[
    {"name": "id", "type": "INTEGER"},
    {"name": "nome", "type": "STRING"},
    {"name": "email", "type": "STRING"},
    {
        "name": "idade", 
        "type": "INTEGER",
        "policyTags": {
            "names": ["projects/your_project_id/locations/us/taxonomies/taxonomy_id/policyTags/tag_id"]
        }
    }
]' > schema.json
```
```
bq mk -t test_dataset.test_table schema.json
```

#### Processando dados

```
gcloud dataflow jobs run test-pipeline \
--parameters inputSubscription=projects/your_project_id/subscriptions/test-input-subscription,outputTableSpec=your_project_id:test_dataset.test_table \
--gcs-location gs://dataflow-templates-us-central1/latest/PubSub_Subscription_to_BigQuery
```

#### Consultando dados

Ao executar o comando:

```
bq query --nouse_legacy_sql 'SELECT * from `your_project_id.test_dataset.test_table`'
```

É esperado receber um erro contendo a seguinte mensagem: 

```
BigQuery: User does not have permission to access policy tag "Dados sensíveis de usuário : Idade" on column your_project_id.test_dataset.test_table.idade.
```

O erro apresentado acontece pois o usuário utilizado, mesmo que proprietário do projeto, não possui permissão de acesso à tag `Dados sensíveis de usuário : Idade`. Para acessar as informações que não possuem restrição, basta especificar as colunas desejadas, por exemplo:

```
bq query --nouse_legacy_sql 'SELECT id, nome, email from `your_project_id.test_dataset.test_table`'
```

Vamos adicionar a permissão para seu usuário e executar novamente a consulta inicial:

1. Acesse [Data Catalog - Tags de política](https://console.cloud.google.com/datacatalog/taxonomies?hl=pt-br) no console
2. Selecione a tag `Dados sensíveis de usuário`
3. Clique em `MOSTRAR PAINEL DE INFORMAÇÕES` do lado superior direito, se houver
4. Clique botão `ADICIONAR MEMBRO`
5. No campo `Novos Membros`, digite seu email, o mesmo utilizado da conta GCP
6. Em `Selecionar Papel` selecione `Catálogo de dados` > `Leitor de controle refinado`
7. Clique em `SALVAR`
8. Do terminal, agora será possível realizar a consulta e ler a coluna idade:
```
bq query --nouse_legacy_sql 'SELECT * from `your_project_id.test_dataset.test_table`'
```

#### Verificando exposição de dados sensíveis

Até aqui, trabalhamos com dados controlados e com um esquema de dados previamente construído para classificar uma coluna como sensível. Porém esse cenário didático e portanto mais simples, pode não refletir a realidade de um Data Lake que muitas vezes conta com: uma massa grande de eventos distintos, com esquemas e conteúdos diferentes, com colunas dinamicamente criadas e muitos outros casos que naturalmente não são suportados pela dinâmica previamente estabelecida.

* Acesse o painel de [DLP - Prevenção contra perda de dados](https://console.cloud.google.com/security/dlp?hl=pt-br) no console.
* Preencha ID do job com: `inspecao-dados-sensiveis`
* Em `Tipo de armazenamento` selecione BigQuery
* Preencha:
  * `ID do projeto` com seu projeto: `your_project_id`
  * `ID do conjunto de dados`: `test_dataset`
  * `ID da tabela`: `test_table`
* Na seção `Campos excluídos`, preencha o campo com `idade`
* Clique em `CONTINUAR`
* Por fins de custos, vamos restringir a inspeção somente a emails expostos, clique em `GERENCIAR INFOTYPES`
* Selecione somente `EMAIL_ADDRESS` e clique em `CONCLUÍDO`
* Novamente clique em `CONTINUAR`
* Selecione `Publicar no Catálogo de dados`
* Clique em `CONTINUAR`
* Clique em `Criar` e aguarde a execução da inspeção
* Acesse [Data Catalog](https://console.cloud.google.com/datacatalog?hl=pt-br) no console
* No campo de busca, pesquise por `test_table`
* Selecione o respectivo registro: 
```
test_table 
Dataset: test_dataset
```
* Ao verificar o relatório da inspeção realizada, podemos constatar que foi localizado um campo do tipo `EMAIL_ADDRESS` (`InfoType EMAIL_ADDRESS count: 1`).

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/fb9ppd9olg48qqjf262o.png)

Essa é uma forma de inspecionar os dados em busca de informações sensíveis, lembrando que no exemplo, por fins de custos, utilizamos somente o tipo de identificador `EMAIL_ADDRESS`, porém existem mais de 140 tipos diferentes de identificadores pré-definidos, além da opção de criar identificadores customizáveis, usando por exemplo, expressões regulares (regex).

#### Indo além

Uma vez cientes dos recursos oferecidos pela tríade BigQuery, Data Catalog e DLP, abrem-se oportunidades de explorar cenários mais amplos e ricos. Existem, por exemplo, cenários de identificação e aplicação automática de tags no banco de dados: [How to Create Data Catalog tags by inspecting all your BigQuery data with Cloud Data Loss Prevention](https://towardsdatascience.com/bigquery-pii-and-cloud-data-loss-prevention-dlp-take-it-to-the-next-level-with-data-catalog-c47c31bcf677).

## Pontos Principais

* Se possível, trabalhar com mensagens ou eventos que não contenham dados sensíveis de usuários, por exemplo: ao invés de usar email, usar o ID.
* Caso seja necessário a utilização de dados sensíveis, restringir e controlar o acesso.
* Considerar casos de pedidos de remoção de dados na solução, por exemplo: centralizar dados sensíveis em tabelas-chaves e utilizar referências para tais registros em outras tabelas. Assim, em caso de pedido de remoção, basta alterar a tabela-chave.
* Se possível, programar inspeções em busca de dados sensíveis, por exemplo: [Programando uma verificação de inspeção do Cloud DLP](https://cloud.google.com/dlp/docs/quickstart-create-job-trigger?hl=pt_br).
* Considerar leis de proteção de dados no desenho da solução de backup.

## Conclusão

Ao avaliar quais ferramentas e mesma quais funcionalidades farão parte de uma solução, é altamente recomendado o levantamento de custos previamente. Para isso o GCP oferece uma [calculadora](https://cloud.google.com/products/calculator) muito útil. Passamos por diversas ferramentas, porém não usufruímos de todos as funcionalidades disponíveis na plataforma, entre essas, um exemplo que vale ser citado e que pode ser muito útil é a utilização do Data Loss Prevention para desidentificar determinado dado sensível, [por exemplo](https://cloud.google.com/dlp/docs/deidentify-sensitive-data?hl=pt_br#replaceconfig):

* Converter: `Meu endereço de email é mail@test.com`
* Para: `Meu endereço de email é [email-address]`

Além do permissionamento refinado por tags, utilizado na solução-exemplo, também existe a possibilidade de restrição de acesso mais granular, por conjunto de dados (datasets) e tabelas. Por fim, mas não menos importante, grande parte do provisionamento e das configurações dos recursos utilizados podem ser realizadas através de ferramentas de infraestrutura-como-código como [Terraform](https://registry.terraform.io/providers/hashicorp/google/latest/docs).