← Security & Compliance

Arkhivio Backup Framework — Relatório de Conformidade LGPD

Data do documento: 2026  ·  Lei: Lei Geral de Proteção de Dados Pessoais — Lei nº 13.709/2018 (LGPD)  ·  Baseado em revisão de código-fonte

Escopo: Este relatório avalia o Arkhivio Backup Framework como ferramenta de processamento de dados para operações de backup de arquivos, à luz da Lei Geral de Proteção de Dados Pessoais (LGPD). A análise abrange exclusivamente controles técnicos e arquiteturais implementados no código. Políticas organizacionais, treinamento de equipe, avaliações de impacto (RIPD), contratos com operadores e nomeação do DPO (Encarregado) são responsabilidade da organização que opera o sistema. Este documento não constitui certificação legal de conformidade.

Resumo Executivo

8
Controles atendidos
por padrão
2
Configuração
necessária
3
Lacunas operacionais
(sem alteração de código)
2
Ações externas /
organizacionais
Veredicto: Capaz de conformidade com configuração operacional. O framework atende aos principais requisitos técnicos da LGPD relativos a segurança do tratamento, controle de acesso, integridade dos dados, criptografia em trânsito, minimização de dados e disponibilidade. As lacunas remanescentes — criptografia em repouso nos buckets S3, pipeline de monitoramento de incidentes, mapeamento de titulares e eliminação direcionada — não requerem alterações de código; são resolvidas por configuração de nuvem e procedimentos operacionais. A nomeação do Encarregado (DPO) e eventuais contratos com operadores complementam a camada jurídica.
Atendido Implementado no código, ativo por padrão
Configuração necessária Capacidade existe; deve ser habilitada via ambiente ou console de nuvem
Lacuna operacional Sem alteração de código; ação do operador necessária
Externo / Organizacional Fora do escopo da ferramenta; ação jurídica ou contratual
Como cada lacuna é resolvida:
OPS Procedimento operacional ou configuração de implantação — sem alteração de código
EXT Sistema externo, console de nuvem ou ação organizacional/jurídica
CODE Alteração dentro deste repositório

Princípios do Tratamento — Art. 6º

Minimização dos dados
Art. 6º, III — tratamento limitado ao mínimo necessário para suas finalidades
Atendido

O MongoDB armazena exclusivamente metadados dos arquivos (caminho, tamanho, data de modificação, CRC32) — nenhum conteúdo de arquivo é persistido no catálogo. A seleção de diretórios é configurável por job, com suporte a exclude_dirs validado em job_manager.py. Credenciais de acesso ao S3 são mascaradas em todas as respostas da API pela função _serialize_bucket() em main.py, que remove access_key e secret_key antes de retornar ao cliente.

Qualidade e integridade dos dados
Art. 6º, V — garantia de exatidão, clareza e atualização dos dados
Atendido

Checksum CRC32 calculado para cada arquivo no momento do scan (scanner.py), armazenado no MongoDB e gravado nos metadados do objeto S3 durante o upload (uploader.py). O módulo audit.py oferece três verificações independentes sob demanda: (1) existência do catálogo mais recente, (2) confronto do CRC32 no MongoDB versus metadado S3 sem baixar o arquivo, e (3) download aleatório com recomputação completa do CRC32. O reconciler.py detecta e corrige divergências entre MongoDB e S3.

Segurança do tratamento
Art. 6º, VII — medidas técnicas e administrativas para proteger os dados
Atendido

O framework implementa múltiplas camadas de segurança técnica: controle de acesso baseado em função (auth.py), criptografia simétrica Fernet para credenciais em repouso (crypto_utils.py), TLS 1.2+ com ECDHE para tráfego em trânsito (nginx), cookies de sessão assinados com HMAC-SHA256 (itsdangerous), execução em contêiner como usuário sem privilégios (appuser) e cabeçalhos HTTP de segurança (HSTS, X-Frame-Options, X-Content-Type-Options).

Não discriminação e transparência no acesso interno
Art. 6º, IX / Art. 9º — dados acessíveis de forma clara e adequada
Atendido

Todos os acessos e operações de escrita geram eventos de log estruturado com identificação do usuário autenticado (session["username"]), nome do recurso e timestamp UTC ISO-8601. O inventário files.json.gz publicado no S3 após cada execução lista todos os arquivos processados em formato JSON aberto, sem formato proprietário, possibilitando auditorias e análises externas.

