Este documento descreve o estado atual do projeto e será refinado conforme novas etapas forem concluídas.
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 Nginx reverso, que atua como proxy e grava os arquivos de log localmente. A partir desses logs, 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.
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.
O ambiente local funciona da seguinte forma:
Cliente / Navegador / curl
|
v
Nginx (porta 80)
|
v
OWASP Juice Shop (porta 3000 interna)
- 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.
- 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 e nos scripts já utilizados:
LogsSQLi/
├── .venv/
├── 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/
├── logs/
│ ├── access.log
│ └── error.log
├── 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/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.
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 / Google Drive, caso a execução dos notebooks siga o mesmo fluxo usado no desenvolvimento atual
docker --version
docker-compose --version
python3 --versionNeste ambiente, o comando disponível é
docker-composee nãodocker compose.
cd /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/logsCom 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.
Este README é provisório e foi construído para registrar o estado atual do projeto, servindo como base para evolução da documentação.
Nas próximas versões, este arquivo poderá incorporar:
- instruções completas de instalação;
- dependências Python detalhadas;
- diagrama visual da arquitetura;
- explicação linha a linha dos scripts;
- descrição formal do dicionário de dados;
- resultados consolidados de ETL, EDA e ML;
- orientações de reprodução integral do case.
- Victor Flohr Costa Bicudo Larrubia - 082210026
- Vitor Dié dos Santos Pereira - 082210023
- Beatriz de Sá Silva - 081210011
- Bruno Hector Wüsthofen - 082210013