GNU/Linux >> Linux Esercitazione >  >> Linux

Come proteggere Nginx con Let's Encrypt certificato SSL

Let's Encrypt è un'autorità di certificazione (CA) gratuita, open source e automatizzata introdotta da Internet Security Research Group (ISRG) e offre certificati SSL/TLS per crittografare le comunicazioni che coinvolgono due parti.

Un certificato SSL nel tuo sito web non solo aumenterà la sicurezza del tuo sito web attraverso la crittografia, ma migliorerà anche il posizionamento SEO del tuo sito poiché Google ha reso obbligatorio includere un certificato SSL per un migliore posizionamento SEO.

In questo articolo, indagheremo su come proteggere un server NGINX con il certificato Let's Encrypt SSL in Ubuntu 18.04.

Prerequisiti

  • Hai i privilegi per aprire una sessione SSH nel server Ubuntu 18.04 usando un utente root o usando un utente abilitato sudo.
  • Hai già installato NGINX seguendo il nostro tutorial da qui.
  • Un nome di dominio registrato.
  • DNS Un record che punta all'indirizzo IP del tuo server in base al nome di dominio che desideri utilizzare.
Questo tutorial richiede l'uso di nomi di dominio. Ogni volta che vedi le variabili SUBDOMAIN, DOMAIN o TLD, sostituiscile con i tuoi valori.

Installa la libreria Let's Encrypt Client

Il primo passo che devi compiere è installare la libreria client Let's Encrypt che a sua volta verrà utilizzata per richiedere certificati dall'autorità LE. Un modo per farlo è clonare la libreria del client Let's Encrypt dal suo repository ufficiale nel tuo server.

È anche possibile installarlo dal repository ufficiale di Ubuntu. Nel repository di Ubuntu, la libreria client è nota come certbot fornito dagli sviluppatori Let's Encrypt. Ma sceglieremo il primo metodo per installarlo, ovvero clonando il repository Github di Let's Encrypt.

Per farlo, vai alla cartella di installazione scelta e clona il repository. Ho scelto la cartella di installazione come /usr/local , puoi scegliere un'altra cartella in base al tuo ambiente.


# apt-get install git
# cd /usr/local
# git clone https://github.com/letsencrypt/letsencrypt

Passa alla cartella letencrypt, troverai tutte le cartelle e i file clonati incluso certbot necessari a Let's encrypt per recuperare i certificati per te.

Elenco consente di crittografare la cartella

Configura Let's Encrypt per verificare il tuo dominio

Durante il processo di recupero di un certificato, il client Let's Encrypt crea un file temporaneo in .well-known/acme-challenge cartella. Questo file contiene un token per convalidare il fatto che possiedi effettivamente il dominio per il quale stai tentando di recuperare i certificati. Ricorda che la suddetta cartella rientra nella radice web del dominio.

Pertanto, è fondamentale che Let's Encrypt possa accedere al file temporaneo per verificare il dominio. Per concedere l'accesso, è necessario configurare NGINX poiché è il proprietario della web root del dominio. Aggiungi un blocco di posizione specifico per la cartella /.well-known/acme-challenge ciò consentirà a Let's Encrypt di posizionare un token per la verifica del dominio. Per farlo, modifica il file di configurazione NGINX per il tuo host virtuale. Non dimenticare di regolare la cartella principale in base al tuo ambiente.



    server {
            listen 80;
            server_name SUBDOMAIN.DOMAIN.TLD;
            root /var/www/html/wordpress;
            ...
            ...
            ...
            location /.well-known/acme-challenge {
               allow all; 
               default_type "text/plain";
            }
           ...
           ...
    }

Verifica che il file di configurazione sia sintatticamente corretto e riavvia NGINX:


# nginx -t 
# systemctl restart nginx

Configura Firewall UFW

Ubuntu 18.04 viene fornito con un gestore firewall predefinito UFW e se lo hai già abilitato ed è in esecuzione nel tuo server, nessuna connessione HTTP o HTTPS potrà raggiungere il server NGINX.

È anche possibile che tu stia tentando di installare i certificati su un server precedentemente configurato e che le regole del firewall siano già presenti. Ovviamente puoi elencare le regole del firewall usando ufw status comando nel tuo server prima di procedere con l'abilitazione delle connessioni HTTP e HTTPS nel tuo server Ubuntu 18.04.

Esegui la seguente serie di comandi nel terminale per consentire le connessioni HTTP e HTTPS nel tuo server.