Direitos do Titular — Arts. 17–22

Acesso e portabilidade dos dados
Art. 18, I e V — direito de acesso e portabilidade a outro fornecedor
Atendido

Cada arquivo copiado é um objeto bruto no S3 em caminho legível ({host}/{caminho/absoluto}), acessível com qualquer ferramenta S3-compatível sem necessidade do framework. O inventário files.json.gz lista todos os arquivos com caminho, tamanho, data de modificação e CRC32 em esquema JSON aberto. O módulo restore.py restaura arquivos com preservação de estrutura de diretórios ou em formato plano (--flat), atendendo ao requisito de portabilidade.

Eliminação dos dados (direito ao esquecimento)
Art. 18, VI — eliminação dos dados pessoais tratados com o consentimento
Lacuna operacional

A infraestrutura de eliminação existe e está testada: delete.py remove objetos do S3 e marca registros como excluídos no MongoDB com deleted_in_s3=True e timestamp de exclusão. A lacuna é procedimental, não técnica — o framework não possui mecanismo para localizar automaticamente todos os objetos pertencentes a um titular específico. A organização deve manter um mapeamento titular → caminhos de arquivo na camada de aplicação.

→ Resolvido por procedimento operacional OPS
  • Manter um registro titular→caminho na camada de aplicação: mapeie cada CPF/identificador do titular para os caminhos de arquivo de sua responsabilidade (ex.: diretório home, subdiretórios específicos).
  • Ao receber solicitação de eliminação: consulte o registro → passe a lista de caminhos para python delete.py --paths <arquivo> ou deleter.py programaticamente → confirme deleted_in_s3=True no MongoDB para cada registro.
  • Registre o evento de eliminação com identificador do titular, data da solicitação e lista de chaves S3 excluídas. A função log_event() em logger.py pode emitir este registro diretamente: log_event("eliminacao_titular", titular_id="…", paths=[…]).
  • Prazo: A LGPD não define prazo explícito para atendimento, mas a ANPD orienta que seja feito em tempo razoável, compatível com os 15 dias do Marco Civil. Documente o SLA interno.
Correção de dados incompletos, inexatos ou desatualizados
Art. 18, III — correção de dados pessoais
Atendido

O framework opera como espelho do sistema de origem: quando dados são corrigidos na fonte e o próximo backup é executado, o scanner detecta a alteração via mtime/tamanho e atualiza o registro no MongoDB, fazendo novo upload para o S3. O reconciler.py garante a consistência entre catálogo e armazenamento após qualquer ciclo de atualização.

Informação sobre compartilhamento
Art. 18, VII — informação sobre entidades com as quais os dados foram compartilhados
Lacuna operacional

O framework registra o destino S3 configurado por job (bucket, região, endpoint). Não há, porém, um relatório estruturado de compartilhamento de dados por titular gerado automaticamente — isso é um artefato de governança organizacional.

→ Resolvido por procedimento operacional OPS
  • Mapeie os destinos no RIPD (Relatório de Impacto à Proteção de Dados Pessoais): liste os provedores S3 utilizados (AWS, Cloudflare R2, MinIO etc.) e suas jurisdições como operadores de dados.
  • Para transferências internacionais: dados armazenados em regiões fora do Brasil requerem salvaguardas conforme o Art. 33 da LGPD (cláusulas contratuais padrão, consentimento ou decisão de adequação). Configure region do bucket para uma região dentro do Brasil quando disponível, ou documente a transferência internacional.
  • Use o log estruturado para rastrear qual job/bucket processou dados de quais titulares, combinado com o mapeamento titular→caminho.

Segurança e Prevenção — Arts. 46–49

Criptografia em trânsito
Art. 46 — medidas de segurança técnicas e administrativas
Atendido

Todo tráfego S3 utiliza HTTPS via boto3 (TLS 1.2+ imposto pelos endpoints AWS/Cloudflare). O dashboard web é servido via nginx com TLS 1.2+, cipher suites ECDHE, HSTS com max-age=63072000 (2 anos, preload), redirecionamento HTTP→HTTPS. A porta 8000 do uvicorn não é exposta ao host. Conexões MongoDB suportam TLS via MONGO_OPTIONS; o config.py emite aviso de startup se TLS estiver desabilitado em host não-local.

Criptografia em repouso
Art. 46 — proteção dos dados em armazenamento
Configuração necessária

