Skip to content

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-07-19. Para reportar uma vulnerabilidade, escreva para security@telecomtowerpower.com.br ou abra um advisory privado em github.com/danielnovais-tech/TELECOM-TOWER-POWER/security/advisories.

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 (S3 — backups) SSE-S3 (AES-256) no bucket de backups frios (sa-east-1, conta dedicada)
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: em transição — o AWS Cognito Hosted-UI foi descomissionado junto com a infraestrutura AWS; a substituição (Keycloak/Auth0) é rastreada publicamente na issue #405. Autenticação atual: API keys por tenant + MFA TOTP (step-up) nas rotas admin
  • SAML 2.0: indisponível durante a transição de SSO
  • IDOR mitigado: toda query filtra por tenant_id antes de retornar
  • Audit log: cada ação tenant é registrada (/tenant/audit), retenção 12 meses

Retenção e segregação de dados

  • Dados de torres (140.498 registros ANATEL + OpenCelliD): públicos, não sensíveis
  • Logs de API: retidos 6 meses, depois purgados
  • Audit log: 12 meses
  • Backups Postgres: 14 dias em S3 com lifecycle policy
  • 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; bcrypt para hashes; 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; 12 alert rules; PagerDuty critical-only
SSRF Allowlist de hosts em /bedrock/*; URL validation no signup

Backups e continuidade

  • Postgres → S3 (sa-east-1, conta dedicada de backups — único uso AWS remanescente): dumps noturnos via GitHub Actions (retenção 35 dias) + horários via cron Railway (retenção 7 dias)
  • Restore drill verificado toda segunda 07:15 UTC: container Postgres efêmero, assertions de row-count em towers, api_keys, alembic_version
  • Workflow: 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
Amazon Web Services Legado em decomissionamento: backups frios S3 apenas (sem tráfego primário desde 2026-06) 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 privacy@telecomtowerpower.com.br
  • SOC 2: framework de controles documentado em Compliance/SOC 2. Auditoria Type I em planejamento para 2026-Q4. Não somos certificados ainda — o framework é interno e auditável.
  • ISO 27001: não certificados. Não há plano de curto prazo. Práticas alinhadas ao Anexo A documentadas nas políticas SOC 2.
  • PCI DSS: não armazenamos dados de cartão. Stripe é o processador (PCI Level 1).

SBOM (Software Bill of Materials)

Geramos um SBOM público 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: baixe o run mais recente em Actions → SBOM.
  • 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:

  • Snap ANATEL por prestadora (snap_anatel.py): coordenadas de torres alinhadas por SMP/SME individual (Vivo, Claro, TIM, Algar, Sercomtel etc.), em vez de centroide agregado. Reduz erro de localização em áreas urbanas densas.
  • Modelo ML retrainado contra RSSI real: ridge-v1 com 17 features (SRTM, Fresnel, terrain roughness), RMSE de 12.94 dB em n=20 000 amostras, supera baseline Hata físico-puro. Retrain noturno em CI, hot-pull do S3 no boot.
  • 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é 50 000 receptores.
  • 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 WISPs / ISPs regionais / consultorias RF que querem pagar pelo dado já curado em vez de subir um Atoll.

Vulnerability disclosure

Limitações conhecidas

Honestidade técnica:

  • Bus factor: equipe pequena. Mitigação: código em escrow contratual nos planos Enterprise/Ultra; runbook público em Operações/Runbook; backups automatizados verificados semanalmente.
  • Sem certificações externas hoje (SOC 2, ISO 27001). Compensamos com transparência: políticas, runbooks, drills e arquitetura são públicos.
  • 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 sa-east-1 — a transferência internacional se dá nos termos do Art. 33 LGPD (ver DPA §8). 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). Nosso ICP (WISPs, ISPs regionais, consultoria RF) tipicamente não tem essa restrição.

Hardening recente (2026-Q2)

Item Detalhes
Snapping ANATEL por prestadora snap_anatel.py recalcula coordenadas por SMP/SME provider, melhorando precisão por operadora em áreas urbanas densas
Modelo ML retreinado com RSSI real ridge-v1, RMSE 12.94 dB, n=20.000 amostras, 17 features (SRTM, Fresnel ratio, terrain roughness); supera baseline Hata físico-puro
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