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.
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.
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.
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).
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.
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.
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.
python delete.py --paths <arquivo> ou deleter.py programaticamente → confirme deleted_in_s3=True no MongoDB para cada registro.log_event() em logger.py pode emitir este registro diretamente: log_event("eliminacao_titular", titular_id="…", paths=[…]).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.
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.
region do bucket para uma região dentro do Brasil quando disponível, ou documente a transferência internacional.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.
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.
aws s3api put-bucket-encryption --bucket <nome> --server-side-encryption-configuration '{"Rules":[{"ApplyServerSideEncryptionByDefault":{"SSEAlgorithm":"aws:kms","KMSMasterKeyID":"<arn>"},"BucketKeyEnabled":true}]}'mongod.conf com security.enableEncryption: true e configure um servidor KMIP.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.
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.
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.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.DeleteObject ou GetObject fora dos principais IAM aprovados.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:
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.
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.
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.
audit.py --json como evidência de controles técnicos.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.
Ações necessárias antes de uma implantação em produção que trate dados pessoais sob a LGPD.
| # | Ação | Como resolver | Onde | Dispositivo |
|---|---|---|---|---|
| 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 |
| Capacidade | Como suporta a LGPD |
|---|---|
| Objetos S3 simples — sem formato proprietário | A 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 credenciais | Comprometimento 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 MongoDB | Apenas 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 UTC | Analisá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 escritas | audit_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 camadas | Evidê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 S3 | Arquivos 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º). |