Data Masking

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

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:

Padrões de Mascaramento

Email

Telefone

CPF

CNPJ

Cartão de Crédito

String Genérica

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

  1. Sempre mascare PII em logs: Nunca logue emails, telefones, CPF sem mascarar
  2. Nunca logue senhas: Use ***MASKED*** ou não logue
  3. Mascare em respostas públicas: APIs públicas devem mascarar PII
  4. Mascare em audit logs: Dados sensíveis em audit logs devem ser mascarados
  5. Configure campos apropriados: Adicione campos específicos do seu domínio
  6. Teste mascaramento: Certifique-se de que dados estão sendo mascarados corretamente

Conformidade

LGPD (Lei Geral de Proteção de Dados)

GDPR

Troubleshooting

Dados não estão sendo mascarados

  1. Verifique se campo está na lista fields_to_mask
  2. Verifique se middleware está configurado corretamente
  3. Verifique se função mask_data() está sendo chamada

Mascaramento muito agressivo

  1. Ajuste lista de fields_to_mask
  2. Use mask_all=False para mascarar apenas campos especificados
  3. Configure campos específicos por endpoint

Performance

  1. Mascaramento é rápido, mas evite em loops muito grandes
  2. Considere cachear resultados se necessário
  3. Use middleware apenas quando necessário

Próximos Passos

  1. ✅ Módulo de data masking criado
  2. ⏳ Integrar em todos os apps
  3. ⏳ Configurar middleware em endpoints públicos
  4. ⏳ Adicionar campos específicos do domínio
  5. ⏳ Testar mascaramento em todos os contextos
  6. ⏳ Documentar campos específicos por app

🔊 Text-to-Speech

1.0x
1.0
Pronto para reproduzir