Credenciais S3 armazenadas no MongoDB são criptografadas com Fernet AES-128-CBC + HMAC via crypto_utils.py — um comprometimento do banco de dados isoladamente não expõe o acesso ao armazenamento. A criptografia dos dados de backup em repouso é delegada ao bucket S3: SSE-KMS com chave gerenciada pelo cliente deve ser habilitado no bucket. Não é necessária nenhuma alteração no código do framework.

→ Resolvido por configuração externa / nuvem EXT
  • AWS S3: Console AWS → S3 → bucket → Propriedades → Criptografia padrão → Habilitar → SSE-KMS → selecionar ou criar uma CMK no AWS KMS. Alternativamente via CLI: aws s3api put-bucket-encryption --bucket <nome> --server-side-encryption-configuration '{"Rules":[{"ApplyServerSideEncryptionByDefault":{"SSEAlgorithm":"aws:kms","KMSMasterKeyID":"<arn>"},"BucketKeyEnabled":true}]}'
  • Cloudflare R2: Criptografia em repouso habilitada por padrão (AES-256). Nenhuma configuração adicional necessária.
  • MongoDB Atlas: Criptografia em repouso disponível em clusters M10+ via Atlas → Security → Advanced → Encryption at Rest.
  • MongoDB auto-hospedado: Habilite a criptografia WiredTiger no mongod.conf com security.enableEncryption: true e configure um servidor KMIP.
Controle de acesso e autenticação
Art. 46 / Art. 47 — segurança desde a concepção (privacy by design)
Atendido

O dashboard web implementa controle de acesso baseado em função: admin — CRUD completo em jobs e buckets; operador — leitura somente. Dois backends de autenticação: local com comparação temporalmente segura via secrets.compare_digest() (auth.py:121–130) e Active Directory com bind LDAP + consulta de grupo memberOf. A validação de startup em _validate_config() falha imediatamente se SESSION_SECRET, credenciais ou variáveis AD estiverem ausentes — o servidor não inicia em estado de segurança degradada.

Gestão de incidentes e comunicação à ANPD
Art. 48 — comunicação de incidente de segurança ao titular e à ANPD em prazo razoável
Lacuna operacional

O framework emite eventos de log estruturado para todas as anomalias detectáveis: divergência CRC32, inconsistência MongoDB/S3 (reconciler_mismatch), falhas de upload (upload_error), credenciais não encontradas (secret_fetch_failed), TLS desabilitado (mongo_tls_disabled). A lacuna é que nenhum pipeline de alerta está ativado por padrão — conectar o fluxo de logs a uma plataforma de monitoramento e definir runbooks de resposta a incidentes é uma etapa operacional.

→ Resolvido por configuração operacional OPS
  • Encaminhamento de logs: Defina LOG_FILE=/var/log/backup/backup.log no .env e configure um shipper (Filebeat, Fluent Bit, agente CloudWatch) para encaminhar ao SIEM. Guias passo a passo para ELK, Loki, Splunk e CloudWatch estão em LOG_INTEGRATION.md.
  • Regras de alerta: Use ALERTING.md como ponto de partida. Defina alertas de limiar nos eventos upload_error, reconciler_mismatch e falhas de autenticação repetidas — são os principais indicadores de um potencial incidente.
  • Monitoramento S3: Habilite AWS CloudTrail (data events) e S3 Access Logs no bucket. Alerte sobre chamadas DeleteObject ou GetObject fora dos principais IAM aprovados.
  • Runbook de comunicação: Elabore um procedimento de resposta a incidentes incluindo: detecção → avaliação → comunicação ao Encarregado (DPO) → notificação à ANPD (prazo razoável segundo a LGPD, geralmente interpretado como até 72 horas para casos graves) → comunicação aos titulares afetados.
Registros de auditoria
Art. 37 — manutenção de registro das operações de tratamento
Atendido

Todos os 6 endpoints de escrita (criar/atualizar/excluir jobs e buckets) emitem um evento de log nomeado audit_* com o usuário autenticado e o recurso afetado. O fluxo de logs cobre o ciclo completo das operações. Exemplo:

