Skip to content

Not translated yet

This page has no English version yet — you are reading the Portuguese original. Open it on the Portuguese site or ask for a translation.

Segurança

Esta página descreve as práticas de segurança em produção da TELECOM TOWER POWER. É um documento factual, não promocional: descreve o que está implementado hoje, e o que está no roadmap.

Última revisão: 2026-11-03. Para reportar uma vulnerabilidade, escreva para security@telecomtowerpower.com.br.

Criptografia

Camada Implementação
Em trânsito TLS 1.2+ no edge Cloudflare e nos endpoints Railway; HSTS habilitado em todos os domínios *.telecomtowerpower.com.br
Em repouso (Postgres) Postgres gerenciado Railway; volumes criptografados em repouso pelo provedor (SOC 2 Type II)
Em repouso (backups) Dumps do Postgres no MinIO da Railway e no espelho fora da Railway (Backblaze B2). Na B2, cifragem em repouso SSE-B2 (AES-256) para os arquivos enviados desde 11/10/2026; os anteriores saem até 13/11/2026. Os dumps não são cifrados por nós antes do envio
Em repouso (Redis) Redis gerenciado Railway (volumes criptografados pelo provedor)
Segredos Variáveis de ambiente Railway + GitHub Actions secrets; nunca committados; sem SSM/KMS desde o decomissionamento AWS

Autenticação e autorização

  • API keys por tenant (verify_api_key), com fallback Bearer JWT para SSO
  • SSO/OIDC: login corporativo por OIDC (Keycloak, Microsoft Entra ID, Okta, Google Workspace), desligado em produção e ligado por contrato. O login em andamento viaja num cookie selado, com PKCE, e nenhuma chave é alcançada ou criada por um e-mail que o provedor de identidade não verificou. Um teste de ponta a ponta contra um Keycloak real roda toda semana. O AWS Cognito Hosted-UI foi descomissionado junto com a infraestrutura AWS. Autenticação atual: API keys por tenant + MFA TOTP (step-up) nas rotas admin
  • SAML 2.0: indisponível hoje
  • IDOR mitigado: toda query filtra por tenant_id antes de retornar
  • Audit log: cada ação tenant é registrada (/tenant/audit); retenção de 365 dias para ações de segurança (chave de API, login e SSO, ações administrativas) e 90 dias para as demais

Retenção e segregação de dados

  • Dados de torres (179.344 registros ANATEL + OpenCelliD em 10/10/2026): públicos, não sensíveis
  • Registros de acesso à API (data e hora UTC, IP de origem, hash da chave de API, rota, método e código de resposta de cada requisição; sem corpo nem User-Agent): 6 meses, como exige o Marco Civil (Art. 15), desde 19/10/2026. Ficam no Postgres de produção, sob sigilo: nenhuma rota da API os lê, só o operador os consulta, com credencial própria, e cada consulta fica no audit_log. A gravação nunca atrasa nem derruba a requisição; um expurgo diário apaga o que tem mais de 6 meses, e há alerta se a gravação ou o expurgo falharem ou pararem. Entrega só por ordem judicial (Art. 15, §§1º e 3º). Ver Privacidade
  • Audit log: 365 dias para ações de segurança (emissão, revogação e rotação de chave de API, login e SSO, ações administrativas); 90 dias para as demais
  • Backups Postgres: 7 dias (horários) e 14 dias (diários) no MinIO da Railway; 30 dias no espelho Backblaze B2
  • Dados de uso por tenant: isolados em tenant_id em todas as tabelas; sem cross-tenant queries
  • Não coletamos dados pessoais de usuários finais. Os "receivers" em batch reports são endereços/coordenadas, não pessoas

OWASP Top 10 — controles ativos

