Add automatic IP blocking system to enhance security
Implement a systemd timer and Python script to periodically detect and automatically block malicious IP addresses based on risk scores, improving the application's security posture. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 7a657272-55ba-4a79-9a2e-f1ed9bc7a528 Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Event-Id: 05ab2f73-e195-4de9-a183-cd4729713b92 Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/449cf7c4-c97a-45ae-8234-e5c5b8d6a84f/7a657272-55ba-4a79-9a2e-f1ed9bc7a528/31VdIyL
This commit is contained in:
parent
e374c5575e
commit
4d9ed22c39
4
.replit
4
.replit
@ -18,6 +18,10 @@ externalPort = 80
|
||||
localPort = 41303
|
||||
externalPort = 3002
|
||||
|
||||
[[ports]]
|
||||
localPort = 43081
|
||||
externalPort = 4200
|
||||
|
||||
[[ports]]
|
||||
localPort = 43471
|
||||
externalPort = 3003
|
||||
|
||||
260
deployment/AUTO_BLOCKING_SETUP.md
Normal file
260
deployment/AUTO_BLOCKING_SETUP.md
Normal file
@ -0,0 +1,260 @@
|
||||
# Auto-Blocking Setup - IDS MikroTik
|
||||
|
||||
## 📋 Panoramica
|
||||
|
||||
Sistema di auto-blocking automatico che rileva e blocca IP con **risk_score >= 80** ogni 5 minuti.
|
||||
|
||||
**Componenti**:
|
||||
1. `python_ml/auto_block.py` - Script Python che chiama API ML
|
||||
2. `deployment/systemd/ids-auto-block.service` - Systemd service
|
||||
3. `deployment/systemd/ids-auto-block.timer` - Timer esecuzione ogni 5 minuti
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Installazione su AlmaLinux
|
||||
|
||||
### 1️⃣ Prerequisiti
|
||||
|
||||
Verifica che questi servizi siano attivi:
|
||||
```bash
|
||||
sudo systemctl status ids-ml-backend # ML Backend FastAPI
|
||||
sudo systemctl status postgresql-16 # Database PostgreSQL
|
||||
```
|
||||
|
||||
### 2️⃣ Copia File Systemd
|
||||
|
||||
```bash
|
||||
# Service file
|
||||
sudo cp /opt/ids/deployment/systemd/ids-auto-block.service /etc/systemd/system/
|
||||
|
||||
# Timer file
|
||||
sudo cp /opt/ids/deployment/systemd/ids-auto-block.timer /etc/systemd/system/
|
||||
|
||||
# Verifica permessi
|
||||
sudo chown root:root /etc/systemd/system/ids-auto-block.*
|
||||
sudo chmod 644 /etc/systemd/system/ids-auto-block.*
|
||||
```
|
||||
|
||||
### 3️⃣ Rendi Eseguibile Script Python
|
||||
|
||||
```bash
|
||||
chmod +x /opt/ids/python_ml/auto_block.py
|
||||
```
|
||||
|
||||
### 4️⃣ Installa Dipendenza Python (requests)
|
||||
|
||||
```bash
|
||||
# Attiva virtual environment
|
||||
cd /opt/ids/python_ml
|
||||
source venv/bin/activate
|
||||
|
||||
# Installa requests
|
||||
pip install requests
|
||||
|
||||
# Esci da venv
|
||||
deactivate
|
||||
```
|
||||
|
||||
### 5️⃣ Crea Directory Log
|
||||
|
||||
```bash
|
||||
sudo mkdir -p /var/log/ids
|
||||
sudo chown ids:ids /var/log/ids
|
||||
```
|
||||
|
||||
### 6️⃣ Ricarica Systemd e Avvia Timer
|
||||
|
||||
```bash
|
||||
# Ricarica systemd
|
||||
sudo systemctl daemon-reload
|
||||
|
||||
# Abilita timer (autostart al boot)
|
||||
sudo systemctl enable ids-auto-block.timer
|
||||
|
||||
# Avvia timer
|
||||
sudo systemctl start ids-auto-block.timer
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ✅ Verifica Funzionamento
|
||||
|
||||
### Test Manuale (esegui subito)
|
||||
|
||||
```bash
|
||||
# Esegui auto-blocking adesso (non aspettare 5 min)
|
||||
sudo systemctl start ids-auto-block.service
|
||||
|
||||
# Controlla log output
|
||||
journalctl -u ids-auto-block -n 30
|
||||
```
|
||||
|
||||
**Output atteso**:
|
||||
```
|
||||
[2024-11-25 12:00:00] 🔍 Starting auto-block detection...
|
||||
✓ Detection completata: 14 anomalie rilevate, 14 IP bloccati
|
||||
```
|
||||
|
||||
### Verifica Timer Attivo
|
||||
|
||||
```bash
|
||||
# Status timer
|
||||
systemctl status ids-auto-block.timer
|
||||
|
||||
# Prossime esecuzioni
|
||||
systemctl list-timers ids-auto-block.timer
|
||||
|
||||
# Ultima esecuzione
|
||||
journalctl -u ids-auto-block.service -n 1
|
||||
```
|
||||
|
||||
### Verifica IP Bloccati
|
||||
|
||||
**Database**:
|
||||
```sql
|
||||
SELECT COUNT(*) FROM detections WHERE blocked = true;
|
||||
```
|
||||
|
||||
**MikroTik Router**:
|
||||
```
|
||||
/ip firewall address-list print where list=blocked_ips
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📊 Monitoring
|
||||
|
||||
### Log in Tempo Reale
|
||||
|
||||
```bash
|
||||
# Log auto-blocking
|
||||
tail -f /var/log/ids/auto_block.log
|
||||
|
||||
# O via journalctl
|
||||
journalctl -u ids-auto-block -f
|
||||
```
|
||||
|
||||
### Statistiche Blocchi
|
||||
|
||||
```bash
|
||||
# Conta esecuzioni ultimo giorno
|
||||
journalctl -u ids-auto-block --since "1 day ago" | grep "Detection completata" | wc -l
|
||||
|
||||
# Totale IP bloccati oggi
|
||||
journalctl -u ids-auto-block --since today | grep "IP bloccati"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ⚙️ Configurazione
|
||||
|
||||
### Modifica Frequenza Esecuzione
|
||||
|
||||
Edita `/etc/systemd/system/ids-auto-block.timer`:
|
||||
|
||||
```ini
|
||||
[Timer]
|
||||
# Cambia 5min con frequenza desiderata (es: 10min, 1h, 30s)
|
||||
OnUnitActiveSec=10min # Esegui ogni 10 minuti
|
||||
```
|
||||
|
||||
Poi ricarica:
|
||||
```bash
|
||||
sudo systemctl daemon-reload
|
||||
sudo systemctl restart ids-auto-block.timer
|
||||
```
|
||||
|
||||
### Modifica Threshold Risk Score
|
||||
|
||||
Edita `python_ml/auto_block.py`:
|
||||
|
||||
```python
|
||||
"risk_threshold": 80.0, # Cambia soglia (80, 90, 100, etc)
|
||||
```
|
||||
|
||||
Poi riavvia timer:
|
||||
```bash
|
||||
sudo systemctl restart ids-auto-block.timer
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🛠️ Troubleshooting
|
||||
|
||||
### Problema: Nessun IP bloccato
|
||||
|
||||
**Verifica ML Backend attivo**:
|
||||
```bash
|
||||
systemctl status ids-ml-backend
|
||||
curl http://localhost:8000/health
|
||||
```
|
||||
|
||||
**Verifica router configurati**:
|
||||
```sql
|
||||
SELECT * FROM routers WHERE enabled = true;
|
||||
```
|
||||
|
||||
Deve esserci almeno 1 router!
|
||||
|
||||
### Problema: Errore "Connection refused"
|
||||
|
||||
ML Backend non risponde su porta 8000:
|
||||
```bash
|
||||
# Riavvia ML backend
|
||||
sudo systemctl restart ids-ml-backend
|
||||
|
||||
# Verifica porta listening
|
||||
netstat -tlnp | grep 8000
|
||||
```
|
||||
|
||||
### Problema: Script non eseguito
|
||||
|
||||
**Verifica timer attivo**:
|
||||
```bash
|
||||
systemctl status ids-auto-block.timer
|
||||
```
|
||||
|
||||
**Forza esecuzione manuale**:
|
||||
```bash
|
||||
sudo systemctl start ids-auto-block.service
|
||||
journalctl -u ids-auto-block -n 50
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔄 Disinstallazione
|
||||
|
||||
```bash
|
||||
# Stop e disabilita timer
|
||||
sudo systemctl stop ids-auto-block.timer
|
||||
sudo systemctl disable ids-auto-block.timer
|
||||
|
||||
# Rimuovi file systemd
|
||||
sudo rm /etc/systemd/system/ids-auto-block.*
|
||||
|
||||
# Ricarica systemd
|
||||
sudo systemctl daemon-reload
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📝 Note
|
||||
|
||||
- **Frequenza**: 5 minuti (configurabile)
|
||||
- **Risk Threshold**: 80 (solo IP critici)
|
||||
- **Timeout**: 180 secondi (3 minuti max per detection)
|
||||
- **Logs**: `/var/log/ids/auto_block.log` + journalctl
|
||||
- **Dipendenze**: ids-ml-backend.service, postgresql-16.service
|
||||
|
||||
---
|
||||
|
||||
## ✅ Checklist Post-Installazione
|
||||
|
||||
- [ ] File copiati in `/etc/systemd/system/`
|
||||
- [ ] Script `auto_block.py` eseguibile
|
||||
- [ ] Dipendenza `requests` installata in venv
|
||||
- [ ] Directory log creata (`/var/log/ids`)
|
||||
- [ ] Timer abilitato e avviato
|
||||
- [ ] Test manuale eseguito con successo
|
||||
- [ ] IP bloccati su MikroTik verificati
|
||||
- [ ] Monitoring attivo (journalctl -f)
|
||||
30
deployment/systemd/ids-auto-block.service
Normal file
30
deployment/systemd/ids-auto-block.service
Normal file
@ -0,0 +1,30 @@
|
||||
[Unit]
|
||||
Description=IDS Auto-Blocking Service - Detect and Block Malicious IPs
|
||||
Documentation=https://github.com/yourusername/ids
|
||||
After=network.target ids-ml-backend.service postgresql-16.service
|
||||
Requires=ids-ml-backend.service
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
User=ids
|
||||
Group=ids
|
||||
WorkingDirectory=/opt/ids
|
||||
EnvironmentFile=/opt/ids/.env
|
||||
|
||||
# Esegui script auto-blocking (usa venv Python)
|
||||
ExecStart=/opt/ids/python_ml/venv/bin/python3 /opt/ids/python_ml/auto_block.py
|
||||
|
||||
# Logging
|
||||
StandardOutput=append:/var/log/ids/auto_block.log
|
||||
StandardError=append:/var/log/ids/auto_block.log
|
||||
SyslogIdentifier=ids-auto-block
|
||||
|
||||
# Security
|
||||
NoNewPrivileges=true
|
||||
PrivateTmp=true
|
||||
|
||||
# Timeout: max 3 minuti per detection+blocking
|
||||
TimeoutStartSec=180
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
20
deployment/systemd/ids-auto-block.timer
Normal file
20
deployment/systemd/ids-auto-block.timer
Normal file
@ -0,0 +1,20 @@
|
||||
[Unit]
|
||||
Description=IDS Auto-Blocking Timer - Run every 5 minutes
|
||||
Documentation=https://github.com/yourusername/ids
|
||||
Requires=ids-auto-block.service
|
||||
|
||||
[Timer]
|
||||
# Esegui 2 minuti dopo boot (per dare tempo a ML backend di avviarsi)
|
||||
OnBootSec=2min
|
||||
|
||||
# Poi esegui ogni 5 minuti
|
||||
OnUnitActiveSec=5min
|
||||
|
||||
# Precisione: ±1 secondo
|
||||
AccuracySec=1s
|
||||
|
||||
# Esegui subito se il sistema era spento durante l'esecuzione programmata
|
||||
Persistent=true
|
||||
|
||||
[Install]
|
||||
WantedBy=timers.target
|
||||
63
python_ml/auto_block.py
Normal file
63
python_ml/auto_block.py
Normal file
@ -0,0 +1,63 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
IDS Auto-Blocking Script
|
||||
Rileva e blocca automaticamente IP con risk_score >= 80
|
||||
Eseguito periodicamente da systemd timer (ogni 5 minuti)
|
||||
"""
|
||||
import requests
|
||||
import sys
|
||||
from datetime import datetime
|
||||
|
||||
ML_API_URL = "http://localhost:8000"
|
||||
|
||||
def auto_block():
|
||||
"""Esegue detection e blocking automatico degli IP critici"""
|
||||
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
||||
print(f"[{timestamp}] 🔍 Starting auto-block detection...")
|
||||
|
||||
try:
|
||||
# Chiama endpoint ML /detect con auto_block=true
|
||||
response = requests.post(
|
||||
f"{ML_API_URL}/detect",
|
||||
json={
|
||||
"max_records": 5000, # Analizza ultimi 5000 log
|
||||
"hours_back": 1.0, # Ultima ora
|
||||
"risk_threshold": 80.0, # Solo IP critici (score >= 80)
|
||||
"auto_block": True # BLOCCA AUTOMATICAMENTE
|
||||
},
|
||||
timeout=120 # 2 minuti timeout
|
||||
)
|
||||
|
||||
if response.status_code == 200:
|
||||
data = response.json()
|
||||
detections = len(data.get("detections", []))
|
||||
blocked = data.get("blocked", 0)
|
||||
|
||||
if blocked > 0:
|
||||
print(f"✓ Detection completata: {detections} anomalie rilevate, {blocked} IP bloccati")
|
||||
else:
|
||||
print(f"✓ Detection completata: {detections} anomalie rilevate, nessun nuovo IP da bloccare")
|
||||
|
||||
return 0
|
||||
else:
|
||||
print(f"✗ API error: HTTP {response.status_code}")
|
||||
print(f" Response: {response.text}")
|
||||
return 1
|
||||
|
||||
except requests.exceptions.ConnectionError:
|
||||
print("✗ ERRORE: ML Backend non raggiungibile su http://localhost:8000")
|
||||
print(" Verifica che ids-ml-backend.service sia attivo:")
|
||||
print(" sudo systemctl status ids-ml-backend")
|
||||
return 1
|
||||
except requests.exceptions.Timeout:
|
||||
print("✗ ERRORE: Timeout dopo 120 secondi. Detection troppo lenta?")
|
||||
return 1
|
||||
except Exception as e:
|
||||
print(f"✗ ERRORE imprevisto: {type(e).__name__}: {e}")
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
return 1
|
||||
|
||||
if __name__ == "__main__":
|
||||
exit_code = auto_block()
|
||||
sys.exit(exit_code)
|
||||
Loading…
Reference in New Issue
Block a user