# πŸš€ Guida Deployment IDS su AlmaLinux 9 Guida completa per il deployment del sistema IDS su server AlmaLinux 9 con aggiornamenti tramite git.alfacom.it ## πŸ“‹ Prerequisiti - Server AlmaLinux 9 con accesso root - Accesso a git.alfacom.it - Almeno 4GB RAM, 20GB disco - Connessione di rete ai router MikroTik ## πŸ”§ Installazione Iniziale ### Step 1: Preparazione Server Connettiti al server AlmaLinux come root: ```bash ssh root@ ``` ### Step 2: Clone Repository ```bash cd /tmp git clone https://git.alfacom.it/your-repo/ids.git cd ids ``` ### Step 3: Esegui Installazione Base ```bash chmod +x deployment/setup_almalinux.sh ./deployment/setup_almalinux.sh ``` Questo script: - βœ… Aggiorna il sistema - βœ… Installa Python 3.11, Node.js 20, PostgreSQL - βœ… Configura database PostgreSQL - βœ… Crea utente `ids` - βœ… Crea directory `/opt/ids` ### Step 4: Clone Repository in Destinazione Finale ```bash cd /opt/ids sudo -u ids git clone https://git.alfacom.it/your-repo/ids.git . ``` ### Step 5: Configura Environment Variables **IMPORTANTE**: NON usare mai password in chiaro nel codice! ```bash sudo -u ids cp .env.example .env sudo -u ids nano .env ``` Modifica il file `.env`: ```bash # Database PostgreSQL PGHOST=localhost PGPORT=5432 PGDATABASE=ids_database PGUSER=ids_user PGPASSWORD= # Usa: openssl rand -base64 32 # Session Secret SESSION_SECRET= # Usa: openssl rand -base64 32 # Python Backend URL VITE_PYTHON_API_URL=http://localhost:8000 # Environment NODE_ENV=production ``` **Genera password sicure**: ```bash # Password database openssl rand -base64 32 # Session secret openssl rand -base64 32 ``` ### Step 6: Aggiorna Password Database ```bash # Modifica password utente PostgreSQL sudo -u postgres psql -c "ALTER USER ids_user WITH PASSWORD '';" ``` ### Step 7: Installa Dipendenze ```bash # Dipendenze Node.js cd /opt/ids sudo -u ids npm install # Dipendenze Python cd /opt/ids/python_ml sudo -u ids pip3.11 install -r requirements.txt # Sync schema database cd /opt/ids sudo -u ids npm run db:push ``` ### Step 8: Configura Syslog Server Questo Γ¨ **CRITICO** per ricevere log dai router: ```bash cd /opt/ids/deployment chmod +x setup_syslog_server.sh ./setup_syslog_server.sh ``` Verifica che rsyslog sia in ascolto: ```bash netstat -ulnp | grep 514 ``` ### Step 9: Configura Router MikroTik Segui la guida: `deployment/CONFIGURAZIONE_ROUTER_MIKROTIK.md` Configurazione minima su ogni router: ```mikrotik /system logging action add name=ids-server target=remote remote= remote-port=514 /system logging add action=ids-server topics=firewall,info ``` ### Step 10: Avvia Syslog Parser ```bash cd /opt/ids/python_ml sudo -u ids nohup python3.11 syslog_parser.py > /var/log/ids/syslog_parser.log 2>&1 & ``` Verifica log in arrivo: ```bash tail -f /var/log/mikrotik/raw.log tail -f /var/log/ids/syslog_parser.log ``` ### Step 11: Configura Crontab e Avvio Automatico ```bash cd /opt/ids/deployment chmod +x setup_crontab.sh ./setup_crontab.sh ``` Questo configura: - βœ… Backend Python (FastAPI) - avvio automatico - βœ… Frontend Node.js - avvio automatico - βœ… Training ML ogni 12 ore - βœ… Detection ogni 5 minuti - βœ… Monitoring e restart automatici - βœ… Backup database giornaliero ### Step 12: Verifica Sistema ```bash # Verifica processi in esecuzione ps aux | grep -E 'python.*main|npm.*dev|syslog_parser' # Verifica API backend curl http://localhost:8000/health # Verifica frontend curl http://localhost:5000 # Verifica database popolato psql -U ids_user -d ids_database -c "SELECT COUNT(*) FROM network_logs;" ``` ## πŸ”„ Aggiornamenti da Git ### Procedura Standard di Aggiornamento ```bash cd /opt/ids sudo -u ids ./deployment/update_from_git.sh ``` Questo script: 1. βœ… Salva backup configurazione locale (.env) 2. βœ… Scarica aggiornamenti da git.alfacom.it 3. βœ… Ripristina configurazione locale 4. βœ… Aggiorna dipendenze Node.js e Python 5. βœ… Aggiorna schema database 6. βœ… Restart automatico servizi ### Aggiornamento Manuale (se necessario) ```bash cd /opt/ids # Backup configurazione sudo -u ids cp .env .env.backup # Pull da git sudo -u ids git pull origin main # Ripristina .env sudo -u ids cp .env.backup .env # Aggiorna dipendenze sudo -u ids npm install cd python_ml && sudo -u ids pip3.11 install -r requirements.txt # Sync database cd /opt/ids sudo -u ids npm run db:push # Restart servizi ./deployment/restart_all.sh ``` ## πŸ“Š Workflow Completo ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ ROUTER MIKROTIK β”‚ β”‚ (Generano log firewall via Syslog UDP:514) β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β–Ό β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ SERVER ALMALINUX 9 - RSYSLOG β”‚ β”‚ Riceve log β†’ /var/log/mikrotik/raw.log β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β–Ό β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ SYSLOG_PARSER.PY β”‚ β”‚ Parsa log β†’ Salva in PostgreSQL (network_logs) β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β–Ό β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ DATABASE POSTGRESQL β”‚ β”‚ Tabelle: network_logs, detections, routers, etc. β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β–Ό β–Ό β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ PYTHON BACKEND β”‚ β”‚ NODE.JS BACKEND β”‚ β”‚ (FastAPI:8000) β”‚ β”‚ (Express:5000) β”‚ β”‚ - Training ML β”‚ β”‚ - API REST β”‚ β”‚ - Detection β”‚ β”‚ - Frontend serve β”‚ β”‚ - Auto-block IPs β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β–Ό β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ REACT DASHBOARD β”‚ β”‚ (Browser) β”‚ β”‚ - Monitoring β”‚ β”‚ - Gestione router β”‚ β”‚ - Detections β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` ## ⏰ Operazioni Automatiche ### Training ML (ogni 12h - 00:00 e 12:00) ```bash POST http://localhost:8000/train { "max_records": 10000, "hours_back": 24, "contamination": 0.01 } ``` ### Detection (ogni 5 minuti) ```bash POST http://localhost:8000/detect { "max_records": 5000, "auto_block": true, "risk_threshold": 75 } ``` ### Monitoring Processi (ogni 5 minuti) - Controlla backend Python (porta 8000) - Controlla frontend Node (porta 5000) - Riavvia automaticamente se down ### Backup Database (ogni giorno alle 04:00) ```bash /opt/ids/backups/ids_backup_YYYYMMDD_HHMMSS.sql.gz ``` Mantiene 7 giorni di backup. ### Restart Completo (ogni domenica 03:00) ```bash ./deployment/restart_all.sh ``` ## πŸ” Monitoring e Log ### Log Principali ```bash # Backend Python (FastAPI) tail -f /var/log/ids/backend.log # Frontend Node.js tail -f /var/log/ids/frontend.log # Syslog Parser tail -f /var/log/ids/syslog_parser.log # Training ML tail -f /var/log/ids/training.log # Detection tail -f /var/log/ids/detect.log # Crontab tail -f /var/log/ids/cron.log # Log router in arrivo tail -f /var/log/mikrotik/raw.log ``` ### Comandi Utili ```bash # Stato processi ps aux | grep -E 'python.*main|npm.*dev|syslog_parser' # Stato database psql -U ids_user -d ids_database # Query utili database psql -U ids_user -d ids_database -c "SELECT COUNT(*) FROM network_logs;" psql -U ids_user -d ids_database -c "SELECT COUNT(*) FROM detections WHERE blocked = true;" # Restart manuale servizi /opt/ids/deployment/restart_all.sh # Visualizza crontab crontab -u ids -l ``` ## πŸ”’ Sicurezza ### Password e Secrets - ❌ **MAI** committare `.env` su git - βœ… Usa `.env.example` come template (committabile) - βœ… Genera password sicure con `openssl rand -base64 32` - βœ… Configura `.env` solo sul server di produzione - βœ… File `.env` ha permessi 600 (solo utente ids puΓ² leggere) ### Firewall ```bash # Porta 514/UDP per Syslog (solo da router fidati) firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.0.0/16" port port="514" protocol="udp" accept' # Porta 5000/TCP per frontend (accesso web) firewall-cmd --permanent --add-port=5000/tcp # Porta 8000/TCP per API backend (solo localhost) # NON esporre pubblicamente firewall-cmd --reload ``` ### Backup ```bash # Backup manuale database /opt/ids/deployment/backup_db.sh # Restore backup gunzip /opt/ids/backups/ids_backup_YYYYMMDD_HHMMSS.sql.gz psql -U ids_user -d ids_database < /opt/ids/backups/ids_backup_YYYYMMDD_HHMMSS.sql ``` ## πŸ› Troubleshooting ### Log non arrivano dai router ```bash # 1. Verifica rsyslog in ascolto netstat -ulnp | grep 514 # 2. Test connettivitΓ  da router # Sul router MikroTik: /tool fetch url="http://:514" mode=udp # 3. Verifica firewall server firewall-cmd --list-all # 4. Controlla log rsyslog tail -f /var/log/messages | grep rsyslog ``` ### Database non si popola ```bash # 1. Verifica syslog_parser in esecuzione ps aux | grep syslog_parser # 2. Controlla log parser tail -f /var/log/ids/syslog_parser.log # 3. Verifica file log esiste ls -la /var/log/mikrotik/raw.log # 4. Test manuale parser cd /opt/ids/python_ml sudo -u ids python3.11 syslog_parser.py ``` ### Backend non risponde ```bash # 1. Verifica processo ps aux | grep "python.*main" # 2. Controlla log tail -f /var/log/ids/backend.log # 3. Test manuale cd /opt/ids/python_ml sudo -u ids python3.11 main.py # 4. Verifica dipendenze pip3.11 list | grep -E 'fastapi|psycopg2|scikit' ``` ### Frontend non carica ```bash # 1. Verifica processo Node ps aux | grep "npm.*dev" # 2. Controlla log tail -f /var/log/ids/frontend.log # 3. Test manuale cd /opt/ids sudo -u ids npm run dev # 4. Verifica dipendenze npm list ``` ## πŸ“ Checklist Post-Installazione - [ ] Server AlmaLinux 9 aggiornato - [ ] PostgreSQL installato e configurato - [ ] Database `ids_database` creato e accessibile - [ ] File `.env` configurato con password sicure - [ ] Dipendenze Node.js e Python installate - [ ] Rsyslog in ascolto su porta 514 - [ ] Router MikroTik configurati per inviare log - [ ] Log visibili in `/var/log/mikrotik/raw.log` - [ ] Syslog parser in esecuzione - [ ] Database `network_logs` si popola - [ ] Backend Python risponde su porta 8000 - [ ] Frontend Node accessibile su porta 5000 - [ ] Crontab configurato per operazioni automatiche - [ ] Firewall configurato correttamente - [ ] Backup automatico funzionante ## βœ… Prima Esecuzione Training Dopo 24h di raccolta log: ```bash # Controlla quanti log hai raccolto psql -U ids_user -d ids_database -c "SELECT COUNT(*) FROM network_logs;" # Se hai almeno 10.000 log, esegui training curl -X POST http://localhost:8000/train \ -H "Content-Type: application/json" \ -d '{"max_records": 10000, "hours_back": 24}' # Controlla log training tail -f /var/log/ids/training.log # Dopo training, abilita detection automatica (giΓ  configurata in crontab) ``` --- **Sistema IDS pronto per la produzione! πŸ›‘οΈ** Per supporto: controllare log in `/var/log/ids/` e documentazione in `/opt/ids/deployment/`