Come ospitare un sito Web utilizzando Cloudflare e Nginx su Ubuntu 22.04

L’autore ha selezionato l’Electronic Frontier Foundation per ricevere una donazione come parte del programma Write for Donations.

Introduzione

Cloudflare è un servizio che si colloca tra il visitatore e il server del proprietario del sito web, agendo come un proxy inverso per i siti web. Cloudflare fornisce una rete di distribuzione dei contenuti (CDN), oltre a servizi di mitigazione degli attacchi DDoS e server di nomi di dominio distribuiti.

Nginx è un server web popolare responsabile dell’hosting di alcuni dei siti più grandi e più frequentati su Internet. È comune che le organizzazioni servano siti web con Nginx e utilizzino Cloudflare come CDN e provider DNS.

In questo tutorial, proteggerai il tuo sito web servito da Nginx con un certificato Origin CA da Cloudflare e quindi configurerai Nginx per utilizzare richieste di pull autenticate. I vantaggi di utilizzare questa configurazione sono che beneficerai della CDN di Cloudflare e della rapida risoluzione DNS mentre assicuri che tutte le connessioni passino attraverso Cloudflare. Questo impedisce che eventuali richieste dannose raggiungano il tuo server.

Prerequisiti

Per completare questo tutorial, avrai bisogno dei seguenti elementi:

Passaggio 1 — Generare un Certificato TLS CA di Origine

Il Certificato TLS CA di Origine di Cloudflare ti permette di generare un certificato TLS gratuito firmato da Cloudflare da installare sul tuo server Nginx. Utilizzando il certificato TLS generato da Cloudflare, puoi proteggere la connessione tra i server di Cloudflare e il tuo server Nginx.

Per generare un certificato con Origin CA, accedi al tuo account Cloudflare in un browser web. Seleziona il dominio che desideri proteggere e vai alla sezione SSL/TLS del tuo cruscotto Cloudflare. Da lì, vai alla scheda Server di origine e clicca sul pulsante Crea Certificato:

Lascia selezionata l’opzione predefinita Genera chiave privata e CSR con Cloudflare.

Clicca su Crea e vedrai una finestra di dialogo con il Certificato di Origine e la Chiave privata. Devi trasferire sia il certificato di origine che la chiave privata da Cloudflare al tuo server. Per motivi di sicurezza, le informazioni sulla Chiave Privata non verranno visualizzate nuovamente, quindi copia la chiave sul tuo server prima di fare clic su Ok.

Userai la directory /etc/ssl sul server per conservare i file del certificato di origine e della chiave privata. La cartella esiste già sul server.

Prima, copia il contenuto del Certificato di Origine mostrato nella finestra di dialogo nel tuo browser.

Quindi, sul tuo server, apri /etc/ssl/cert.pem nel tuo editor di testo preferito:

  1. sudo nano /etc/ssl/cert.pem

Incolla il contenuto del certificato nel file. Quindi salva ed esci dall’editor. Se stai usando nano, premi Ctrl+X, poi quando richiesto, Y e poi Invio.

Torna poi al tuo browser e copia il contenuto della Chiave privata. Apri il file /etc/ssl/key.pem per modificarlo:

  1. sudo nano /etc/ssl/key.pem

Incolla la chiave privata nel file, salva il file ed esci dall’editor.

Nota: A volte, quando si copiano il certificato e la chiave dal pannello di controllo di Cloudflare e li si incollano nei file pertinenti sul server, vengono inserite righe vuote. Nginx tratterà tali certificati e chiavi come non validi, quindi assicurati che non ci siano righe vuote nei tuoi file.

Avviso: Il certificato Origin CA di Cloudflare è affidato solo da Cloudflare e quindi dovrebbe essere utilizzato solo da server di origine che sono attivamente connessi a Cloudflare. Se in qualsiasi momento metti in pausa o disabiliti Cloudflare, il tuo certificato Origin CA produrrà un errore di certificato non attendibile.

Ora che hai copiato i file della chiave e del certificato sul tuo server, è necessario aggiornare la configurazione di Nginx per utilizzarli.

Passaggio 2 — Installazione del certificato Origin CA in Nginx

Nella sezione precedente, hai generato un certificato di origine e una chiave privata utilizzando il pannello di controllo di Cloudflare e salvato i file sul tuo server. Ora aggiornerai la configurazione di Nginx per il tuo sito in modo da utilizzare il certificato di origine e la chiave privata per proteggere la connessione tra i server di Cloudflare e il tuo server.

