
Multi-host UFW firewall dashboard — spiega le regole in linguaggio semplice, rileva lacune di sicurezza e fornisce diagnostica delle connessioni
Dashboard multi-host per il firewall UFW. Si connette a host Linux tramite SSH, analizza le regole del firewall e le porte in ascolto, spiega tutto in italiano semplice e segnala le lacune di sicurezza.

| Route | Descrizione |
|---|---|
/ | Dashboard panoramica con schede host, pillole dei servizi, conteggi lacune |
Browser --> Cloudflare Tunnel --> Proxy inverso --> FencePost (:8890)
Contenitore FastAPI
|-- SSH --> Host 1 (ufw status, ss -tlnp)
|-- SSH --> Host 2
|-- SSH --> Host N
'-- POST --> Webhook di notifica
FencePost è sola lettura — non modifica mai le regole del firewall, si limita a riferire su di esse.
<utente> ALL=(ALL) NOPASSWD: /usr/sbin/ufw status verbose, /usr/sbin/ufw status numbered, /usr/bin/ss -tlnp
git clone <url-repo> && cd fencepost
# Aggiungi la tua chiave SSH
cp ~/.ssh/your_key ssh/id_ed25519
chmod 600 ssh/id_ed25519
# Crea il tuo file ambiente dal template
cp .env.example .env
# Modifica .env con le credenziali reali
timezone: Australia/Melbourne
hosts:
- name: Mio Server
hostname: 192.168.1.10
ssh_user: deploy
ssh_port: 22
is_docker_host: false
networks:
"192.168.1.0/24": "LAN"
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
# Carica le variabili d'ambiente (bash/zsh)
export $(grep -v '^#' .env | xargs)
uvicorn app.main:app --reload --port 8890
Apri http://localhost:8890.
Nota: la modalità locale utilizza la chiave SSH al percorso specificato in config.yaml (ssh.key_path). Per lo sviluppo locale potresti voler sovrascrivere questo valore per puntare alla tua ssh/id_ed25519 locale:
ssh:
key_path: ssh/id_ed25519
timeout: 10
docker compose up -d --build
Apri http://localhost:8890. Il contenitore legge le credenziali da .env automaticamente tramite compose.yaml.
Le credenziali sono memorizzate in .env (ignorato da git) e referenziate da compose.yaml. Non commettere mai segreti nel repository.
app/
main.py # Rotta FastAPI e autenticazione
models.py # Dataclass HostFirewallState, UFWRule, ListeningPort
parser.py # Analizza output ufw status e ss
explainer.py # Traduce le regole in italiano semplice
diagnose.py # Motore diagnostico connessione
gap_detector.py # Trova le porte in ascolto scoperte
ssh_client.py # Wrapper Paramiko, recupero parallelo host
eventfeed.py # Rilevamento modifiche e pubblicazione webhook
templates/
base.html # Layout, CSS, navigazione
overview.html # Griglia dashboard host
host_detail.html # Vista dettaglio host a schede
diagnose.html # Modulo diagnostico connessione e risultati
login.html # Pagina di autenticazione
config.yaml # Definizioni host, VLAN, dispositivi, fuso orario
compose.yaml # Definizione servizio Docker Compose
Dockerfile # Immagine Python 3.12 slim
.env.example # Template per le variabili d'ambiente
ssh/ # Directory delle chiavi SSH (chiave non commessa)
data/ # Stato runtime (last_state.json, non commesso)
config.yaml sotto hosts:ssh-copy-id -i ssh/id_ed25519.pub utente@host/etc/sudoers.d/fencepost sull'host con le regole NOPASSWD richiestedocker compose up -d --buildQuando configurato in config.yaml con una variabile d'ambiente NOTIFICATIONS_API_KEY, FencePost pubblica eventi di modifica a ogni aggiornamento della dashboard:
Gli eventi includono chiavi di idempotenza per prevenire duplicati.
MIT
/host/{nome} | Dettaglio host con vista a schede: regole spiegate, porte scoperte, porte in ascolto, output grezzo |
/diagnose | Strumento diagnostico connessione con visualizzazione della traccia regola per regola |
/login | Autenticazione basata su sessione |
| Sezione | Scopo |
|---|
timezone | Fuso orario IANA per i timestamp visualizzati (es. Australia/Melbourne, UTC) |
hosts | Array di destinazioni SSH: name, hostname, ssh_user, ssh_port, is_docker_host |
ssh | key_path (percorso della chiave privata) e timeout in secondi |
networks | Mappatura CIDR-nome per le VLAN — usata nelle spiegazioni delle regole e nella diagnostica |
devices | IP nominati per i pulsanti di selezione rapida nella pagina di diagnostica |
notifications | Webhook opzionale: url, channel (la chiave API è impostata tramite variabile d'ambiente) |
| Variabile | Default | Descrizione |
|---|
FENCEPOST_USERNAME | admin | Nome utente per il login |
FENCEPOST_PASSWORD | fencepost | Password per il login |
FENCEPOST_SECRET_KEY | change-me | Chiave per la firma del cookie di sessione |
FENCEPOST_CONFIG | config.yaml | Percorso del file di configurazione |
NOTIFICATIONS_API_KEY | Token Bearer per il webhook di notifica |