Console Móvel do Operador
Um app móvel para SREs e equipes de compliance de iGaming — construído sobre Cloudflare Access, OpenBao SSH CA e YubiKey 5 NFC. Zero licenças do Teleport, zero novos serviços de caminho crítico, e trilha de auditoria GLI-33 / SIGAP / LGPD que chega ao Wazuh.
O Problema
Plantão às 03:00 a partir de um celular é a realidade de todo SRE de iGaming. O dashboard ajuda. Mas quando um PSP começa a devolver 502 no meio de um torneio, ou o geofence bloqueia um IP de navio de cruzeiro, o operador precisa de um shell de verdade — não de uma página de status. SSH de um notebook num posto de gasolina com a YubiKey dependurada no chaveiro não é um fluxo de trabalho: é uma vulnerabilidade.
Ao mesmo tempo, o regulador não tem paciência para romantismo operacional. SIGAP (Brasil), GLI-33, MGA Class 4, UKGC LCCP e LGPD fazem as mesmas três perguntas: quem autenticou, com qual fator, e o que fez? Um console móvel que não consiga responder isso num log forense é passivo regulatório, não ativo.
A resposta ingênua é comprar Teleport e seguir em frente. Essa resposta está errada na nossa escala (1–5 operadores, ≤ 3 hosts SSH) porque introduz uma nova dependência de caminho crítico, uma nova licença por usuário e duplica recursos que já rodam. A arquitetura desta página é o caminho que escolhemos.
O App em Cinco Telas
Construído com Expo (React Native) — o mesmo código TypeScript roda em iOS e Android. Telas capturadas no iPhone 17 (simulador iOS 26). Cada aba consome dados ao vivo de /api/v2/dash/* em new.acmetocasino.com atrás do Cloudflare Access; ações SSH passam pelo fluxo de CA SSH do OpenBao descrito abaixo. Os hostnames na aba Terminal foram redigidos.


/incidents/list com filtros e contagem de SLA.
/proc/stat, barra do pool do banco, Redis e Kafka.

Matriz de Decisão: Cloudflare Access vs Teleport
Dez critérios ponderados, pontuados de 1 (ruim) a 5 (excelente), contra os cinco caminhos viáveis: Teleport (spec original), Cloudflare Access + OpenBao SSH CA (vencedor), OpenBao + VPN, Tailscale, e "web móvel responsivo apenas".
| Critério | Peso | Teleport | CF + OpenBao | OpenBao + VPN | Tailscale | Só web móvel |
|---|---|---|---|---|---|---|
| Postura de segurança (FIDO2 + mTLS + curta duração) | 5 | 5 | 5 | 4 | 3 | 3 |
| Complexidade operacional (serviços a manter) | 4 | 2 | 4 | 4 | 4 | 5 |
| Aderência regulatória (GLI-33, MGA, SIGAP) | 5 | 5 | 4 | 4 | 3 | 4 |
| Encaixe no time (1–5 operadores) | 4 | 2 | 5 | 5 | 5 | 5 |
| Lock-in de fornecedor | 3 | 2 | 3 | 5 | 3 | 5 |
| Custo (licença + infra + esforço) | 4 | 2 | 5 | 5 | 4 | 5 |
| UX móvel (terminal, push, biometria) | 4 | 5 | 4 | 3 | 4 | 3 |
| Tempo até o primeiro release | 4 | 2 | 5 | 4 | 4 | 5 |
| Alinha com capítulos 20, 20b, 24h | 2 | 3 | 5 | 5 | 2 | 3 |
| Exposição a SPOF / lock-out | 4 | 2 | 3 | 5 | 3 | 4 |
| Total ponderado | 140 | 176 | 167 | 131 | 159 |
A opção B vence no total e em todos os critérios de "serviços a manter" e "tempo até release" — os que realmente importam em time pequeno.
Arquitetura
Tudo no diagrama a seguir já está (a) rodando hoje, ou (b) é uma pequena adição a algo que já existe. Nenhum novo serviço de control-plane é introduzido.
Cliente Móvel · iOS 16+ / Android 13+
Terminal XTerm.js embarcado em WebView endurecida.
Passkey atrelada ao device; chaves privadas nunca saem do elemento seguro.
Autenticador roaming FIDO2 via toque NFC para step-up resistente a phishing.
Cloudflare Edge · porteira Zero Trust
Motor de política à frente de cada origem. Deny-by-default.
- → OIDC via Google Workspace SSO
- → Política de chave hardware FIDO2 (YubiKey obrigatório)
- → Postura de device (versão do SO + cert mTLS)
api.example.com → Cloudflare Worker → origem PROD
ssh.example.com → Cloudflare Tunnel → LAN
LAN Local · VLAN de Ops
- • SSH CA (certs curtos de 15min)
- • Role PKI mobile
- • Selado em HSM em repouso
PKCS#11 · assinatura raiz · seal wrap
TrustedUserCAKeys valida certs assinados pelo OpenBao. Bastião de prod na VLAN de Ops.
auth.log + sessão sshd + auditd · Cloudflare Logpush (eventos Access).
Fluxo de Auth em 3 Camadas
O spec original listava cinco camadas. Três bastam para cobrir OWASP MASVS-AUTH-1/2 e GLI-33, e cada camada defende de um modelo de ameaça distinto.
1 · Passkey
Passkey destravada por biometria, atrelada ao Secure Enclave / StrongBox via expo-passkeys. Protege contra celular roubado + bloqueio fraco. Nunca sai do TEE.
2 · YubiKey + CF Access
O Cloudflare Access impõe política de chave de hardware FIDO2. Toque NFC da YubiKey 5 NFC gera a assertion; Google Workspace SSO traz a identidade. Resultado: JWT CF_Authorization de 8h.
3 · Certificado OpenBao
Para operações privilegiadas (SSH, drain, aprovar saque) o JWT é trocado no OpenBao por um certificado SSH de 15 minutos assinado pelo SSH CA. Cada sshd confia só nesse CA — sem authorized_keys por usuário.
Token da API Cloudflare — Escopos Exatos
Crie um único token de API, usado tanto pelo Worker do backend móvel quanto pelo pipeline de deploy. Cinco permissões, nada além:
| Escopo | Por quê |
|---|---|
| Account.Access: Apps and Policies — Edit | Criar / atualizar aplicações Access para os hostnames api e ssh. |
| Account.Cloudflare Tunnel — Edit | Criar e rotacionar credenciais do tunnel para o cloudflared no host de ops. |
| Zone.DNS — Edit | Gerenciar os CNAMEs que apontam para o hostname do tunnel. |
| Zone.Zone — Read | Buscar o zone id em tempo de deploy. |
| Account.Workers Scripts — Edit | Fazer deploy do Worker gateway da API móvel. |
Implementação em 5 Trechos
Cinco snippets que sustentam o design. Todos os tokens, IDs e hostnames são placeholders: substitua pelos seus antes de rodar.
Bootstrap do OpenBao SSH CA
Configuração do sshd nos alvos
Aplicação Cloudflare Access (Terraform)
cloudflared no host de ops
Cliente móvel — troca JWT por cert SSH
Mapa de Compliance
O que cada regulador pede, e qual peça do stack responde por isso.
| Regime | Controle | Quem responde |
|---|---|---|
| SIGAP (Brasil) | Autenticação de acesso privilegiado e registro de sessão | Log FIDO2 do CF Access + sessão sshd no Wazuh |
| GLI-33 | Operador nomeado, fator de hardware, trilha de auditoria | Identidade Google SSO + YubiKey + Wazuh |
| LGPD | Quem acessou PII, quando, com qual finalidade | CF Logpush → Wazuh + auditoria de aplicação em /api/v2/* |
| MGA Classe 4 | Custódia de chaves e credenciais de curta duração | OpenBao SSH CA (TTL 15min) selado por YubiHSM 2 |
| UKGC LCCP | Segregação de funções, privilégio mínimo | Políticas do CF Access por aplicação + roles do OpenBao |
| OWASP MASVS | AUTH-1/2, NETWORK-1/2, STORAGE-1 | Passkey + mTLS + cert pinning + MMKV encriptado |
Comparativo de Custo
Conta de padaria anualizada para um time de 5 operadores. "Confirmar com o fornecedor" vale para qualquer número de terceiros abaixo — são a ordem de grandeza correta, não cotações atualizadas.
| Linha | CF + OpenBao | Teleport (Team) |
|---|---|---|
| Licenças de control-plane | R$ 0 — CF Zero Trust gratuito ≤ 50 assentos | Por usuário ao mês (confirmar com fornecedor) |
| Serviços self-hosted | OpenBao já rodando | Auth + Proxy + agents + Device Trust |
| YubiKey 5 NFC × 5 | ~R$ 1.500 uma vez | ~R$ 1.500 uma vez |
| App móvel (Expo EAS) | US$ 99/mês plano team | US$ 99/mês plano team |
| Esforço de engenharia (setup) | 10–14 homem-dias | 15–20 homem-dias + upgrades contínuos |
| Custo de migração se abandonado | Baixo — OpenBao e CF usam padrões abertos | Alto — RBAC + gravações vivem no Teleport |
Resumo do Stack
YubiKey 5 NFC · YubiHSM 2 · iPhone Secure Enclave / Android StrongBox
Cloudflare Access · Google Workspace SSO · OpenBao (SSH CA + PKI) · cloudflared
React Native · Expo SDK 51 · TypeScript · Zustand · TanStack Query · XTerm.js · MMKV
Wazuh SIEM · Cloudflare Logpush · log de sessão sshd · auditd
Cloudflare Workers (API móvel) · Cloudflare Tunnel · Cloudflare WAF
Expo Push → FCM + APNs · bypass de alerta crítico em canais de incidente
Leia o Capítulo Completo
Esta página é um resumo de arquitetura. A decisão completa, análise de gaps, rollout em fases, registro de riscos e runbooks estão no livro.