# ufw status
# ufw allow http
# ufw allow https
# ufw reload

Richiedi certificato SSL Let's Encrypt

Richiediamo un certificato SSL per il dominio scelto utilizzando il client Let's Encrypt che abbiamo clonato in precedenza. Sebbene siano disponibili molte opzioni di configurazione che è possibile utilizzare con lo script Let's Encrypt durante la richiesta di un certificato, utilizzeremo solo le seguenti opzioni.

  1. Certamente :Questa opzione dice allo script Letencrypt di ottenere solo il certificato SSL. Effettueremo la configurazione di NGINX manualmente in seguito.
  2. webroot :questa opzione specifica il plugin webroot da utilizzare nel processo di convalida del nome di dominio.
  3. percorso webroot :questa opzione imposta la radice del dominio e deve essere indirizzata alla posizione del sito Web che hai configurato nella configurazione di NGINX.
  4. d'accordo :significa accettare i termini di servizio di Let's Encrypt.
  5. e-mail :L'e-mail viene utilizzata per ricevere l'avviso di scadenza da Let's Encrypt ma può essere utilizzata anche per recuperare la chiave persa.
  6. d :questa opzione specifica il nome di dominio per il quale verrà richiesto il certificato.

Ora combinando le opzioni precedenti con lo script client Letencrypt, richiedi un certificato utilizzando i seguenti comandi:


# cd /usr/local/letsencrypt
# ./letsencrypt-auto certonly --agree-tos --email [email protected] --webroot --webroot-path /var/www/html/wordpress -d SUBDOMAIN.DOMAIN.TLD

Recuperato consente di crittografare il certificato con successo

Lo script Let's Encrypt ti mostrerà una piccola nota una volta che i certificati SSL sono stati recuperati con successo e i certificati verranno archiviati in /etc/letsencrypt/live cartella.

Configura NGINX per il certificato SSL Let's Encrypt

A questo punto, la catena di certificati Let's Encrypt è stata salvata correttamente nel tuo server. Ora procedi con la configurazione del file host virtuale per un server web NGINX abilitato SSL protetto.

Genera la chiave Diffie-Hellman

Sebbene l'utilizzo della chiave Diffie-Hellman sia facoltativo durante la configurazione dei certificati Let's Encrypt con NGINX, viene utilizzato principalmente come metodo per lo scambio sicuro di chiavi di crittografia da utilizzare nel certificato Let's Encrypt.


# mkdir -p /etc/nginx/ssl
# cd /etc/nginx/ssl
# openssl dhparam -out /etc/nginx/ssl/dhparam.pem 4096

Ho inserito il file di parametro DH in /etc/nginx/ssl directory semplicemente per comodità. Puoi posizionare il file in un'altra posizione.

Configura parametri SSL

Successivamente, aggiungi parametri per la connessione SSL come versioni del protocollo, suite di crittografia, sessione, intestazioni che il tuo server dovrebbe supportare in un file separato.

Ciò creerà una potente suite di crittografia che abilita la segretezza in avanti quando possibile. Inoltre, consentiremo anche a HSTS e HPKP di rafforzare il server NGINX per le connessioni SSL. Ciò consentirà a una configurazione SSL robusta e a prova di futuro di ottenere un voto A+ nel test SSL di Qualys Labs .


# vi /etc/nginx/conf.d/ssl.conf
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:ECDHE-RSA-AES128-GCM-SHA256:AES256+EECDH:DHE-RSA-AES128-GCM-SHA256:AES256+EDH:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";
ssl_dhparam /etc/nginx/ssl/dhparam.pem;
server_tokens off;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
#Online Certificate Status Protocol Stapling
ssl_stapling on;
ssl_stapling_verify on;
ssl_session_tickets off;
#HTTP Strict Transport Security
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
ssl_trusted_certificate /etc/letsencrypt/live/SUBDOMAIN.DOMAIN.TLD/chain.pem;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
add_header X-Frame-Options DENY;
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options nosniff;
add_header X-Robots-Tag none;

Modifica host virtuale NGINX

Infine, modifica i blocchi del server NGINX per il dominio scelto. Passa alla posizione predefinita per i blocchi del server NGINX che è /etc/nginx/sites-available e modifica il file dell'host virtuale NGINX.


# vi /etc/nginx/sites-available/your_nginx_file.conf

server {
         listen 80;
         listen [::]:80;
         server_name SUBDOMAIN.DOMAIN.TLD;
         return 301 https://$host$request_uri;
}
...
...

