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_idantes 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_idem 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
mainque altere dependências ouDockerfile, 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), filtrotenant_idobrigató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¶
- Email: security@telecomtowerpower.com.br
- GPG: chave pública em /.well-known/security.txt
- SLA inicial de resposta: 48 h úteis
- Não rodamos bug bounty pago atualmente; oferecemos Hall of Fame público para divulgações responsáveis
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 |