A containerized Security Information and Event Management (SIEM) system integrating firewalling, IDS, transparent proxy, policy enforcement/decision points, and an indexing engine to deliver a complete Zero-Trust architecture.
This project demonstrates a modular, Docker Compose–orchestrated architecture in which:
- firewall-gw applies
iptablesrules, NAT/MASQUERADE, and runs Snort for both the data plane and the control plane. - squid acts as a transparent HTTP/HTTPS/FTP proxy with ACLs based on URL, time, and subnet.
- core-server hosts Nginx (reverse-proxying to the PEP) and PostgreSQL, with advanced logging and least-privilege execution via
su-exec. - PEP (Policy Enforcement Point) receives requests, enriches context, and forwards them to the PDP.
- PDP (Policy Decision Point) queries Splunk, computes a trust score, and returns
ALLOWorDENY. - Splunk indexes logs from Snort, Squid, PostgreSQL, and PDP, exposes REST APIs to the PDP, and provides dashboards for alerting and reporting.
All components communicate over five isolated Docker networks (guest_net, mgmt_net, eth_net, server_net, int_net), each carrying a different trust weight for policy evaluation.
- Docker ≥ 20.10
- Docker Compose ≥ 1.29
- Create a
.envfile in the project root containing:SPLUNK_USERNAME=<your_splunk_username> SPLUNK_PASSWORD=<your_splunk_password>
To install Docker and Docker Compose, follow the official guide.
Your password must be at least 8 characters long and contain at least one uppercase letter, one number, and one special character.
```bash
curl -L -o SIEM_project.zip \
https://github.com/NicolaPicciafuoco/SIEM_project/archive/refs/heads/master.zip
unzip SIEM_project.zip
cd SIEM_project-master
```
From the project root directory, execute:
docker compose up --build-
Query base:
curl -G "http://10.10.4.100/query" --data-urlencode "db=<db>" --data-urlencode "user=<user>" --data-urlencode "password=<password>" --data-urlencode "query=SELECT * FROM <db_table>;"
-
Query con output
{"error":"SQLSTATE[42501]: Insufficient privilege: 7 ERROR: permission denied for table public"}curl -G "http://10.10.4.100/query" --data-urlencode "db=siem" --data-urlencode "user=siem_user" --data-urlencode "password=VeryStrongPass0" --data-urlencode "query=SELECT * FROM public;"
-
Query con output
{"error":"SQLSTATE[42501]: Insufficient privilege: 7 ERROR: permission denied for table private"}curl -G "http://10.10.4.100/query" --data-urlencode "db=siem" --data-urlencode "user=siem_user" --data-urlencode "password=VeryStrongPass0" --data-urlencode "query=SELECT * FROM private;"
-
Query con output
[{"id":1,"info":"test log 1"},{"id":2,"info":"test log 2"}]curl -G "http://10.10.4.100/query" --data-urlencode "db=siem" --data-urlencode "user=siem_admin" --data-urlencode "password=AdminPassword0" --data-urlencode "query=SELECT * FROM public;"
-
Query con output
[{"id":1,"secret":"test secret 1"},{"id":2,"secret":"test secret 2"}]curl -G "http://10.10.4.100/query" --data-urlencode "db=siem" --data-urlencode "user=siem_admin" --data-urlencode "password=AdminPassword0" --data-urlencode "query=SELECT * FROM private;"
-
Query con output
[{"id":1,"info":"test log 1"},{"id":2,"info":"test log 2"}]curl -G "http://10.10.4.100/query" --data-urlencode "db=siem" --data-urlencode "user=siem_reader" --data-urlencode "password=ReaderPassword0" --data-urlencode "query=SELECT * FROM public;"
-
Query con output
{"error":"SQLSTATE[42501]: Insufficient privilege: 7 ERROR: permission denied for table private"}curl -G "http://10.10.4.100/query" --data-urlencode "db=siem" --data-urlencode "user=siem_reader" --data-urlencode "password=ReaderPassword0" --data-urlencode "query=SELECT * FROM private;"