From: Giorgio Ravera Date: Sat, 24 Jan 2026 00:27:15 +0000 (+0100) Subject: Added Todo e Readme X-Git-Tag: v0.0.1~29 X-Git-Url: http://git.giorgioravera.it/?a=commitdiff_plain;h=bb8433c1a00ee8505de397c9f9f83fe123958e8d;p=network-manager.git Added Todo e Readme --- diff --git a/README.md b/README.md new file mode 100644 index 0000000..f974b24 --- /dev/null +++ b/README.md @@ -0,0 +1,209 @@ +# Network Manager + + +## 🌐 Webapp di gestione rete + +Una **webapp unificata per il controllo completo dell’infrastruttura di rete**, progettata come frontend integrato per **BIND** (DNS), **Kea DHCP** e con supporto automatico ai certificati **Let’s Encrypt**. + +L’applicazione include: + +- **Frontend integrato** +- **Autenticazione amministratore** +- **Database SQLite** semplice e leggero +- **Generazione automatica** delle configurazioni DNS e DHCP a partire da un dominio definito +- **Versioning locale** delle configurazioni, con storico modifiche e possibilità di rollback + +Questa soluzione permette di gestire host, zone DNS, leases DHCP e certificati da un’unica interfaccia centralizzata, riducendo errori manuali e semplificando enormemente l’operatività. + +Progettato per essere eseguito facilmente tramite **Docker** e **Docker Compose**, con configurazione tramite variabili d’ambiente. + +--- + +## ✨ Caratteristiche + +- Frontend statico servito dall’applicazione (`FRONTEND_DIR`) +- Database SQLite persistente (`/data/database.db`) +- Logging configurabile su console e/o file +- Protezione login con rate-limit configurabile +- Credenziali admin configurabili tramite env o Docker secrets +- Supporto per `SESSION_SECRET`: chiave personalizzata per i cookie (se mancante viene generata automaticamente) + +--- + +## 📦 Requisiti +- Docker = 20.x +- Docker Compose = v2 + +--- + +## 🚀 Avvio rapido + +### 1) Struttura consigliata +``` +project/ ++- docker-compose.yml ++- .env ++- secrets/ +¦ +- admin_password_hash ++- data/ +``` + +### 2) ⚙️ Configurazione tramite `.env` (opzionale) +```dotenv +# --- Host & Web --- +DOMAIN=example.com +PUBLIC_IP=127.0.0.1 +HTTP_PORT=8000 +# --- Admin --- +ADMIN_USER=admin +ADMIN_PASSWORD=admin +# In produzione usa ADMIN_PASSWORD_HASH_FILE +# --- Login rate limit --- +LOGIN_MAX_ATTEMPTS=5 +LOGIN_WINDOW_SECONDS=600 +# --- Log --- +LOG_LEVEL=INFO +LOG_TO_FILE=false +# --- Session secret (opzionale ma consigliato in produzione) --- +# SESSION_SECRET=****ReplaceWithYourSecret***** +``` +Se SESSION_SECRET non è impostato, l’app genera una chiave casuale ad ogni riavvio -> le sessioni esistenti diventano invalide. + +### 3) 🐳 `docker-compose.yml` di esempio +```yaml +services: + network-manager: + image: your-registry/network-manager:latest + container_name: network-manager + restart: unless-stopped + ports: + - "${HTTP_PORT:-8000}:8000" + environment: + # Frontend + FRONTEND_DIR: "/app/frontend" + # Database + DB_FILE: "/data/database.db" + DB_RESET: "${DB_RESET:-false}" + # Log + LOG_LEVEL: "${LOG_LEVEL:-INFO}" + LOG_TO_FILE: "${LOG_TO_FILE:-false}" + LOG_FILE: "/data/app.log" + LOG_ACCESS_FILE: "/data/access.log" + # Host + DOMAIN: "${DOMAIN:-example.com}" + PUBLIC_IP: "${PUBLIC_IP:-127.0.0.1}" + # Web + HTTP_PORT: "${HTTP_PORT:-8000}" + LOGIN_MAX_ATTEMPTS: "${LOGIN_MAX_ATTEMPTS:-5}" + LOGIN_WINDOW_SECONDS: "${LOGIN_WINDOW_SECONDS:-600}" + # Admin + ADMIN_USER: "${ADMIN_USER:-admin}" + ADMIN_PASSWORD: "${ADMIN_PASSWORD:-admin}" + ADMIN_PASSWORD_HASH_FILE: "/run/secrets/admin_password_hash" + # Session (opzionale) + # SESSION_SECRET: "****ReplaceWithYourSecret*****" + volumes: + - ./data:/data + secrets: + - admin_password_hash + +secrets: + admin_password_hash: + file: ./secrets/admin_password_hash +``` + +--- + +## 🔧 Variabili d’ambiente supportate +| Variabile | Default | Descrizione | +|----------|-------------|----------| +| `FRONTEND_DIR` | /app/frontend | Directory del frontend | +| `DB_FILE` | /data/database.db | File SQLite | +| `DB_RESET` | false | Reset DB a ogni avvio | +| `LOG_LEVEL` | info | Livello log | +| `LOG_TO_FILE` | false | Abilita logging su file | +| `LOG_FILE` | /data/app.log | File log applicativo | +| `LOG_ACCESS_FILE` | /data/access.log | Access log HTTP | +| `DOMAIN` | example.com | Dominio pubblico | +| `PUBLIC_IP` | 127.0.0.1 | IP pubblico | +| `HTTP_PORT` | 8000 | Porta HTTP interna | +| `LOGIN_MAX_ATTEMPTS` | 5 | Tentativi login | +| `LOGIN_WINDOW_SECONDS` | 600 | Finestra tentativi | +| `ADMIN_USER` | admin | Username admin | +| `ADMIN_PASSWORD` | admin | Password admin (sviluppo) | +| `ADMIN_PASSWORD_HASH_FILE` | /run/secrets/admin_password_hash | Hash password admin | +| `SESSION_SECRET` | (auto‑generata) | Secret sessione | + +--- + +## 🔐 Gestione credenziali admin +### ✔ Sviluppo: usare variabili +```bash +ADMIN_USER=admin +ADMIN_PASSWORD=admin +``` + +### ✔ Produzione: usare Docker secrets +```bash +python - <<'PY' +import bcrypt +pwd = b"PasswordSicura" +print(bcrypt.hashpw(pwd, bcrypt.gensalt()).decode()) +PY +``` +Salvare l’hash in `./secrets/admin_password_hash`. + +Docker compose lo monterà in: +``` +/run/secrets/admin_password_hash +``` + +--- + +## 🔑 SESSION_SECRET +Serve a firmare i cookie. +Se impostato, l’app genera una chiave nuova ogni volta e tutte le sessioni decadono ad ogni restart. +Genera un secret forte: +```bash +openssl rand -base64 64 +``` +Poi: +SESSION_SECRET: "incolla-il-secret-qui" + +--- + +## 💾 Persistenza +### Database + Log +Mappare `/data` come volume: +```yaml +volumes: + - ./data:/data +``` + +--- + +## 📌 Comandi utili +Avvio normale: +```bash +docker compose up +``` +In background: +```bash +docker compose up -d +``` +Log: +```bash +docker compose logs -f network-manager +``` +Ricreare il container: +```bash +docker compose up -d --force-recreate +``` + +--- +## 🔒 Checklist Sicurezza +- Usare *ADMIN_PASSWORD_HASH_FILE* in produzione +- Disabilitare *SESSION_SECRET* per generazione automatica +- Impostare secure=True sui cookie se usi HTTPS +- Usare un reverse proxy con TLS +- Non mettere password nel repository \ No newline at end of file diff --git a/TODO.md b/TODO.md new file mode 100644 index 0000000..6f976b2 --- /dev/null +++ b/TODO.md @@ -0,0 +1,142 @@ + +## 📝 To‑Do List / Workflow Operativo (Estesa) + +--- + +### 🔄 Gestione DB all’avvio + +- [ ] **Se il database è vuoto** + - Importare YAML iniziale + - Popolare il database + +- [ ] **Se il database esiste** + - Ignorare YAML **a meno che il file del repository sia cambiato** + - Se YAML è variato → aggiornare il DB + +--- + +### 🛠️ Aggiornamenti effettuati dalla Webapp + +- [ ] Applicare modifiche al database +- [ ] Rigenerare YAML dal DB +- [ ] Effettuare **commit + push** su Git +- [ ] Rigenerare **da zero**: + - [ ] Configurazione **BIND (DNS)** + - [ ] Configurazione **Kea (DHCP)** +- [ ] Eseguire reload dei servizi: + - [ ] BIND + - [ ] Kea + +--- + +### 🔍 YAML ↔ DB Coerenza Periodica + +- [ ] Calcolare **checksum atteso** YAML +- [ ] Confrontare con **checksum reale** +- [ ] Determinare quale elemento è variato + +#### Regole di sincronizzazione +- [ ] YAML cambiato → aggiornare DB +- [ ] DB cambiato → rigenerare YAML + +--- + +## 🧩 Generazione configurazioni + +### 🧪 BIND (DNS) +- [ ] Ricostruire zone forward e reverse +- [ ] Ricostruire tutti i record (A, AAAA, CNAME) +- [ ] Validazione sintassi (`named-checkconf`, `named-checkzone`) +- [ ] Gestione rollback in caso di errori + +### 🧪 Kea (DHCP) +- [ ] Rigenerare subnet, pool, opzioni globali e host reservations +- [ ] Validare config JSON (`kea-dhcp4 -t`) +- [ ] Rollback se la sintassi non è valida + +--- + +## 🧭 Versioning Git + +- [ ] Controllare modifiche locali (`git status`) +- [ ] Applicare commit automatico con messaggi standard +- [ ] Push verso il repository remoto +- [ ] Tenere traccia delle versioni YAML generate +- [ ] Usare Git come audit delle modifiche + +--- + +## 🩺 Controllo Servizi (Health Check) + +### 🔎 BIND +- [ ] Controllo stato servizio +- [ ] Verifica log per errori + +### 🔎 Kea +- [ ] Controllo stato DHCP4/DHCP6 +- [ ] Verifica errori da log agent + +--- + +# 🔐 Hardening Sicurezza Web + +### 🔒 Sessioni & Cookie +- [ ] Impostare `secure=True` quando si usa HTTPS +- [ ] Impostare `httponly=True` per prevenire accesso via JS +- [ ] Impostare `samesite=Strict` o `Lax` a seconda dell’uso +- [ ] Rotazione controllata di `SESSION_SECRET` (manuale o programmata) + +### 🛡 Protezione HTTP +- [ ] Headers di sicurezza: + - [ ] `Content-Security-Policy` + - [ ] `Strict-Transport-Security` + - [ ] `X-Frame-Options` + - [ ] `X-Content-Type-Options` + - [ ] `Referrer-Policy` +- [ ] Abilitare TLS tramite reverse proxy +- [ ] Rate limiting aggiuntivo su IP e endpoint sensibili + +### 🔥 Protezione applicativa +- [ ] Validazione input DNS/DHCP (hostname, IP, subnet) +- [ ] Sanitizzazione input contro injection YAML/XML/JSON +- [ ] Audit log delle modifiche critiche +- [ ] Protezione contro brute force (ce l’hai già 👍) + +### 🔧 Backup & Recovery +- [ ] Backup periodico del DB SQLite +- [ ] Backup del repository Git su remoto +- [ ] Backup delle configurazioni generate + +--- + +# 👥 Gestione Utenti (RBAC) + +### 🎛 Ruoli previsti +- [ ] **admin** — accesso completo a tutto +- [ ] **operator** — può modificare host/DNS/DHCP ma non gestione utenti +- [ ] **viewer** — sola lettura + +### 🧩 Funzionalità da implementare +- [ ] Creazione utenti +- [ ] Reset password +- [ ] Disabilitazione utenti +- [ ] Cambio password admin +- [ ] Autenticazione basata su hash (bcrypt o argon2) +- [ ] Audit log (chi ha fatto cosa, quando) +- [ ] Timeout sessioni +- [ ] Protezione contro session hijacking +- [ ] Logout globale / invalidazione sessioni + +--- + +# ⭐ Checklist finale + +- [ ] Gestione DB ↔ YAML completa +- [ ] Generazione BIND/Kea con validazione & rollback +- [ ] Versioning Git +- [ ] Health-check BIND/Kea +- [ ] Hardening sicurezza web +- [ ] Gestione utenti + ruoli +- [ ] Notifiche (email/webhook) +- [ ] Backup DB + backup Git +- [ ] Test automatici