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.