Prima di tutto, assicurati che UFW consenta il traffico HTTPS. Abilita Nginx Full, che aprirà sia la porta 80 (HTTP) che la porta 443 (HTTPS):

  1. sudo ufw allow 'Nginx Full'

Ora ricarica UFW:

  1. sudo ufw reload

Infine, controlla che le tue nuove regole siano consentite e che UFW sia attivo:

  1. sudo ufw status

Vedrai un output come questo:

Output
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere Nginx Full ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Nginx Full (v6) ALLOW Anywhere (v6)

Ora sei pronto per regolare il blocco del server Nginx. Nginx crea un blocco del server predefinito durante l’installazione. Rimuovilo se esiste ancora, poiché hai già configurato un blocco del server personalizzato per il tuo dominio:

  1. sudo rm /etc/nginx/sites-enabled/default

Successivamente, apri il file di configurazione Nginx per il tuo dominio:

  1. sudo nano /etc/nginx/sites-available/your_domain

Il file dovrebbe apparire così:

/etc/nginx/sites-available/your_domain
server {
        listen 80;
        listen [::]:80;

        root /var/www/your_domain/html;
        index index.html index.htm index.nginx-debian.html;

        server_name your_domain www.your_domain;

        location / {
                try_files $uri $uri/ =404;
        }
}

Modificherai il file di configurazione di Nginx per fare quanto segue:

  • Ascolta sulla porta 80 e reindirizza tutte le richieste per utilizzare https.
  • Ascolta sulla porta 443 e utilizza il certificato di origine e la chiave privata aggiunti nella sezione precedente.

Modifica il file in modo che appaia come segue:

/etc/nginx/sites-available/your_domain
server {
    listen 80;
    listen [::]:80;
    server_name your_domain www.your_domain;
    return 302 https://$server_name$request_uri;
}

server {

    # Configurazione SSL

    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    ssl_certificate         /etc/ssl/cert.pem;
    ssl_certificate_key     /etc/ssl/key.pem;

    server_name your_domain www.your_domain;

    root /var/www/your_domain/html;
    index index.html index.htm index.nginx-debian.html;


    location / {
            try_files $uri $uri/ =404;
    }
}

Salva il file ed esci dall’editor.

Successivamente, verifica per assicurarti che non ci siano errori di sintassi in nessuno dei tuoi file di configurazione Nginx:

  1. sudo nginx -t

Se non hai riscontrato problemi, riavvia Nginx per abilitare le tue modifiche:

  1. sudo systemctl restart nginx

Ora vai alla sezione SSL/TLS del pannello di controllo di Cloudflare, vai alla scheda Panoramica, e cambia la modalità di crittografia SSL/TLS in Completo (rigoroso). Questo informa Cloudflare di crittografare sempre la connessione tra Cloudflare e il tuo server Nginx di origine.

Ora visita il tuo sito web su https://tuo_dominio per verificare che sia configurato correttamente. Vedrai visualizzata la tua home page e il browser segnalerà che il sito è sicuro.

Per visualizzare i dettagli del tuo certificato, accedi agli Strumenti per sviluppatori del browser, seleziona la scheda Sicurezza, e quindi clicca su Visualizza certificato.

Nota: Potresti notare che il tuo certificato non elenca Cloudflare come emittente. Questo perché Cloudflare potrebbe utilizzare altre autorità di certificazione, come Let’s Encrypt. Per una lista completa, consulta la documentazione del prodotto di Cloudflare per le autorità di certificazione.

Nella sezione successiva, configurerai le Richieste di origine autenticate per verificare che il tuo server di origine stia effettivamente comunicando con Cloudflare e non con un altro server. In questo modo, Nginx sarà configurato per accettare solo le richieste che utilizzano un certificato client valido da Cloudflare; tutte le richieste che non sono passate attraverso Cloudflare verranno respinte.

Passaggio 3 — Configurazione delle Richieste di origine autenticate

Il certificato Origin CA aiuterà Cloudflare a verificare di essere in comunicazione con il server di origine corretto. Questo passaggio utilizzerà l’Autenticazione client TLS per verificare che il tuo server di origine Nginx stia comunicando con Cloudflare.

