Monitoramento seguro
em nuvem.
Arquitetura, implementação e operação de um painel de observabilidade com Oracle Cloud Infrastructure, Linux, Python, SQLite e Cloudflare Zero Trust.
Arquitetura de referência
Fluxo lógico de acesso remoto, autenticado e sem publicação da porta HTTP local.
Resumo executivo
Foi implantado um painel web para observabilidade de tráfego e segurança, com execução em uma máquina virtual de pequeno porte na Oracle Cloud Infrastructure (OCI). A coleta e a apresentação de dados utilizam Python, SQLite e agendamentos do systemd. O acesso remoto ocorre por Cloudflare Tunnel, com autenticação e autorização no Cloudflare Access.
A solução foi concebida para manter a aplicação escutando apenas em 127.0.0.1, sem liberar a porta HTTP no perímetro da nuvem. A prova funcional incluiu a conexão do túnel, a publicação HTTPS, a exigência de login em sessão privada e a abertura do painel após autenticação autorizada.
IMPORTANTE Posteriormente houve um evento Cloudflare Error 1033. A causa raiz e a recuperação não foram comprovadas no conjunto de evidências analisado; portanto, a disponibilidade contínua não é declarada como validada.
Objetivos e critérios de sucesso
Arquitetura de referência
Borda Cloudflare Access Autenticação e política de acesso por identidade
Conectividade Cloudflare Tunnel / cloudflared Conexão iniciada de dentro da VM para a borda
Computação OCI + Oracle Linux Hospedagem do conector e do painel
Aplicação Python + HTTP local Visualização dos indicadores
Persistência SQLite Armazenamento leve de séries e eventos
Agendamento systemd services/timers Coleta e atualização automatizadas
FLUXO LÓGICO Navegador → Cloudflare Access → Cloudflare Tunnel → VM Linux → aplicação local → base SQLite.
Fronteiras de confiança
O navegador é uma origem não confiável; a borda Cloudflare executa a avaliação de identidade. O túnel faz o encaminhamento ao host de origem; o host deve continuar protegido por permissões locais, atualização de software e restrição de escuta. Cloudflare Access não substitui segurança de aplicação, gestão de segredos, backup ou monitoramento da VM.
Perfil técnico do ambiente
Item Condição documentada
Forma da VM VM.Standard.E2.1.Micro (AMD x86_64), 1 OCPU e 1 GB RAM
Sistema operacional Oracle Linux 9.x
Memória de troca Swap configurada de aproximadamente 2,5 GB
Dashboard Serviço Python sob systemd; HTTP em loopback
Banco de dados SQLite local
Coleta Rotinas automatizadas com timers systemd
Túnel Conector cloudflared com uma réplica ativa observada
Publicação Hostname HTTPS personalizado, omitido nesta edição
Controle de acesso Política Allow restrita a e-mail autorizado
Decisões de projeto e trade-offs
picos de memória.
disponibilidade do conector.
separadamente.
Evidências e nível de confiança
A tabela distingue observações feitas durante a implantação de testes que ainda precisam ser executados. Os valores abaixo são registros pontuais, não uma medição de SLA.
Controle / teste Evidência registrada Situação
Conector Túnel íntegro, 1 réplica ativa; versão do cloudflared Validado pontualmente
exibida
Transporte Quatro localidades de borda e conexões do túnel Validado pontualmente
observadas
Aplicação Dashboard carregado pelo hostname HTTPS Validado pontualmente
Autenticação Sessão privada solicitou autenticação Validado
Autorização Identidade permitida acessou o painel Validado
Negação de acesso Identidade não autorizada bloqueada Pendente
Resiliência Recuperação automática após falha do túnel Pendente
Disponibilidade Ausência de falhas por janela prolongada Não demonstrado
Indicadores ilustrativos observados no painel
A captura de validação exibiu contadores de solicitações, tráfego, bytes em cache, classes HTTP (2xx, 3xx, 4xx e 5xx), distribuição horária, códigos específicos e países de origem. Em uma janela exibida no teste, houve 1.474 solicitações, 24,47 MB de tráfego e 34,3% de eficiência de cache por bytes. Esses números são uma fotografia da interface, não uma tendência consolidada.
INTERPRETAÇÃO Uma taxa elevada de respostas 4xx requer classificação por URL, origem, regra de segurança e contexto. Não significa, por si só, ataque confirmado nem indisponibilidade da aplicação.
Segurança aplicada e lacunas
Controle Estado / observação
Exposição HTTP Painel em 127.0.0.1; não abrir porta de entrada na VCN
Transporte externo Acesso por hostname HTTPS na Cloudflare
Identidade Aplicação auto-hospedada com regra Allow por e-mail
Segredos Tokens não incluídos neste documento
Menor privilégio Recomendado executar aplicação e coletor com usuário dedicado
Auditoria Recomendado manter logs do Access, túnel e serviços
Proteção da origem SSH restrito; hardening e atualização planejada
Modelo de ameaça resumido
Risco Mitigação / ação
Token do túnel exposto Armazenar como segredo; rotacionar ao suspeitar de vazamento
Acesso indevido Allow mínimo; MFA; testar negação com outra identidade
Falha do conector systemd restart, logs, alerta de integridade e runbook
Exaustão de RAM Acompanhar OOM, swap e memória; evitar updates simultâneos
Perda de dados Backup SQLite consistente, restauração testada
Dados sensíveis no painel Minimização, controle de acesso e retenção definida
Incidente observado: Cloudflare 1033
Após a publicação e o acesso bem-sucedidos, foi registrada uma página Cloudflare Error 1033. Esse erro é compatível com indisponibilidade de um túnel utilizável para o hostname naquele momento. A captura isolada não determina a causa específica.
Hipóteses a validar — não conclusões
Sequência de investigação recomendada
systemctl is-active cloudflared studio-dashboardsystemctl status cloudflared --no-pagerjournalctl -u cloudflared -n 80 --no-pagerjournalctl -u studio-dashboard -n 80 --no-pagerfree -h; df -h /curl -I --max-time 5 http://127.0.0.1:8765/Correlacionar horário do erro com eventos da VM e do túnel. Verificar no painel a integridade da réplica e o mapeamento da rota antes de qualquer alteração. Evitar expor logs que contenham credenciais.
Operação, continuidade e custos
Rotina operacional sugerida
Frequência Verificação
Diária Disponibilidade do hostname; saúde dos serviços; alertas de OOM
Semanal Erros HTTP; consumo de RAM/swap; espaço em disco; falhas de timers
Mensal Políticas Access, usuários autorizados, versões e custos OCI
Trimestral Restauração de backup, teste de negação e simulação de falha
Custos e limites
Recursos Always Free dependem de elegibilidade, região e limites de conta. Alertas de orçamento são mecanismos de aviso, não bloqueios automáticos de cobrança. Remover ou substituir um cartão não é um mecanismo confiável de contenção de custos; monitore a cobrança e as instâncias/volumes provisionados.
Critérios de aceite para produção
Plano de evolução
de
P0 Investigar 1033 e configurar alertas Reduzir tempo de detecção e recuperação
P0 Testar bloqueio de identidade não Comprovar enforcement da política
autorizada
P1 Validar MFA e sessões Access Elevar segurança de autenticação
P1 Backup e restauração automatizados Reduzir risco de perda de dados
P2 Dashboards de saúde da VM e coletores Visibilidade de gargalos
P2 Documentar RTO/RPO e runbook Padronizar operação
Pacote de evidências para portfólio
Antes de compartilhar capturas, remover e-mails, hostname real, IP público, IDs de conta, UUIDs, Ray IDs, tokens, chaves, URLs de sessão e caminhos privados. A anonimização deve ocorrer sobre a imagem final, não apenas com sobreposição facilmente reversível.
Figura sugerida Legenda profissional
E01 • Painel Visão consolidada de tráfego, cache, status HTTP e geografia
E02 • Túnel Conector íntegro e réplica ativa; identificadores ocultos
E03 • Access Política Allow por identidade; dados pessoais ocultos
E04 • Terminal Status dos serviços e escuta em loopback, sem segredos
E05 • Arquitetura Fluxo de confiança entre usuário, borda, túnel e origem
Conclusão
O estudo comprova a viabilidade funcional de um painel de monitoramento leve, protegido por autenticação na borda e encaminhado por túnel de saída. A solução privilegia simplicidade, superfície exposta reduzida e custo potencialmente baixo. Sua maturidade operacional depende de concluir os testes negativos, validar recuperação e solucionar a indisponibilidade posteriormente observada.
NOTA DE TRANSPARÊNCIA Documento técnico baseado em evidências do piloto e em recomendações de engenharia. Não constitui auditoria independente, pentest ou certificação de conformidade.
O que você vai construir
Um dashboard HTTP local, hospedado em uma VM Linux, publicado em HTTPS por Cloudflare Tunnel e protegido por Cloudflare Access. A aplicação permanece vinculada a 127.0.0.1, sem necessidade de abrir sua porta TCP na internet.
TOPOLOGIA Usuário → Cloudflare Access → Cloudflare Tunnel → Linux/OCI → 127.0.0.1:8765 → Python/SQLite.
Pré-requisitos
Variáveis do laboratório
Variável Exemplo fictício Observação
APP_URL http://127.0.0.1:8765 Serviço local, não exposto
Planejamento de custos e capacidade
Para um piloto leve, 1 OCPU e 1 GB RAM podem ser suficientes, desde que a carga seja pequena e os processos sejam monitorados. Em Oracle Cloud, a forma Always Free E2.1.Micro possui limitações importantes; a forma A1.Flex usa ARM64 e depende de capacidade regional. Não suponha que será possível mudar a arquitetura de uma instância existente sem migração.
Provisionar e proteger a VM
No console OCI, crie uma instância Linux com subnet apropriada, chave SSH e volume de boot. Evite expor portas de aplicação. Para administração, restrinja SSH a endereços confiáveis e, se possível, adote acesso administrativo sem exposição pública.
Primeiro diagnóstico — somente leitura
hostnamectluname -mfree -hdf -h /systemctl --failedss -lntpRegistre arquitetura, RAM e espaço disponível. Em VMs de 1 GB, instalação/atualização de muitos pacotes pode causar OOM; faça operações de manutenção de modo controlado.
Critério de aceite
Criar um serviço HTTP de laboratório
O bloco a seguir cria uma página de teste, não um dashboard de produção. Use-o para validar o encadeamento antes de integrar coletores, banco e métricas reais.
mkdir -p "$HOME/painel-demo"printf "%s\n" "<h1>Dashboard de teste</h1>" > "$HOME/painel-demo/index.html"cd "$HOME/painel-demo"python3 -m http.server 8765 --bind 127.0.0.1Em outro terminal, execute:
curl -I --max-time 5 http://127.0.0.1:8765/ss -lntp | grep 8765SEGURANÇA O módulo http.server é adequado apenas a teste controlado e conteúdo não sensível. Não o utilize como servidor de produção de arquivos ou dados privados.
Passagem para produção
Implemente uma aplicação HTTP apropriada com usuário de serviço sem privilégios, dependências fixadas, tratamento de erros, logs e um serviço systemd. Para SQLite, mantenha banco fora do diretório público e estabeleça política de backup.
Gerenciar a aplicação pelo systemd
Exemplo de unidade para um processo Python próprio. Ajuste usuário, diretório e comando ao seu projeto; não copie cegamente para servidores existentes.
[Unit]Description=Dashboard HTTP local
After=network-online.targetWants=network-online.target[Service]Type=simpleUser=dashboardWorkingDirectory=/opt/dashboardExecStart=/usr/bin/python3 /opt/dashboard/app.pyRestart=on-failureRestartSec=5NoNewPrivileges=true[Install]WantedBy=multi-user.targetSalve como /etc/systemd/system/dashboard.service depois de criar o usuário e instalar a aplicação. O script app.py deve escutar exclusivamente em 127.0.0.1:8765.
sudo systemctl daemon-reloadsudo systemctl enable --now dashboardsystemctl status dashboard --no-pagerjournalctl -u dashboard -n 40 --no-pagerColetores agendados
Prefira systemd timers para coletas periódicas, com timeout, logs e prevenção de execuções simultâneas. Registre horário, status da coleta, fonte e eventual erro. Evite armazenar credenciais diretamente em arquivos versionados.
Instalar o conector cloudflared
No painel Cloudflare, navegue até Zero Trust → Rede → Túneis e crie um túnel do tipo cloudflared. Escolha Linux e a arquitetura da VM (amd64 ou arm64). Siga o comando oficial exibido para sua plataforma; métodos de instalação e versões mudam ao longo do tempo.
Verificações antes da instalação
uname -mcommand -v cloudflared || truecloudflared --version 2>/dev/null || true
O token exibido no painel é um segredo de acesso ao túnel. Execute o comando de instalação diretamente na VM, sem copiar o token para prints, chats, repositórios ou documentação pública.
Instalação do serviço
Após instalar o binário, use o comando de serviço fornecido pelo painel. Se o binário estiver em /usr/local/bin e não for encontrado pelo sudo, use o caminho absoluto. Substitua o marcador pelo segredo obtido diretamente no painel:
sudo /usr/local/bin/cloudflared service install <TOKEN_DO_TUNEL>Esse comando é ilustrativo; não publique o valor real do token. Em produção, avalie o histórico de shell e as permissões de arquivos conforme o método de instalação utilizado.
Validar o conector
systemctl is-active cloudflaredsystemctl is-enabled cloudflaredsystemctl status cloudflared --no-pagerjournalctl -u cloudflared -n 50 --no-pagerNo painel, confirme estado íntegro e ao menos uma réplica conectada. Se não houver conexão, investigue logs e conectividade de saída antes de alterar o DNS.
Publicar a rota HTTP
No túnel, abra Rotas → Adicionar rota → Aplicativo publicado. Informe o subdomínio e domínio gerenciados pela Cloudflare, deixe Caminho vazio para toda a aplicação e configure a URL do serviço local.
Campo Valor de exemplo
Subdomínio monitoramento
Domínio exemplo.com.br
Hostname completo monitoramento.exemplo.com.br
Caminho em branco
URL do serviço http://127.0.0.1:8765
Salve e confirme o registro DNS criado. Não crie registro A apontando diretamente ao IP público da VM para publicar o painel.
Teste preliminar
Antes de distribuir a URL, conclua a configuração do Access na próxima etapa. Um túnel publicado sem política de autenticação adequada pode permitir acesso indevido à aplicação.
Proteger com Cloudflare Access
Acesse Zero Trust → Controles de acesso → Aplicativos → Criar aplicativo auto-hospedado. Configure o hostname exato publicado e crie uma política que permita somente as identidades aprovadas.
Configuração de referência
Configuração Valor recomendado para laboratório
Tipo Auto-hospedado
Destino monitoramento.exemplo.com.br
Política Allow / Permitir
Regra Include E-mails → operador@example.com
Provedor de identidade Selecionar somente o provedor necessário
Duração de sessão Conforme sensibilidade; preferir período curto
Bypass Não criar para o dashboard protegido
O login da conta administrativa Cloudflare e a autenticação do aplicativo são fluxos diferentes. Uma tela de login do painel administrativo não comprova, isoladamente, que o Access protege o hostname.
Teste de autorização obrigatório
Testes ponta a ponta
Teste Resultado esperado
Origem local curl em 127.0.0.1:8765 responde
Escuta local ss mostra apenas 127.0.0.1:8765
Túnel Réplica conectada no painel
DNS/HTTPS Hostname responde via Cloudflare
Access sem sessão Solicita autenticação
Identidade permitida Acesso concedido
Identidade não permitida Acesso negado
Reboot controlado Serviços voltam automaticamente
Coleta Timer executa e registra logs
CHECKPOINT Não marque o ambiente como concluído sem validar também o teste negativo de autorização e a recuperação após reinicialização.
Diagnóstico de falhas
Erro Cloudflare 1033
O Error 1033 geralmente indica que a borda não consegue utilizar o túnel associado ao hostname. Não conclua que o problema é DNS, token ou aplicação sem coletar evidências.
systemctl is-active cloudflared dashboardjournalctl -u cloudflared -n 80 --no-pagerfree -hdf -h /curl -I --max-time 5 http://127.0.0.1:8765/Se o serviço local responder, mas o túnel estiver desconectado, concentre a análise em cloudflared, conectividade e rota. Se o túnel estiver conectado e o HTTP local falhar, investigue a aplicação. Não desative o Access para “testar” um erro de conectividade.
Falhas comuns e ações
Sintoma Verificação inicial
1033 Conector, conectividade de saída, status e rota
502/Bad Gateway URL local, porta, processo e logs do dashboard
Loop de login IdP, cookies, sessão e regras do Access
Acesso negado E-mail/identidade, política Include/Exclude e logs
VM lenta free -h, swap, OOM, CPU, timers e processos
Dados desatualizados Timers, logs de coleta, relógio e integridade do SQLite
Operação segura e backup
Verificações regulares
systemctl is-active cloudflared dashboardsystemctl list-timers --alljournalctl -p warning -b --no-pager | tail -50free -h; df -h /Não execute atualizações pesadas em uma VM com memória muito limitada sem janela de manutenção e backup. Ajuste limites de recursos, retenção de logs e periodicidade dos coletores à capacidade disponível.
Backup SQLite consistente
Para bancos SQLite ativos, prefira a API de backup do SQLite em vez de copiar o arquivo durante escrita. Exemplo a adaptar ao caminho e às permissões da aplicação:
python3 - <<'PY'import sqlite3source = sqlite3.connect("/opt/dashboard/data.db")target = sqlite3.connect("/backup/dashboard-backup.db")with target:source.backup(target)target.close()source.close()PYCrie o diretório de backup e valide as permissões previamente. Proteja a cópia, retenha versões e teste a restauração em ambiente separado. Não coloque backups na pasta pública do servidor.
Custos
Acompanhe compute, boot volumes, snapshots, tráfego e recursos auxiliares. Um orçamento com alerta não suspende recursos nem estabelece teto de gastos.
Rollback e resposta a incidentes
Situação Ação segura
Falha ao publicar Remover/desabilitar rota pública mantendo serviço local
Política incorreta Restaurar regra Access restritiva e testar negação
Conector instável Inspecionar logs e versão; reiniciar somente se justificado
Dados corrompidos Parar escritores e restaurar backup validado
Token comprometido Rotacionar token no painel e atualizar réplicas
Mudança malsucedida Retornar configuração versionada e verificar saúde
Checklist de entrega
Referências e boas práticas
Consulte a documentação oficial atualizada antes de implementar, especialmente para instalação do conector, autenticação e preços. Links de referência:
Este guia é um modelo de implementação para laboratório. Ajuste nomes de unidades, usuários, permissões, sistema operacional e métodos de autenticação à sua realidade. Valide cada comando em ambiente controlado antes de aplicar em produção.
RESULTADO ESPERADO Um dashboard acessível de qualquer rede com internet, desde que o túnel esteja saudável e a identidade seja autorizada — sem publicar a porta local da aplicação.
Pacote de evidências recomendado
Capturas para portfólio, auditoria interna e documentação de mudanças. Não publique telas sem anonimização definitiva.
Métricas HTTP, cache, geografia e período de coleta.
Observado · sanitizar capturaRéplica conectada, versão e saúde do conector.
Observado · ocultar IDs e IPsRegra Allow restrita e autenticação de usuário autorizado.
Observado · ocultar identidadesystemctl, loopback, timers e recursos da VM.
Coletar sem tokens/logs sensíveisTeste de usuário sem permissão e bloqueio esperado.
Pendente de comprovaçãoRunbook do erro 1033, reboot e retorno do serviço.
Pendente de comprovação