]> git.giorgioravera.it Git - network-manager.git/commitdiff
Added Todo e Readme
authorGiorgio Ravera <giorgio.ravera@gmail.com>
Sat, 24 Jan 2026 00:27:15 +0000 (01:27 +0100)
committerGiorgio Ravera <giorgio.ravera@gmail.com>
Sat, 24 Jan 2026 00:27:15 +0000 (01:27 +0100)
README.md [new file with mode: 0644]
TODO.md [new file with mode: 0644]

diff --git a/README.md b/README.md
new file mode 100644 (file)
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 (file)
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