Este projeto sobe um laboratório local para demonstrar LGPD com:
Trino 480com plugin doRangerApache Ranger 2.8.0SQL Server 2022PostgreSQL 16MongoDB 7
O foco do ambiente é mostrar:
- autenticação no Trino
- autorização no Ranger
column masking,redact,nullifyehash- diferenças entre dados pessoais, dados pessoais sensíveis e identificadores técnicos
Papel de cada peça:
Trino: autentica quem entra e executa as queriesRanger: autoriza o que esse usuário pode fazer- bancos de dados: guardam os dados reais
Em uma frase:
- o
Trinoresponde "quem é você?" - o
Rangerresponde "o que você pode ver ou fazer?"
Criar um usuário no Ranger não cria automaticamente um login no Trino. O Ranger usa usuários e grupos para políticas. O Trino precisa de um mecanismo próprio de autenticação para aceitar a conexão.
Serviços:
aula-trinoaula-rangeraula-ranger-dbaula-ranger-solraula-sqlserveraula-postgres-labaula-mongodb
Catálogos já registrados no Trino:
sqlserverpostgresqlmongodb
docker compose up -d
docker compose ps
docker compose logs -f ranger trino sqlserver-init postgres-lab mongodb- Trino HTTPS:
https://localhost:8443 - Ranger UI:
http://localhost:6080/login.jsp - Solr:
http://localhost:8983 - SQL Server:
localhost:1433 - PostgreSQL do laboratório:
localhost:5433 - MongoDB do laboratório:
localhost:27017
Credenciais padrão do Ranger:
- usuário:
admin - senha:
rangerR0cks!
Banco: aula_masking
Schema: demo
Tabela: clientes
Colunas úteis para demo:
nomeemailcpfsalariocidade
Boas candidates para políticas:
cpf:RedactouHashemail:Show First 4salario:Nullify
Arquivo de seed:
Banco: lgpd_workshop
Schema: demo
Tabelas:
colaboradorestransacoes_cartao
Campos para demo em colaboradores:
cpftelefonesalariodata_nascimentoconta_bancariadiagnostico_cidobservacao_rh
Campos para demo em transacoes_cartao:
email_faturacpf_portadorcartao_tokenultimos4ip_compra
Boas candidates para políticas:
conta_bancaria:Redactdiagnostico_cid:Nullifycartao_token:Hashcpf_portador:HashouRedact
Arquivo de seed:
Database: lgpd_workshop
Collections:
paciente_eventosleads_privacidade
Campos para demo em paciente_eventos:
emailcpftelefoneplano_saudebiometria_hashgeolocalizacaoprontuario_resumo
Campos para demo em leads_privacidade:
emailtelefonerenda_mensaldocumentoenderecoip_origemdevice_id
Boas candidates para políticas:
prontuario_resumo:Nullifygeolocalizacao:Redactdocumento:Hashemail:Show First 4
Arquivo de seed:
Hoje o Trino está configurado com autenticação por arquivo de senha:
- configuração:
trino/etc/password-authenticator.properties - arquivo de credenciais:
trino/etc/password.db
O Trino aceita a conexão e valida a senha. Depois disso, o Ranger avalia as políticas para aquele nome de usuário.
Se você já tem htpasswd instalado localmente, rode dentro de trino/etc:
htpasswd -B -C 10 password.db mateuzaoEsse comando:
- adiciona o usuário
mateuzao - grava a senha com
bcrypt - não recria o arquivo porque não usa
-c
Se você não tiver htpasswd instalado localmente:
docker run --rm -it -v "$PWD/trino/etc:/work" httpd:2.4-alpine \
htpasswd -B -C 10 /work/password.db mateuzaoDepois de alterar o arquivo de senhas:
docker compose restart trinoAbra um shell no contêiner:
docker exec -it aula-trino trino \
--server https://localhost:8443 \
--user professor \
--password \
--insecureExemplos:
SHOW CATALOGS;
SHOW SCHEMAS FROM sqlserver;
SHOW TABLES FROM sqlserver.demo;
SELECT * FROM sqlserver.demo.clientes;
SHOW SCHEMAS FROM postgresql;
SHOW TABLES FROM postgresql.demo;
SELECT nome, conta_bancaria, diagnostico_cid
FROM postgresql.demo.colaboradores;
SHOW SCHEMAS FROM mongodb;
SHOW TABLES FROM mongodb.lgpd_workshop;
SELECT nome, cpf, prontuario_resumo
FROM mongodb.lgpd_workshop.paciente_eventos;Configuração mínima:
- host:
localhost - port:
8443 - user: um usuário presente em
trino/etc/password.db - password: a senha desse usuário
- SSL: ligado
SSLVerification:NONEpor causa do certificado self-signed do laboratório
No Ranger:
Access ManagerAdd New Service- tipo
Trino - crie o serviço com:
- Service Name:
trino-aula - Display Name:
trino-aula - Username: em branco
- Password: em branco
Esse nome precisa bater com:
O Trino:
- recebe a conexão
- valida a senha
- associa a sessão a um usuário, por exemplo
professor
O Ranger:
- vê que a sessão está como
professor - decide se
professorpode executar query - decide se
professorpode atuar como esseTrino User - decide se
professorpode fazerselect - decide se alguma coluna precisa ser mascarada
Criar professor no Ranger significa:
- o Ranger conhece esse nome
- você pode fazer policy para esse nome
Isso não significa:
- que o Trino vai autenticar
professor - que a senha de
professorexiste no Trino
Para o login funcionar, o usuário precisa existir no mecanismo de autenticação do Trino. Neste lab, isso quer dizer: ele precisa estar em trino/etc/password.db.
No plugin Ranger para Trino, executar query exige pelo menos estas duas permissões básicas:
Query ID = *comexecuteTrino User = {o próprio usuário}comimpersonate
Mesmo quando o usuário entra como professor, o Ranger ainda exige a autorização:
professorpode atuar comoprofessor
Isso parece redundante, mas é assim que o modelo do plugin foi desenhado: a identidade efetiva do Trino User também precisa ser autorizada.
Exemplo para professor.
- Resource:
Query ID - Valor:
* - User:
professor - Permission:
execute
- Resource:
Trino User - Valor:
professor - User:
professor - Permission:
impersonate
- Catalog:
sqlserver - Schema:
demo - Table:
clientes - Column:
* - User:
professor - Permission:
select
- Catalog:
postgresql - Schema:
demo - Table:
colaboradores - Column:
* - User:
professor - Permission:
select
- Catalog:
mongodb - Schema:
lgpd_workshop - Table:
paciente_eventos - Column:
* - User:
professor - Permission:
select
Se você quiser navegar melhor por ferramentas como DBeaver, normalmente vale liberar também:
- Catalog:
system - Schema:
jdbc - Table:
* - Permission:
select
e, se necessário:
- Catalog:
mongodb - Schema:
lgpd_workshop - Table:
leads_privacidade - Permission:
select
Objetivo:
- ver os dados completos
Policies:
executeimpersonateselectnas tabelas alvo
Objetivo:
- ver dados protegidos
Policies:
- mesmas permissões mínimas de query
selectnas tabelas alvo- masking por coluna
Exemplo de combinação boa:
- SQL Server
clientes.cpf:Redact - SQL Server
clientes.email:Show First 4 - SQL Server
clientes.salario:Nullify - PostgreSQL
colaboradores.conta_bancaria:Redact - PostgreSQL
colaboradores.diagnostico_cid:Nullify - PostgreSQL
transacoes_cartao.cartao_token:Hash - MongoDB
paciente_eventos.prontuario_resumo:Nullify - MongoDB
leads_privacidade.documento:Hash
docker-compose.ymltrino/etc/config.propertiestrino/etc/password-authenticator.propertiestrino/etc/password.dbtrino/etc/access-control.propertiestrino/etc/catalog/sqlserver.propertiestrino/etc/catalog/postgresql.propertiestrino/etc/catalog/mongodb.propertiessqlserver/init/schema.sqlpostgres/init/01-schema.sqlmongodb/init/01-seed.js
- o
ranger-dbusa a porta5432; por isso o PostgreSQL do laboratório foi exposto em5433 - o certificado do Trino é self-signed, então clientes gráficos precisam aceitar esse cenário
- os scripts de
initdo Postgres e do MongoDB rodam na criação inicial do volume; se quiser recriar do zero, remova os volumes e suba novamente
Fontes oficiais:
- Trino authentication types: https://trino.io/docs/current/security/authentication-types.html
- Trino password file authentication: https://trino.io/docs/current/security/password-file.html
- Trino Ranger access control: https://trino.io/docs/current/security/ranger-access-control.html
- Trino MongoDB connector: https://trino.io/docs/current/connector/mongodb.html