{"ts": "2026-05-10T14:32:07.441Z", "event": "audit_job_created", "user": "ana", "job": "backup-rh"}
{"ts": "2026-05-10T16:01:33.210Z", "event": "audit_job_deleted", "user": "carlos", "job_id": "srv01:antigo"}
{"ts": "2026-05-10T16:05:44.771Z", "event": "audit_bucket_created", "user": "ana", "bucket": "prod-br"}
{"ts": "2026-05-10T08:11:22.883Z", "event": "upload_complete", "job": "backup-rh", "files": 830}

Todos os timestamps são UTC ISO-8601. Nenhuma credencial ou chave é registrada nos logs. Logs podem ser encaminhados para armazenamento imutável (CloudWatch Logs, Splunk, S3) conforme documentado em LOG_INTEGRATION.md.

Responsabilidade e Prestação de Contas — Art. 50

Privacy by Design e Privacy by Default
Art. 46, §2º / Art. 50, §2º, I — proteção de dados desde a concepção e por padrão
Atendido

O design minimiza a superfície de exposição de dados pessoais por padrão: MongoDB armazena apenas metadados (sem conteúdo de arquivo); credenciais S3 são criptografadas em repouso antes de persistência; chave de criptografia pode ser mantida inteiramente fora do disco em 6 provedores de secrets (AWS SM, Azure KV, GCP, IBM, HashiCorp Vault, OpenBao); sessão expira automaticamente; servidores não iniciam em estado de segurança degradada. O timeout de sessão de 3.600 s é configurável via SESSION_TIMEOUT_SECONDS.

Encarregado (DPO) e Relatório de Impacto (RIPD)
Art. 41 / Art. 38 — indicação do encarregado e elaboração do RIPD
Externo / Organizacional

A nomeação do Encarregado (DPO) e a elaboração do Relatório de Impacto à Proteção de Dados Pessoais (RIPD) são obrigações organizacionais fora do escopo do framework. O sistema suporta o processo de elaboração do RIPD: audit.py --json gera evidências técnicas de integridade em formato estruturado, todos os avisos de configuração são eventos de log mensuráveis, e a documentação (SETUP.md, USER_MANUAL.md) descreve com precisão os controles implementados.

→ Resolvido por ação externa / organizacional EXT
  • Nomeação do Encarregado: Indique o DPO conforme o Art. 41 da LGPD. Para organizações de pequeno porte, a ANPD pode dispensar a obrigação — verifique a Resolução CD/ANPD nº 2/2022.
  • RIPD: Elabore o relatório mapeando as atividades de tratamento realizadas pelo framework: finalidade (backup de dados), base legal (legítimo interesse / execução de contrato), categorias de dados (metadados de arquivos, potencialmente dados pessoais nos caminhos), destinatários (provedores S3), retenção e medidas de segurança. Use a saída do audit.py --json como evidência de controles técnicos.
  • Transferência internacional: Se o bucket S3 estiver em região fora do Brasil, documente a transferência internacional conforme o Art. 33 da LGPD e as Resoluções da ANPD sobre transferências.
Contratos com operadores
Art. 39 — operadores devem realizar o tratamento conforme as instruções do controlador
Externo / Organizacional

O framework é Python auto-hospedado — nenhum contrato de operador é necessário com o software em si. Contratos de tratamento de dados devem ser celebrados com cada provedor de nuvem utilizado para armazenar dados pessoais: AWS (Data Processing Addendum), Cloudflare (DPA R2), MongoDB Atlas (DPA Atlas). Provedores brasileiros ou com sede no Brasil devem seguir a legislação nacional; provedores estrangeiros requerem cláusulas contratuais padrão conforme Art. 33, II da LGPD.

→ Resolvido por ação externa / jurídica EXT
  • AWS: Aceite o AWS Data Processing Addendum via Console AWS → Conta → Acordos → AWS DPA. Abrange S3, KMS e CloudWatch Logs utilizados pelo framework.
  • Cloudflare R2: Assine o Data Processing Addendum da Cloudflare via painel → Configurações da conta → Jurídico → DPA.
  • MongoDB Atlas: Solicite o Atlas DPA via console Atlas → Jurídico → Data Processing Agreement. Disponível para clusters M2+; M0 (gratuito) não é coberto.
  • MongoDB auto-hospedado: Nenhum DPA com fornecedor é necessário para software que você mesmo opera, mas verifique se o provedor de infraestrutura (ex.: AWS EC2, Azure VM) requer um.

Checklist de Configuração

Ações necessárias antes de uma implantação em produção que trate dados pessoais sob a LGPD.