Il blocco del server sopra indica a NGINX di ascoltare qualsiasi richiesta in arrivo nella porta 80 per il dominio SUBDOMAIN.DOMAIN.TLD e reindirizzare lo stesso alla sezione https, la cui configurazione è riportata di seguito.


...
...
server {
        listen 443 ssl http2;
        listen [::]:443 ssl http2;

        root   /var/www/html/wordpress;
        index index.html index.php index.htm;

        server_name  SUBDOMAIN.DOMAIN.TLD;
        error_log /var/log/nginx/SUBDOMAIN.DOMAIN.TLD-error.log debug;
        access_log /var/log/nginx/SUBDOMAIN.DOMAIN.TLD-access.log;

        ssl_certificate /etc/letsencrypt/live/SUBDOMAIN.DOMAIN.TLD/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/SUBDOMAIN.DOMAIN.TLD/privkey.pem;

        include /etc/nginx/conf.d/ssl.conf;

        location /.well-known/acme-challenge {
               allow all;
               default_type "text/plain";
        }

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

        location = /favicon.ico {
                log_not_found off;
                access_log off;
        }

        location = /robots.txt {
                allow all;
                log_not_found off;
                access_log off;
        }

        location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
                expires max;
                log_not_found off;
        }
}

Controllare il file di configurazione per eventuali errori sintattici:


# nginx -t 

Per attivare il blocco del server creare un collegamento simbolico del file di configurazione dell'host virtuale sopra all'interno di /etc/nginx/sites-enabled cartella.


# cd /etc/nginx/sites-enabled
# ln -s ../sites-available/your_nginx_file.conf .

Ricarica NGINX per applicare nuove impostazioni:


# systemctl reload nginx

Per analizzare la configurazione delle impostazioni SSL di cui sopra, punta il tuo browser su SSL Labs Test e digita il tuo nome di dominio e fai clic su "Invia". Attendi un minuto per visualizzare il riepilogo del test. Una valutazione A+ significa che abbiamo incluso la maggior parte delle opzioni SSL nel processo di protezione del server NGINX.

Rinnovo automatico del certificato Let's Encrypt

I certificati Let's Encrypt sono validi per 90 giorni. La logica di ciò è limitare i danni derivanti dal compromesso chiave e incoraggiare l'automazione.

Per automatizzare il processo di rinnovo del certificato, crea un cronjob utilizzando crontab e aggiungi una riga di script che verrà eseguita una volta alla settimana per rinnovare i certificati quando stanno per scadere.


# crontab -e
45 4 * * 6 cd /usr/local/letsencrypt/ && ./certbot-auto renew && systemctl restart nginx

Lo script a riga singola sopra verrà eseguito ogni sabato per verificare se i certificati sono in scadenza per il rinnovo e, in tal caso, rinnoverà i certificati seguito dal riavvio del server NGINX.

Nota che non è completamente ottimizzato perché il server NGINX verrà riavviato anche se il certificato non viene rinnovato. L'opzione migliore sarebbe scrivere uno script personalizzato per rinnovare il certificato SSL e riavviare il server NGINX se i certificati vengono effettivamente rinnovati.

Conclusione

In questo articolo abbiamo imparato come installare la libreria client Let's Encrypt, richiedere un certificato per il tuo dominio e come configurare i certificati SSL Let's Encrypt con NGINX. Inoltre, un esempio di cronjob mostra anche come occuparti regolarmente del processo di rinnovo del certificato.


Linux
  1. Come proteggere un account abilitato per cPanel con un certificato SSL Lets Encrypt

  2. Proteggi Nginx con Let's Encrypt SSL su Debian 10/11

  3. Proteggi Nginx con Let's Encrypt su Ubuntu 18.04 - Come farlo?

  4. Come proteggere Nginx con Let's Encrypt su Ubuntu 20.04

  5. Come installare Let's Encrypt SSL con Apache su Debian 11

Come installare Let's Encrypt SSL con Nginx su Ubuntu 16.04 LTS

Come proteggere un nome host Plesk con SSL

Proteggi Nginx con Let's Encrypt SSL Certificate su Ubuntu 18.04

Come proteggere il server LEMP con Let's Encrypt Free SSL su Ubuntu 18.04 VPS

Come proteggere Nginx con Let's Encrypt su CentOS 8

Come proteggere Nginx con Let's Encrypt su Ubuntu 20.04