In una handshake TLS autenticata dal client, entrambe le parti forniscono un certificato da verificare. Il server di origine è configurato per accettare solo le richieste che utilizzano un certificato client valido da Cloudflare. Le richieste che non sono passate attraverso Cloudflare verranno scartate in quanto non avranno il certificato di Cloudflare. Ciò significa che gli attaccanti non possono aggirare le misure di sicurezza di Cloudflare e connettersi direttamente al tuo server Nginx.

Cloudflare presenta certificati firmati da un CA con il seguente certificato:

-----BEGIN CERTIFICATE-----
MIIGCjCCA/KgAwIBAgIIV5G6lVbCLmEwDQYJKoZIhvcNAQENBQAwgZAxCzAJBgNV
BAYTAlVTMRkwFwYDVQQKExBDbG91ZEZsYXJlLCBJbmMuMRQwEgYDVQQLEwtPcmln
aW4gUHVsbDEWMBQGA1UEBxMNU2FuIEZyYW5jaXNjbzETMBEGA1UECBMKQ2FsaWZv
cm5pYTEjMCEGA1UEAxMab3JpZ2luLXB1bGwuY2xvdWRmbGFyZS5uZXQwHhcNMTkx
MDEwMTg0NTAwWhcNMjkxMTAxMTcwMDAwWjCBkDELMAkGA1UEBhMCVVMxGTAXBgNV
BAoTEENsb3VkRmxhcmUsIEluYy4xFDASBgNVBAsTC09yaWdpbiBQdWxsMRYwFAYD
VQQHEw1TYW4gRnJhbmNpc2NvMRMwEQYDVQQIEwpDYWxpZm9ybmlhMSMwIQYDVQQD
ExpvcmlnaW4tcHVsbC5jbG91ZGZsYXJlLm5ldDCCAiIwDQYJKoZIhvcNAQEBBQAD
ggIPADCCAgoCggIBAN2y2zojYfl0bKfhp0AJBFeV+jQqbCw3sHmvEPwLmqDLqynI
42tZXR5y914ZB9ZrwbL/K5O46exd/LujJnV2b3dzcx5rtiQzso0xzljqbnbQT20e
ihx/WrF4OkZKydZzsdaJsWAPuplDH5P7J82q3re88jQdgE5hqjqFZ3clCG7lxoBw
hLaazm3NJJlUfzdk97ouRvnFGAuXd5cQVx8jYOOeU60sWqmMe4QHdOvpqB91bJoY
QSKVFjUgHeTpN8tNpKJfb9LIn3pun3bC9NKNHtRKMNX3Kl/sAPq7q/AlndvA2Kw3
Dkum2mHQUGdzVHqcOgea9BGjLK2h7SuX93zTWL02u799dr6Xkrad/WShHchfjjRn
aL35niJUDr02YJtPgxWObsrfOU63B8juLUphW/4BOjjJyAG5l9j1//aUGEi/sEe5
lqVv0P78QrxoxR+MMXiJwQab5FB8TG/ac6mRHgF9CmkX90uaRh+OC07XjTdfSKGR
PpM9hB2ZhLol/nf8qmoLdoD5HvODZuKu2+muKeVHXgw2/A6wM7OwrinxZiyBk5Hh
CvaADH7PZpU6z/zv5NU5HSvXiKtCzFuDu4/Zfi34RfHXeCUfHAb4KfNRXJwMsxUa
+4ZpSAX2G6RnGU5meuXpU5/V+DQJp/e69XyyY6RXDoMywaEFlIlXBqjRRA2pAgMB
AAGjZjBkMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/AgECMB0GA1Ud
DgQWBBRDWUsraYuA4REzalfNVzjann3F6zAfBgNVHSMEGDAWgBRDWUsraYuA4REz
alfNVzjann3F6zANBgkqhkiG9w0BAQ0FAAOCAgEAkQ+T9nqcSlAuW/90DeYmQOW1
QhqOor5psBEGvxbNGV2hdLJY8h6QUq48BCevcMChg/L1CkznBNI40i3/6heDn3IS
zVEwXKf34pPFCACWVMZxbQjkNRTiH8iRur9EsaNQ5oXCPJkhwg2+IFyoPAAYURoX
VcI9SCDUa45clmYHJ/XYwV1icGVI8/9b2JUqklnOTa5tugwIUi5sTfipNcJXHhgz
6BKYDl0/UP0lLKbsUETXeTGDiDpxZYIgbcFrRDDkHC6BSvdWVEiH5b9mH2BON60z
0O0j8EEKTwi9jnafVtZQXP/D8yoVowdFDjXcKkOPF/1gIh9qrFR6GdoPVgB3SkLc
5ulBqZaCHm563jsvWb/kXJnlFxW+1bsO9BDD6DweBcGdNurgmH625wBXksSdD7y/
fakk8DagjbjKShYlPEFOAqEcliwjF45eabL0t27MJV61O/jHzHL3dknXeE4BDa2j
bA+JbyJeUMtU7KMsxvx82RmhqBEJJDBCJ3scVptvhDMRrtqDBW5JShxoAOcpFQGm
iYWicn46nPDjgTU0bX1ZPpTpryXbvciVL5RkVBuyX2ntcOLDPlZWgxZCBp96x07F
AnOzKgZk4RzZPNAxCXERVxajn/FLcOhglVAKo5H0ac+AitlQ0ip55D2/mf8o72tM
fVQ6VpyjEXdiIXWUq/o=
-----END CERTIFICATE-----