#AçãoComo resolverOndeDispositivo
1 Habilitar SSE-KMS com chave gerenciada pelo cliente no bucket S3 EXT Console AWS / Cloudflare Art. 46
2 Habilitar TLS na conexão MongoDB (MONGO_OPTIONS=tls=true&tlsCAFile=…) OPS .env Art. 46
3 Armazenar BACKUP_SECRET_KEY e credenciais MongoDB em gerenciador de segredos. Definir SECRETS_PROVIDER no .env para ativar uma das 6 integrações nativas. OPS .env / provedor de segredos Art. 46 / Art. 47
4 Definir SESSION_TIMEOUT_SECONDS no .env (padrão 3.600 s; reduzir para 900 s em ambientes mais restritivos) OPS .env Art. 46
5 Habilitar S3 Object Lock (WORM) no bucket pelo período de retenção exigido EXT Console AWS / Cloudflare Art. 46
6 Encaminhar logs para armazenamento imutável (CloudWatch Logs, Splunk, Loki). Definir LOG_FILE no .env e configurar shipper conforme LOG_INTEGRATION.md. Definir retenção ≥ 5 anos. OPS .env / shipper de logs Art. 37 / Art. 46
7 Manter registro titular→caminho na camada de aplicação. Para solicitações de eliminação, passar caminhos ao delete.py e emitir log_event("eliminacao_titular", …). OPS Camada de aplicação Art. 18, VI
8 Conectar fluxo de logs a um SIEM e ativar regras de alerta conforme ALERTING.md. Habilitar CloudTrail e S3 Access Logs. Elaborar runbook de comunicação de incidente à ANPD. OPS SIEM / console AWS Art. 48
9 Assinar DPA (contrato de operador) com AWS, Cloudflare e/ou MongoDB Atlas EXT Jurídico / portais dos provedores Art. 39
10 Nomear Encarregado (DPO) e elaborar RIPD referenciando este relatório como evidência técnica EXT Organizacional Art. 41 / Art. 38

Pontos Fortes Arquiteturais para LGPD

CapacidadeComo suporta a LGPD
Objetos S3 simples — sem formato proprietárioA eliminação (Art. 18, VI) é um delete S3 direcionado; a portabilidade (Art. 18, V) é um download direto. Nenhuma conversão de formato ou ferramenta do fornecedor é necessária em nenhum momento.
Criptografia Fernet das credenciaisComprometimento isolado do MongoDB não expõe os dados S3. Chave de criptografia pode ser mantida em 6 gerenciadores de segredos externos, completamente fora do disco (Art. 46).
Dados mínimos no MongoDBApenas metadados (caminho, tamanho, mtime, CRC32) — nenhum conteúdo de arquivo armazenado no catálogo. Reduz a superfície de dados pessoais a nomes de caminho (Art. 6º, III — minimização).
Logs JSON estruturados com timestamps UTCAnalisáveis por máquina, diretamente ingeridos por qualquer SIEM. Imutáveis quando encaminhados. Suportam o dever de prestação de contas (Art. 6º, X — responsabilização).
Eventos de auditoria nomeados em todas as escritasaudit_job_created/updated/deleted e audit_bucket_created/updated/deleted registram ator, recurso e horário — evidência direta para o registro de operações de tratamento (Art. 37).
Validação fail-fast na inicialização_validate_config() em auth.py lança RuntimeError antes do servidor aceitar conexões se variáveis críticas estiverem ausentes — impede operação em estado de segurança degradada (Art. 46).
Auditoria de integridade em 3 camadasEvidência verificável e sob demanda de que os backups estão íntegros e recuperáveis. Saída JSON pode ser incorporada ao RIPD como evidência de controles técnicos (Art. 50).
Recuperação de emergência somente via S3Arquivos são objetos simples em caminhos legíveis. Nenhuma dependência do framework durante uma crise. Suporta disponibilidade e continuidade do tratamento (Art. 46, §1º).
Aviso importante: Este relatório é uma avaliação técnica produzida por análise automatizada do código-fonte, mapeada aos dispositivos da Lei nº 13.709/2018 (LGPD) e às orientações publicadas pela ANPD. Não constitui aconselhamento jurídico, auditoria formal de conformidade ou certificação. As determinações de conformidade devem ser validadas por um especialista jurídico e/ou de privacidade qualificado. A interpretação da LGPD pode variar conforme o setor, o porte da organização e as resoluções posteriores da ANPD.