O LogsSQLi é um projeto acadêmico da disciplina Análise de Dados, da Faculdade Engenheiro Salvador Arena, voltado à coleta, estruturação, análise e modelagem preditiva de logs HTTP com foco na identificação de padrões associados a SQL Injection (SQLi).
O ambiente foi montado para gerar tráfego controlado em uma aplicação vulnerável (OWASP Juice Shop) e registrar esse tráfego por meio de um proxy reverso Nginx, que grava os arquivos de log localmente. A partir desses logs, enviados periodicamente para o Google Drive por uma tarefa cron executando um script Bash com apoio do rclone, o projeto evolui para um pipeline analítico com três frentes principais:
- M1 — Engenharia de Dados (ETL)
Estruturação dos logs brutos, parsing da requisição HTTP, expansão de parâmetros e persistência das tabelas tratadas. - M2 — Análise Exploratória de Dados (EDA)
Estatística descritiva, análise de distribuições, correlações, outliers e comparação de estratégias de detecção de SQLi. - M3 — Modelagem Preditiva (ML)
Preparação supervisionada das amostras, vetorização textual em nível de caractere, treinamento de modelos neurais e aplicação do melhor classificador sobre os parâmetros extraídos dos logs. - M4 — Business Insights & Generative BI
Construção de dashboard em Streamlit, exploração multidimensional dos dados e apoio à decisão com Google AI Studio.
O objetivo central é construir um pipeline capaz de transformar logs HTTP brutos em bases analíticas úteis para detectar requisições suspeitas e apoiar o estudo de padrões relacionados a ataques de SQL Injection.
De forma prática, o projeto busca:
- subir uma aplicação vulnerável para gerar tráfego web;
- registrar os acessos HTTP em arquivos de log locais;
- converter os logs em estruturas tabulares reutilizáveis;
- enriquecer os dados com atributos derivados da requisição;
- comparar estratégias de detecção de SQLi;
- construir uma base preparada para classificação supervisionada;
- treinar e comparar modelos de Machine Learning / Deep Learning;
- disponibilizar uma camada visual de análise e geração assistida de insights.
O ambiente local funciona da seguinte forma:
Cliente / Navegador / curl
|
v
Nginx (porta 80)
|
v
OWASP Juice Shop (porta 3000 interna)
|
v
logs/access.log
|
v
ETL / EDA / ML / Dashboard
- OWASP Juice Shop
Aplicação alvo utilizada para gerar tráfego HTTP e simular requisições realistas em um ambiente controlado. - Nginx
Proxy reverso responsável por encaminhar as requisições ao Juice Shop e registrar os logs de acesso. - Pasta local
logs/
Diretório persistido no host para armazenar os arquivosaccess.logeerror.log. - Google Drive + rclone + cron
Camada operacional usada para sincronizar logs e artefatos entre a máquina local e o ambiente analítico quando necessário.
- O serviço
juice-shopusa a imagembkimminich/juice-shop. - O serviço
nginx-proxyusa a imagemnginx:latest. - A porta
80do host é publicada no contêiner do Nginx. - O arquivo
nginx.confé montado como configuração do Nginx. - A pasta
./logsé montada em/var/log/nginxpara persistência dos logs. - O Nginx faz
proxy_passparahttp://juice-shop:3000. - O formato do
access.loginclui, entre outros campos, IP, usuário, timestamp, request completa, status, bytes enviados, referer, user-agent e tempo da requisição.
A estrutura abaixo representa a organização esperada do projeto com base no ambiente local, nos notebooks, no dashboard e nos artefatos finais já adicionados:
LogsSQLi/
├── .venv/
├── dashboards/
│ └── streamlit/
│ ├── app_streamlit_logssqli.py
│ ├── requirements.txt
│ └── screenshots/
├── data/
│ ├── raw/
│ │ ├── access_log_structured.csv
│ │ └── payloads_dataset.csv
│ └── processed/
│ ├── df_analitica.csv
│ ├── df_params.csv
│ ├── df_payload_dim.csv
│ ├── df_match_exato.csv
│ ├── df_match_contains.csv
│ ├── df_params_signature.csv
│ ├── df_estatisticas_numericas.csv
│ ├── df_outliers_iqr.csv
│ ├── comparacao_grupos.csv
│ ├── diferencas_grupos.csv
│ ├── recomendacoes_modelagem.csv
│ └── ml/
│ ├── splits/
│ └── experiments/
├── docs_finais/
│ └── google_ai_studio_validacao.md
├── logs/
│ ├── access.log
│ └── error.log
├── prompts/
│ ├── prompt_teste_dashboard.md
│ └── system_prompt_gemini.md
├── recursos/
├── scripts/
│ ├── convert_access_to_csv.py
│ └── run_pipeline.sh
├── docker-compose.yml
├── nginx.conf
├── ETL_e_EDA_Case_LogsSQLi.ipynb
├── ML_Case_LogsSQLi.ipynb
├── payloads_dataset.csv
└── README.md
Observação: alguns diretórios e artefatos são gerados ao longo da execução do pipeline e dos notebooks.
Atualmente, o projeto trabalha com duas fontes principais.
Os logs são gerados localmente a partir do tráfego encaminhado pelo Nginx para o OWASP Juice Shop. O arquivo mais importante nesta etapa é:
logs/access.log
Esse arquivo serve como entrada bruta para o processo de parsing e estruturação.
O projeto também utiliza uma base de payloads de referência, consolidada em:
payloads_dataset.csv
Essa base é utilizada para apoiar estratégias de correspondência exata, contenção e consolidação de padrões textuais relacionados a SQL Injection.
Responsável por subir os dois serviços do ambiente local:
juice-shopnginx-proxy
Resumo do comportamento:
- não expõe diretamente a porta do Juice Shop;
- força a passagem do tráfego pelo Nginx;
- publica a porta
80; - persiste os logs localmente no diretório
logs/.
Define:
- o formato customizado do log;
- o arquivo de saída do
access.log; - a escuta na porta
80; - o encaminhamento das requisições para
juice-shop:3000.
Script responsável por converter o access.log em uma base estruturada em CSV, preservando os campos relevantes do log HTTP para as etapas analíticas seguintes.
Script que organiza a execução inicial do pipeline, incluindo a conversão dos logs e a movimentação ou sincronização dos arquivos para a camada data/raw.
Notebook que consolida as etapas de:
- carga e validação das bases;
- padronização inicial e criação de variáveis analíticas;
- parsing da linha
request; - extração dos parâmetros HTTP;
- normalização e decodificação dos parâmetros;
- consolidação da dimensão de payloads;
- comparação entre estratégias de detecção;
- construção da base analítica final;
- estatística descritiva, outliers, correlações e gráficos;
- persistência das tabelas finais em
data/processed.
Notebook que consolida a etapa de modelagem preditiva, incluindo:
- preparação supervisionada da base de treino;
- reconstrução da base binária com negativos controlados;
- vetorização textual em nível de caractere;
- treinamento comparativo de arquiteturas neurais;
- seleção do melhor modelo;
- aplicação do modelo sobre os parâmetros extraídos dos logs;
- consolidação dos alertas por requisição, endpoint e status;
- salvamento dos artefatos de experimento em
data/processed/ml.
Aplicação Streamlit responsável por apresentar:
- visão executiva do case;
- simulação OLAP;
- comparação de modelos;
- exploração detalhada dos parâmetros;
- conteúdo pronto para uso no Google AI Studio.
Antes de executar o ambiente local, é necessário ter instalado:
- Docker
- Docker Compose
- navegador web ou
curlpara gerar tráfego; - ambiente Python para scripts auxiliares e notebooks;
- Google Colab ou Google Drive, caso a execução dos notebooks siga o mesmo fluxo usado no desenvolvimento atual;
rclone, caso seja utilizada a sincronização automatizada com Google Drive.
docker --version
docker-compose --version
python3 --versioncd ./LogsSQLimkdir -p logsdocker-compose up -ddocker-compose psou:
docker psCom o ambiente em execução, acesse no navegador:
http://localhost
ou:
http://127.0.0.1
Também é possível gerar tráfego com curl:
curl http://localhost
curl "http://localhost/#/login"
curl "http://localhost/rest/products/search?q=apple"
curl "http://localhost/rest/user/login"Qualquer navegação já contribui para popular o
access.log.
Os logs ficam armazenados localmente em:
./LogsSQLi/logs
Arquivos esperados:
access.logerror.log
tail -f ./LogsSQLi/logs/access.logtail -f ./LogsSQLi/logs/error.logls -lh ./LogsSQLi/logsEm parte do fluxo operacional do projeto, os logs e artefatos são sincronizados com o Google Drive por meio de:
rclonepara acesso ao Drive a partir da máquina local;- uma tarefa
cronpara automatizar a execução periódica; - scripts auxiliares em Bash e Python para organizar e enviar os arquivos.
Essa camada auxilia na continuidade do pipeline entre a máquina local e o ambiente usado nos notebooks.
Com base no fluxo já documentado nos notebooks, o pipeline está organizado da seguinte forma.
- gerar tráfego web no Juice Shop;
- registrar o tráfego no
logs/access.log; - converter o log para
data/raw/access_log_structured.csv; - garantir a disponibilidade de
payloads_dataset.csvemdata/raw.
A etapa de engenharia de dados realiza, entre outras atividades:
- leitura do log estruturado;
- leitura da base de payloads;
- padronização de tipos de dados;
- parsing da coluna
request; - extração de método HTTP, URL, path, query string e protocolo;
- criação de métricas derivadas de tamanho e estrutura da requisição;
- expansão da query string em parâmetros individuais;
- criação de identificadores técnicos para rastreabilidade;
- decodificação e normalização dos valores observados;
- geração de chaves padronizadas para comparação textual;
- persistência das tabelas intermediárias e finais em
data/processed.
A etapa de análise exploratória contempla:
- estatística descritiva das variáveis numéricas;
- identificação de outliers pela regra do IQR;
- histogramas, boxplots e scatter plots;
- matriz de correlação;
- análise de grupos positivos e negativos;
- comparação entre estratégias de detecção de SQLi.
As estratégias comparadas no projeto incluem:
- correspondência exata
- correspondência por contenção
- heurísticas por assinaturas textuais
A etapa de modelagem preditiva contempla:
- construção das bases supervisionadas;
- geração de classe negativa controlada;
- vetorização textual em nível de caractere;
- particionamento treino/validação/teste;
- treinamento de modelos binários;
- comparação de arquiteturas neurais;
- análise de estabilidade;
- curva ROC;
- aplicação do melhor modelo sobre os parâmetros extraídos dos logs;
- consolidação de alertas em nível de parâmetro, requisição e endpoint.
Entre os artefatos já previstos ou gerados ao longo do pipeline, destacam-se:
access_log_structured.csvpayloads_dataset.csv
df_params.csvdf_payload_dim.csvdf_match_exato.csvdf_match_contains.csvdf_params_signature.csvdf_analitica.csvdf_estatisticas_numericas.csvdf_outliers_iqr.csvcomparacao_grupos.csvdiferencas_grupos.csvrecomendacoes_modelagem.csv
bin_train.csvbin_val.csvbin_test.csvtipo_train.csvtipo_val.csvtipo_test.csv
São gerados arquivos como:
- métricas de teste;
- históricos de treinamento;
- relatórios de classificação;
- matrizes de confusão;
- modelos
.keras; - inventário de artefatos;
- resumos executivos do case;
- alertas aplicados sobre a base de parâmetros.
docker-compose logsdocker-compose logs nginx-proxydocker-compose logs juice-shopdocker-compose restartdocker-compose stopdocker-compose downA sequência mínima para repetir a etapa de coleta local é:
cd ./LogsSQLi
mkdir -p logs
docker-compose up -d
docker-compose ps
curl http://localhost
tail -f logs/access.logQuando terminar:
docker-compose downNeste ambiente, o comando correto é:
docker-composeVerifique com:
sudo ss -tulpn | grep :80Verifique:
- se a pasta
logs/existe; - se os contêineres estão em execução;
- se houve tráfego em
http://localhost; - se o Nginx subiu corretamente.
Comandos úteis:
docker-compose ps
docker-compose logs nginx-proxy
ls -lh logsTeste:
docker-compose ps
curl http://localhostCom base no desenvolvimento já realizado até aqui:
- a base analítica final já permite identificar padrões relevantes de requisições suspeitas;
- a estratégia heurística baseada em assinaturas mostrou utilidade importante na base atual;
- variáveis como comprimento do payload decodificado, volume retornado e quantidade de assinaturas acionadas mostraram potencial analítico;
- a etapa de ML foi estruturada como detecção binária de SQLi;
- os resultados atuais são promissores, mas ainda exigem cautela quanto à generalização, pois a base precisa de maior diversidade de tráfego benigno e malicioso.
As próximas etapas devem priorizar:
- ampliação da base de logs;
- enriquecimento do catálogo de payloads;
- aumento da variedade de tráfego benigno;
- inclusão de novas variações de SQLi com obfuscação e codificação;
- refinamento da rotulagem;
- fortalecimento da generalização dos modelos;
- eventual retomada da classificação por tipo de SQLi, além da detecção binária.
Nesta etapa, o projeto evoluiu da análise técnica para uma camada de suporte à decisão, com foco em visualização interativa, exploração multidimensional e geração assistida de insights.
O dashboard final do projeto foi desenvolvido em Streamlit, com foco em exploração analítica dos logs HTTP processados e dos resultados da modelagem preditiva.
-
Visão executiva
- KPIs de logs avaliados
- volume de alertas SQLi
- percentual de logs com alerta
- total de parâmetros avaliados e classificados
-
Simulação OLAP
- slicing e dicing por método HTTP, status, endpoint e faixa de risco
- drill-down por endpoint e
log_id - tabela dinâmica com múltiplas métricas
-
Comparação de modelos
- comparação visual entre arquiteturas treinadas
- destaque do modelo campeão
- exibição de métricas como accuracy, precision, recall, AUC e F1
-
Exploração detalhada
- análise de parâmetros suspeitos
- ranking de combinações endpoint + parâmetro
- exportação do recorte filtrado em CSV
dashboards/streamlit/app_streamlit_logssqli.py
dashboards/streamlit/requirements.txt
pip install -r dashboards/streamlit/requirements.txt
streamlit run dashboards/streamlit/app_streamlit_logssqli.pyFoi configurado um agente de insight no Google AI Studio para interpretar os resultados do dashboard e produzir análises qualitativas voltadas à tomada de decisão.
Atuar como um consultor de negócios e segurança, com foco em:
- interpretação de indicadores do projeto LogsSQLi;
- priorização de endpoints com maior concentração de alertas;
- distinção entre fatos observados e hipóteses;
- geração de recomendações práticas de mitigação e monitoramento;
- tradução dos achados técnicos em linguagem executiva.
System Prompt
prompts/system_prompt_gemini.md
Prompt operacional de teste
prompts/prompt_teste_dashboard.md
Validação funcional e evidência do teste
docs_finais/google_ai_studio_validacao.md
Durante a validação, o agente foi configurado e testado com sucesso no Google AI Studio. No entanto, o recurso de compartilhamento do prompt apresentou indisponibilidade temporária na plataforma, impedindo a geração do link público no momento do teste.
Por esse motivo, os prompts e a documentação de validação foram versionados diretamente no repositório como evidência da implementação da camada de Generative BI.
A gravação do pitch executivo de até 2 minutos ainda será produzida na etapa final da entrega.
O vídeo deverá demonstrar:
- a dor de mercado abordada pelo projeto;
- o fluxo ETL → EDA → ML;
- o dashboard em funcionamento;
- o uso do agente de insight no Google AI Studio;
- o valor operacional e analítico da solução.
dashboards/
└── streamlit/
├── app_streamlit_logssqli.py
├── requirements.txt
└── screenshots/
prompts/
├── system_prompt_gemini.md
└── prompt_teste_dashboard.md
docs_finais/
└── google_ai_studio_validacao.md
- Victor Flohr Costa Bicudo Larrubia - 082210026
- Vitor Dié dos Santos Pereira - 082210023
- Beatriz de Sá Silva - 081210011
- Bruno Hector Wüsthofen - 082210013