Data Masking - C-Suite
Visão Geral
Este documento descreve o sistema de data masking para proteger dados sensíveis (PII - Personally Identifiable Information) em logs, respostas de API e outros contextos onde dados não devem ser expostos.
Módulo de Data Masking
Localização
O módulo principal está em: common_data_masking.py (raiz do projeto)
Características
- Mascaramento de PII: Emails, telefones, CPF, CNPJ, cartões de crédito
- Mascaramento genérico: Strings, valores sensíveis
- Recursivo: Processa objetos, dicts e listas
- Configurável: Campos a mascarar customizáveis
- Middleware: Mascaramento automático em respostas
- Logging: Função específica para mascarar dados antes de logar
Uso Básico
1. Mascarar Dados Específicos
from common_data_masking import mask_email, mask_phone, mask_cpf, mask_cnpj
# Email
masked_email = mask_email("user@example.com")
# Resultado: "us***@example.com"
# Telefone
masked_phone = mask_phone("11987654321")
# Resultado: "*******4321"
# CPF
masked_cpf = mask_cpf("12345678901")
# Resultado: "***.***.***-01"
# CNPJ
masked_cnpj = mask_cnpj("12345678000190")
# Resultado: "**.***.***/0001-90"
2. Mascarar Objetos Completos
from common_data_masking import mask_data
user_data = {
"email": "user@example.com",
"phone": "11987654321",
"cpf": "12345678901",
"name": "John Doe",
"address": "123 Main St"
}
masked = mask_data(user_data)
# Resultado:
# {
# "email": "us***@example.com",
# "phone": "*******4321",
# "cpf": "***.***.***-01",
# "name": "John Doe", # Não mascarado (não está na lista padrão)
# "address": "123 Main St" # Não mascarado
# }
3. Campos Customizados
from common_data_masking import mask_data
# Mascarar campos específicos
data = {
"email": "user@example.com",
"custom_field": "sensitive_value"
}
masked = mask_data(data, fields_to_mask=["email", "custom_field"])
# Resultado:
# {
# "email": "us***@example.com",
# "custom_field": "se**********ue"
# }
4. Mascarar em Logs
from common_logging import get_logger
from common_data_masking import mask_log_data
logger = get_logger(__name__)
user_data = {
"email": "user@example.com",
"phone": "11987654321",
"name": "John Doe"
}
# Mascara dados antes de logar
logger.info("User data", extra=mask_log_data(user_data))
# Log mostrará: {"email": "us***@example.com", "phone": "*******4321", "name": "John Doe"}
5. Middleware para Respostas
from fastapi import FastAPI
from common_data_masking import create_masking_middleware
app = FastAPI()
# Adiciona middleware para mascarar dados em respostas
app.middleware("http")(create_masking_middleware(
mask_response=True,
fields_to_mask=["email", "phone", "cpf"] # Campos a mascarar
))
@app.get("/api/user")
async def get_user():
return {
"email": "user@example.com",
"phone": "11987654321",
"name": "John Doe"
}
# Resposta será mascarada automaticamente
Campos Padrão Mascarados
Os seguintes campos são mascarados automaticamente:
- email - Email do usuário
- phone, telefone - Telefone
- cpf - CPF
- cnpj - CNPJ
- credit_card, card_number - Cartão de crédito
- password, senha - Senha
- token, secret, api_key, access_token - Tokens e secrets
- ssn - Social Security Number
- passport - Passaporte
- driver_license - Carteira de motorista
Padrões de Mascaramento
- Mantém 2 caracteres antes do @
- Resto mascarado com
* - Exemplo:
user@example.com→us***@example.com
Telefone
- Mantém últimos 4 dígitos
- Resto mascarado com
* - Exemplo:
11987654321→*******4321
CPF
- Mantém últimos 2 dígitos
- Formato preservado
- Exemplo:
12345678901→***.***.***-01
CNPJ
- Mantém últimos 2 dígitos
- Formato preservado
- Exemplo:
12345678000190→**.***.***/0001-90
Cartão de Crédito
- Mantém últimos 4 dígitos
- Formato em grupos de 4
- Exemplo:
1234567890123456→**** **** **** 3456
String Genérica
- Mantém 2 caracteres no início e 2 no fim
- Resto mascarado com
* - Exemplo:
sensitive_data→se**********ta
Integração com Logging
from common_logging import get_logger, setup_logging
from common_data_masking import mask_log_data
setup_logging(app_name="my-app")
logger = get_logger(__name__)
# Dados sensíveis
user_data = {
"email": "user@example.com",
"phone": "11987654321",
"password": "secret123" # Nunca logar senhas!
}
# Mascara antes de logar
logger.info("User created", extra=mask_log_data(user_data))
Integração com Audit Log
from common_audit import audit_log
from common_data_masking import mask_data
def create_user(user_data: dict):
# Cria usuário
user = db.create_user(user_data)
# Loga ação com dados mascarados
audit_log(
action="user_created",
user_id=str(user.id),
details=mask_data(user_data) # Mascara dados sensíveis
)
return user
Integração com Respostas de API
Opção 1: Middleware Global
from common_data_masking import create_masking_middleware
app.middleware("http")(create_masking_middleware(
mask_response=True,
fields_to_mask=["email", "phone", "cpf"]
))
Opção 2: Por Endpoint
from common_data_masking import mask_data
@app.get("/api/user")
async def get_user():
user = db.get_user(user_id)
# Mascara dados antes de retornar
return mask_data(user.to_dict())
Opção 3: Pydantic Model
from pydantic import BaseModel, field_validator
from common_data_masking import mask_email, mask_phone
class UserResponse(BaseModel):
email: str
phone: str
name: str
@field_validator('email')
def mask_email_field(cls, v):
return mask_email(v)
@field_validator('phone')
def mask_phone_field(cls, v):
return mask_phone(v)
Boas Práticas
- Sempre mascare PII em logs: Nunca logue emails, telefones, CPF sem mascarar
- Nunca logue senhas: Use
***MASKED***ou não logue - Mascare em respostas públicas: APIs públicas devem mascarar PII
- Mascare em audit logs: Dados sensíveis em audit logs devem ser mascarados
- Configure campos apropriados: Adicione campos específicos do seu domínio
- Teste mascaramento: Certifique-se de que dados estão sendo mascarados corretamente
Conformidade
LGPD (Lei Geral de Proteção de Dados)
- ✅ Mascaramento de dados pessoais em logs
- ✅ Mascaramento em respostas de API
- ✅ Proteção de dados sensíveis
GDPR
- ✅ Mascaramento de PII
- ✅ Redução de exposição de dados pessoais
Troubleshooting
Dados não estão sendo mascarados
- Verifique se campo está na lista
fields_to_mask - Verifique se middleware está configurado corretamente
- Verifique se função
mask_data()está sendo chamada
Mascaramento muito agressivo
- Ajuste lista de
fields_to_mask - Use
mask_all=Falsepara mascarar apenas campos especificados - Configure campos específicos por endpoint
Performance
- Mascaramento é rápido, mas evite em loops muito grandes
- Considere cachear resultados se necessário
- Use middleware apenas quando necessário
Próximos Passos
- ✅ Módulo de data masking criado
- ⏳ Integrar em todos os apps
- ⏳ Configurar middleware em endpoints públicos
- ⏳ Adicionar campos específicos do domínio
- ⏳ Testar mascaramento em todos os contextos
- ⏳ Documentar campos específicos por app