Puoi anche scaricare il certificato direttamente dalla documentazione di Cloudflare.

Copia questo certificato.

Quindi crea il file /etc/ssl/cloudflare.crt per contenere il certificato di Cloudflare:

  1. sudo nano /etc/ssl/cloudflare.crt

Aggiungi il certificato al file. Quindi salva il file ed esci dall’editor.

Ora aggiorna la configurazione del tuo Nginx per utilizzare gli Origin Pulls autenticati TLS. Apri il file di configurazione per il tuo dominio:

  1. sudo nano /etc/nginx/sites-available/your_domain

Aggiungi le direttive ssl_client_certificate e ssl_verify_client come mostrato nell’esempio seguente:

/etc/nginx/sites-available/your_domain
. . .

server {

    # Configurazione SSL

    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    ssl_certificate         /etc/ssl/cert.pem;
    ssl_certificate_key     /etc/ssl/key.pem;
    ssl_client_certificate /etc/ssl/cloudflare.crt;
    ssl_verify_client on;

    . . .

Salva il file ed esci dall’editor.

Successivamente, testa Nginx per assicurarti che non ci siano errori di sintassi nella configurazione di Nginx:

  1. sudo nginx -t

Se non sono stati riscontrati problemi, riavvia Nginx per abilitare le tue modifiche:

  1. sudo systemctl restart nginx

Finalmente, per abilitare le Richieste Autenticate, apri la sezione SSL/TLS nel pannello di controllo di Cloudflare, vai alla scheda Server di Origine e attiva l’opzione Richieste di Origine Autenticate.

Ora visita il tuo sito web su https://tuo_dominio per verificare che sia stato configurato correttamente. Come prima, vedrai la tua homepage visualizzata.

Per verificare che il tuo server accetti solo richieste firmate dal CA di Cloudflare, disattiva l’opzione Richieste di Origine Autenticate e poi ricarica il tuo sito web. Dovresti ricevere il seguente messaggio di errore:

Il tuo server di origine genera un errore se il CA di Cloudflare non firma una richiesta.

Nota: La maggior parte dei browser memorizzerà le richieste, quindi per vedere la modifica sopra puoi utilizzare la modalità di navigazione in incognito/privata nel tuo browser. Per impedire a Cloudflare di memorizzare le richieste durante la configurazione del tuo sito web, vai a Panoramica nel pannello di controllo di Cloudflare e attiva Modalità Sviluppo.

Ora che sai che funziona correttamente, torna alla sezione SSL/TLS nel pannello di controllo di Cloudflare, vai alla scheda Server di Origine e riattiva l’opzione Richieste di Origine Autenticate.

Conclusione

In questo tutorial, hai protetto il tuo sito web alimentato da Nginx crittografando il traffico tra Cloudflare e il server Nginx utilizzando un certificato CA di origine da Cloudflare. Successivamente, hai configurato Origin Pulls Autenticati sul server Nginx per garantire che accetti solo le richieste dei server Cloudflare, impedendo a chiunque altro di connettersi direttamente al server Nginx.

Source:
https://www.digitalocean.com/community/tutorials/how-to-host-a-website-using-cloudflare-and-nginx-on-ubuntu-22-04