Risco Mitigação
Injection SQLAlchemy parametrizado em 100% das queries; nenhum f-string SQL
Broken access control / IDOR Filtro tenant_id obrigatório em handlers; verificado em testes de integração
Cryptographic failures TLS 1.2+ everywhere; vocabulário criptográfico nomeado (auth/crypto_primitives.py): fingerprints de segredo por HMAC-SHA256 com pepper, HKDF-SHA256 para chaves derivadas, MAC com comparação em tempo constante e scrypt (memory-hard) para os códigos de recuperação MFA guardados em repouso; rotação trimestral de chaves
Insecure design Rate limiting per-IP no signup; per-tenant nas rotas autenticadas
Security misconfiguration Cabeçalhos de segurança no Caddy; CORS restritivo; CSP em /portal
Vulnerable components pip-audit + Dependabot semanal; CI bloqueia merge em high/critical
Auth failures Lockout após 5 tentativas; logging de signin via audit_log
Data integrity Webhooks Stripe verificados por assinatura; SSO state validado
Logging & monitoring Prometheus + Loki + Tempo; regras de alerta Prometheus → Alertmanager → Slack (send_resolved=true); PagerDuty e o webhook de NOC de operadora só entram na configuração quando as credenciais estão definidas, inertes por padrão (Confiabilidade)
SSRF Allowlist de hosts em /bedrock/*; URL validation no signup

Backups e continuidade

  • Postgres → MinIO na Railway: dumps noturnos via GitHub Actions (retenção de 14 dias) + horários via cron Railway (retenção de 7 dias)
  • Espelho fora da Railway na Backblaze B2 (us-east-005): cada dump (retenção de 30 dias) e o arquivamento contínuo de WAL do PITR (pgBackRest, 4 fulls semanais)
  • Restore drill verificado toda segunda 07:15 UTC: container Postgres efêmero, assertions de row-count em towers, api_keys, alembic_version
  • Workflow: .github/workflows/backup-restore-drill.yml
  • Detalhes de RTO/RPO: ver Confiabilidade

Sub-processadores

Vendor Função Região
Railway (hospedagem primária) API, workers, Postgres, Redis, MinIO, observabilidade, LLM self-hosted (Ollama) us-west2 (EUA) — Railway não oferece região Brasil
Backblaze B2 Cópia de segurança fora da Railway: espelho dos dumps e repositório do PITR us-east-005 (EUA)
Amazon Web Services Conta encerrada em 11/10/2026: a AWS apaga as cópias antigas de backup (S3) até 10/01/2027 sa-east-1 (São Paulo)
Cloudflare DNS, CDN, WAF, Turnstile (anti-abuse no signup) Edge global
Zoho Mail E-mail corporativo do domínio (MX, SPF/DKIM) US
Stripe Cobrança e webhooks EU + US (PCI DSS Level 1)
GitHub Repositório, Actions, container registry US

Lista completa e DPA disponíveis sob NDA para clientes Business+.

Compliance

  • LGPD: política de privacidade pública em Privacidade; DPO designado; processo de exercício de direitos via dpo@telecomtowerpower.com.br
  • SOC 2: não há auditoria nem certificação. Questionário de segurança sob pedido em security@telecomtowerpower.com.br.
  • ISO 27001: não certificados. Não há plano de curto prazo.
  • PCI DSS: não armazenamos dados de cartão. Stripe é o processador (PCI Level 1).

SBOM (Software Bill of Materials)

Geramos um SBOM da aplicação e de todo o conjunto de dependências Python, nos formatos SPDX e CycloneDX, via Syft no CI (.github/workflows/sbom.yml).

  • Regenerado a cada push em main que altere dependências ou Dockerfile, e semanalmente (drift de dependências transitivas).
  • Publicado como artefato do workflow (sbom), retenção de 90 dias.
  • Clientes Business+ podem solicitar o SBOM assinado sob NDA via security@telecomtowerpower.com.br.

Endurecimento recente (2026-Q2)

Mudanças concretas em produção neste trimestre:

  • Modelo de cobertura calibrado com medidas reais: /coverage/predict responde com a cadeia ITU-R P.1812/P.1411 + resíduo LightGBM, treinada com 124.309 medições reais de drive-test, agregadas em 76.139 pontos, em Brasília, com validação cruzada espacial e banda conformal de 90 %. A troca de artefato passa por PR e merge humano; o ridge-v1 ficou só como fallback. Números ao vivo em GET /coverage/claim-readiness; método em Validação do modelo.
  • Fila prioritária Enterprise: fila RQ/Redis dedicada com prioridade por tier (a fila SQS+Lambda foi aposentada com o decomissionamento AWS); lote de até 10 000 receptores (50 000 no Ultra).
  • Hardening LGPD/OWASP: rate limit per-IP no signup (parser tolerante a unlimited|0|off), filtro tenant_id obrigatório em handlers (mitigação IDOR), audit log em todas as ações tenant.

Limite honesto: 100% dos dados são públicos (ANATEL/OpenCelliD) e o stack roda em nuvem externa (Railway, EUA). Esta é uma escolha consciente — torna o produto inadequado para operações Tier-1 que exigem segregação on-premises de dados de engenharia, e adequado para laudistas, licenciadoras e integradores de rádio que querem o dado público já curado e a soma entre operadoras feita.

Vulnerability disclosure

Limitações conhecidas

Honestidade técnica:

  • Bus factor: equipe pequena. Mitigação: escrow de código como cláusula opcional de contrato Enterprise/Ultra (sem agente de escrow contratado hoje); runbook operacional interno; backups automatizados verificados semanalmente.
  • Sem certificações externas hoje (SOC 2, ISO 27001). Runbooks e resultados de drills são internos e ficam disponíveis sob pedido em security@telecomtowerpower.com.br. O que é público e verificável ao vivo: GET /platform/maturity e a página de status.
  • Processamento primário nos EUA (Railway us-west2). Railway não oferece região Brasil/América do Sul: a oferta SaaS multi-tenant não garante residência de dados no Brasil — a transferência internacional se dá nos termos do Art. 33 LGPD (ver o DPA §8, disponível sob pedido em dpo@telecomtowerpower.com.br). Tenants com requisito estrito de residência BR: usar o modo on-prem/self-hosted (docker-compose.onprem.yml + LICENSE-PERPETUAL.md).
  • Dados em nuvem externa: por design, todos os cálculos rodam na infraestrutura Railway (não no perímetro do cliente). Para operações Tier-1 com requisito de segregação total de dados de planejamento RF, esta arquitetura é inadequada — use Atoll, Planet ou CelPlan on-premise (ou o nosso modo on-prem). Os nossos compradores (laudistas, licenciadoras e integradores de rádio) tipicamente não têm essa restrição.

Hardening recente (2026-Q2)

Item Detalhes
Modelo de cobertura calibrado com medidas reais cadeia ITU-R P.1812/P.1411 + resíduo LightGBM, treinada com medições reais de drive-test (CV espacial, banda conformal de 90 %; corpus e números na seção «Endurecimento recente», acima); ridge-v1 só como fallback; verificação ao vivo em GET /coverage/claim-readiness
Fila prioritária Enterprise fila RQ/Redis dedicada com prioridade por tier para batch reports (SQS+Lambda aposentados no decomissionamento AWS)
Rate limiting per-IP no signup proteção anti-abuse antes de Turnstile; configurável via SIGNUP_FREE_RATE_LIMIT_PER_HOUR
Audit + restore drill semanal container Postgres efêmero, assertions de row-count em towers, api_keys, alembic_version