Sito web con server NGINX + Cloudflare

Screenshot

Questo è un sistema improvvisato con un paio di Raspberry PI, una configurazione network solida, un server NGINX protetto da Cloudflare, certificati SSL/TLS e tanto altro.

Ho acquistato il dominio e l'ho puntato al mio server, approfittando dei record DNS per avere anche un'email personalizzata.


L'idea è molto semplice, però la difficoltà pricipale è stata che, prima di questo progetto, non avevo in realtà mai utilizzato Cloudflare, quindi ho dovuto imparare ad usarlo velocemente, sincronizzando in modo manuale le impostazioni con la mia configurazione NGINX (70+ righe).

Devo dire che il sistema dei Tunnel di Zero Trust è un'idea innovativa, non ho dovuto aprire nessuna porta del router, anzi, il firewall sul mio server blocca TUTTO il traffico in entrata, e in uscita accetta SOLTANTO gli IP pubblicamente appartenenti a Cloudflare, aggiornando frequentemente le regole con uno script automatizzato.
Ah si, ho anche vietato tutti i ping diretti al dispositivo con un po' di magia di Linux.

Innanzitutto, suddividiamo tutto in tre parti e in due livelli di comunicazione per capire meglio la struttura:

SERVER ◄-1-► CLOUDFLARE ◄-2-► CLIENT

 1 - Nel primo livello, ovvero la comunicazione tra il server e Cloudflare, ho utilizzato i certificati di origine per abilitare HTTPS, ho consentito l'ascolto soltanto sulla porta 443 e non 443/80, e altri accorgimenti.
In questo modo, anche se il sito non è accessibile con il suo indirizzo IP reale, la connessione è crittografata anche in caso di un'eventuale attacco tra il server e Cloudflare.

 2 - Nel secondo livello abbiamo invece la comunicazione tra Cloudflare ed il client. Non è necessario impostare certificati SSL/TLS qui, dato che vengono gestiti automaticamente da Cloudflare.
In ogni caso ho abilitato HSTS, SSL/TLS Full(Strict), HTTP2, ho forzato HTTPS su tutte le richieste, aggiunto direttive CSP (Content Security Policy) molto severe che vanno aggiornate spesso per evitare il blocco di risorse legittime, X-Frame-Options, Referrer-Policy, X-Content-Type-Options, ecc...


Ed è così la piattaforma supporta soltanto connessioni sicure in qualsiasi punto del tragitto, più altre modifiche minori su NGINX per limitare/modificare gli headers delle richieste in arrivo e in uscita, per il blocco dei bot con test CAPTCHA (quelli non interattivi non funzionavano contro i crawler di pagine sensibili!), e altre cose interessanti.


Sul contenuto del sito invece non c'è molto da dire, non ho utilizzato nessun framework ma soltanto HTML, CSS, PHP e un pizzico di Javascript. Essendo questo sito di piccole dimensioni, non mi sembrava necessario renderlo completamente dinamico, vista anche la limitata potenza dell'host.