Nginx installeren met Let’s Encrypt + SSL hardening (A+ in SSLLabs Test)

In deze handleiding laat ik je stap-voor-stap zien hoe je de Nginx webserver installeert en configureert met een Letsencrypt certificaat. Deze gids vertelt je over het installeren van Nginx webserver, het installeren van het let’s encrypt gereedschap, het genereren van SSL certificaat letsencrypt, het configureren van de nginx virtuele host met SSL, en het maken van aanvullende SSL configuratie om de A+ te krijgen van de SSL test SSL Labs.

Vereisten

  • Linux server – Ubuntu 18.04 of CentOS 7.5
  • Root rechten

Wat zullen we doen?

  1. Nginx webserver installeren
  2. Configureer Firewall UFW/Firewalld
  3. Installeer let’s encrypt en genereer SSL Certificaat
  4. Beveilig SSL configureren
  5. Configureer Nginx Virtuele Host met SSL
  6. Testen van

Stap 1 – Installeer Nginx Web Server

In deze handleiding begeleiden we je bij het installeren en instellen van de Nginx webserver met Letsencrypt op beide Linux servers – Ubuntu 18.04 en CentOS 7.5.

Op Ubuntu 18.04.

Werk de repository bij en installeer dan nginx met het onderstaande apt commando.

sudo apt update
sudo apt install nginx -y

Op CentOS 7.5.

Installeer de EPEL repository op het CentOS systeem en installeer Nginx met yum commando.

sudo yum install epel-release -y
sudo yum install nginx -y

Nadat de installatie voltooid is, start je de Nginx service en zet je hem aan om elke keer bij het opstarten van het systeem te starten.

systemctl start nginx
systemctl enable nginx

De Nginx webserver is nu geĆÆnstalleerd, en hij draait op standaard HTTP poort 80. Controleer het met het onderstaande netstat commando.

netstat -plntu

Installeer Nginx webserver

Stap 2 – Configureer Firewall UFW – Firewalld

Het is aan te bevelen om de Firewall op de server aan te zetten en de specifieke poort te openen als dat nodig is. In deze stap laten we zien hoe je SSH, HTTP, en HTTPS poorten opent op Linux servers Ubuntu 18.04 met UFW firewall, en Firewalld op CentOS 7.5 systeem.

Op Ubuntu 18.04 – UFW Firewall

Voor je de UFW Firewall op Ubuntu systeem inschakelt, moet je controleren of de SSH poort ingeschakeld is op de lijst firewall configuratie.

Voeg de SSH dienstpoort toe aan de firewall configuratie met het ufw commando en schakel dan de UFW firewall dienst in.

ufw allow ssh
ufw enable

Voeg nu de HTTP en HTTPS diensten toe.

ufw allow http
ufw allow https

De SSH, HTTP, en HTTPS dienstpoorten zijn toegevoegd aan de UFW firewall dienstlijst, controleer dat met het onderstaande commando.

ufw status

Configureer UFW Firewall

Op CentOS 7.5 – Firewalld

Voor je poorten en diensten aan de firewalld toevoegt, moet je zorgen dat de firewalld dienst draait.

Start de firewalld dienst en zet hem aan om telkens bij het opstarten van het systeem te starten.

systemctl start firewalld
systemctl enable firewalld

Opmerking:

  • De SSH dienst wordt standaard ingeschakeld op de Firewald dienstenlijst.

Voeg nu de HTTP en HTTPS diensten toe met het onderstaande firewall-cmd commando.

firewall-cmd --add-service=http --permanent
firewall-cmd --add-service=https --permanent

Herlaad de firewalld configuratie en controleer de dienstenlijst.

firewall-cmd --reload
firewall-cmd --list-services

En je krijgt de SSH, HTTP, en HTTPS diensten op de lijst.

Firewalld configureren

Stap 3 – Installeer Let’s Encrypt en genereer certificaten

In deze stap installeren we het letsencrypt gereedschap, en genereren we de sterke SSL certificaten Letsencrypt met het cerbot commando.

Op Ubuntu 18.04

Installeer de letsencrypt pakketten met het onderstaande apt commando.

sudo apt install letsencrypt -y

Op CentOS 7.5

Installeer nu de letsencrypt pakketten op CentOS 7 met het onderstaande yum commando.

sudo yum install certbot -y

Nadat de installatie voltooid is, maken we een nieuwe configuratie die gebruikt zal worden voor het genereren van SSL certificaat bestanden.

Op Ubuntu 18.04

Ga naar de ‘/etc/nginx’ configuratie directory en maak een nieuw configuratiebestand ‘cerbot.conf’ onder de ‘snippets’ directory.

cd /etc/nginx/
vim snippets/certbot.conf

Plak er de volgende configuratie in.

    location /.well-known {
        alias /var/www/html/.well-known;
    }

Bewaar en sluit af.

Bewerk nu het standaard Nginx virtual host bestand.

vim sites-available/default

Voeg de volgende configuratie toe onder de ‘server {..}’ blokken.

    include snippets/certbot.conf;

Bewaar en sluit af.

Op CentOS 7.5

Ga naar de ‘/etc/nginx’ configuratiemap en maak een nieuw configuratiebestand ‘certbot.conf’ onder de ‘default.d’ map.

cd /etc/nginx/
vim default.d/certbot.conf

Plak de configuratie hieronder.

    location /.well-known {
        alias /usr/share/nginx/html/.well-known;
    }

Bewaar en sluit af.

Test nu de nginx configuratie en controleer of er geen fout optreedt, start dan de nginx dienst opnieuw.

nginx -t
systemctl restart nginx

Genereer nu de SSL letsencrypt certificaten met het certbot commando.

Op Ubuntu 18.04

certbot certonly --rsa-key-size 4096 --webroot --agree-tos --no-eff-email --email [email protected] -w /var/www/html -d hakase-labs.io

Op CentOS 7.5

certbot certonly --rsa-key-size 4096 --webroot --agree-tos --no-eff-email --email [email protected] -w /usr/share/nginx/html -d hakase-labs.io

Opmerking:

  • We specificeren de RSA sleutelgrootte voor ons domein op ‘4096’, en we definiĆ«ren de authenticatie methode naar de standaard web root directory ‘/var/www/html’ op Ubuntu systeem, en ‘/usr/share/nginx/html’ directory voor CentOS 7 systeem.

<img src=”https://www.howtoforge.com/images/set_up_nginx_with_letsencrypt_and_get_a_from_ssllabs_test/3.png” alt=”Maak Let’s encrypt SSL certificaat” width=”500″ height=”224″ /></p>
<p>Wanneer dit voltooid is, krijg je alle SSL certificaat bestanden voor de domeinnaam in de ‘/etc/letsencrypt/live’ directory.

Om een extra beveiliging te krijgen, genereren we de DHPARAM sleutel ‘4096’ met het OpenSSL commando zoals hieronder.

openssl dhparam -out /etc/nginx/dhparam.pem 4096

De DHPARAM sleutel is gegenereerd in de ‘/etc/nginx’ directory.

Stap 4 – SSL configuratie

In deze stap bepalen we de SSL configuratie voor de Nginx webserver. We maken nieuwe configuratie ‘ssl.conf’ die getweakte SSL configuratie beveiliging gericht op Nginx webserver bevat.

Op Ubuntu 18.04

Ga naar de ‘/etc/nginx/’ configuratie directory en maak nieuwe SSL configuratie ‘ssl.conf’ onder de ‘snippets’ directory.

cd /etc/nginx/
vim snippets/ssl.conf

Op CentOS 7.5

Ga naar de ‘/etc/nginx/’ configuratiemap en maak nieuwe SSL configuratie ‘ssl/conf’ aan onder de map ‘default.d’.

cd /etc/nginx/
vim default.d/ssl.conf

Plak er de volgende SSL configuratie in.

# Specify the TLS versions
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;

# Ciphersuites recommendation from the chiper.li
# Use this chipersuites to get 100 points of the SSLabs test
# Some device will not support
#ssl_ciphers "ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384";

# Mozilla Ciphersuits Recommendation
# Use this for all devices supports
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';

# Use the DHPARAM key and ECDH curve >= 256bit
ssl_ecdh_curve secp384r1;
ssl_dhparam /etc/nginx/dhparam.pem;

server_tokens off;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;

# Enable HTTP Strict-Transport-Security
# If you have a subdomain of your site,
# be carefull to use the 'includeSubdomains' options
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";

# Enable OSCP Stapling for Nginx web server
# If you're using the SSL from Letsencrypt,
# use the 'chain.pem' certificate
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/letsencrypt/live/hakase-labs.io/chain.pem;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;

# XSS Protection for Nginx web server
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;

Bewaar en sluit af.

Opmerking:

  • Specificeer de TLS versies voor de site, accepteer alleen de TLSv1 TLSv1.1 TLSv1.2.
  • Specificeer de SSL cijfersuite, en het is aan te bevelen de SSL cijfersuite van de Mozilla suggestie te gebruiken om alle apparaten compatibel te krijgen.
  • Schakel HSTS in, OSCP Stapling, en voeg de XSS bescherming toe.

Stap 5 – Configureer Nginx Virtuele Host met SSL

In deze stap maken we een virtual host bestand aan voor de domeinnaam. We maken een nieuwe virtuele host, een domein met de naam hakase-labs.io, en zijn web root directory komt in de ‘/var/www/site01’ directory te staan.

Maak de nieuwe directory ‘/var/www/site01’ en maak er het ‘index.html’ bestand in.

mkdir -p /var/www/site01
echo '<h1><center>Nginx - Letsencrypt - A+</center></h1>' > /var/www/site01/index.html

Ga nu naar de ‘/etc/nginx’ configuratie directory en maak een nieuw virtual host bestand aan met de naam ‘hakase-labs.io’ voor ubuntu, en ‘hakase-labs.conf’ voor CentOS 7 systeem.

Op Ubuntu 18.04

cd /etc/nginx/
vim sites-available/hakase-labs.io

Op CentOS 7.5

cd /etc/nginx/
vim conf.d/hakase-labs.conf

Plak er de volgende voorbeeld Nginx virtuele host configuratie in.

server {
    listen 80;
    listen [::]:80;
    server_name hakase-labs.io;

    return 301 https://$host$request_uri;
}

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

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

        server_name  hakase-labs.io;
        error_log /var/log/nginx/hakase-error.log warn;

        ssl_certificate /etc/letsencrypt/live/hakase-labs.io/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/hakase-labs.io/privkey.pem;

        #SSL Configuration
        include snippets/ssl.conf;

        location ~ /.well-known {
                allow all;
        }


        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;
        }

}

Sla op en sluit af.

Opmerking:

  • Verander de regel ‘include snippets/ssl.conf;’. Als je Ubuntu gebruikt, laat die dan standaard staan. En als je CentOS gebruikt, verander de directory in ‘default.d/ssl.conf’.

Alleen op Ubuntu systeem

Schakel het nieuwe virtual host bestand in en test de configuratie, en controleer of er geen fout optreedt.

ln -s /etc/nginx/sites-available/hakase-labs.io /etc/nginx/sites-enabled/
nginx -t

Start nu de nginx dienst opnieuw.

systemctl restart nginx

De nieuwe virtuele host met de HTTPS ingeschakeld en een extra SSL configuratie is aangemaakt.

Controleer met het netstat commando en je krijgt de HTTPS poort 443 op de lijst.

netstat -plntu

Nginx configureren

Stap 6 – Testen

Open je web browser en typ de naam van je domein in, de mijne is ‘http://hakase-labs.io’.

Test nginx

En je wordt doorgestuurd naar de HTTPS verbinding.

Ga nu naar de SSL testsite‘https://www.ssllabs.com/ssltest/‘ en typ je eigen domeinnaam in, wacht dan tot je de resultaten krijgt.

Hieronder staat mijn resultaat van het gebruik van de ‘Mozilla Ciphersuite Recommendation’.

A+ resultaat van SSL Labs

En hier volgt mijn resultaat van het gebruik van de ‘Cipher.li Ciphersuite Recommendation’.

Met Cipher.li Ciphersuite Aanbeveling

Je ziet dat alle resultaten ‘A+’ zijn, en alleen verschillen op de ‘Cipher Strength’ bij de Mozilla aanbevelingen en de Cipherli.st Aanbeveling.

Om de OSCP Stapling en de HSTS op de server te controleren, scroll je door de testresultaten pagina en je krijgt het resultaat zoals hieronder.

OSCP stapelen

Als je de OSCP Stapling vanaf de commandoregel wilt controleren, doe dat dan met het volgende commando.

echo QUIT | openssl s_client -connect hakase-labs.io:443 -status 2> /dev/null | grep -A 17 'OCSP response:' | grep -B 17 'Next Update'

controleer het OSCP nieten vanaf de commandoregel

Voor het testen van HSTS controleer je het met het onderstaande curl commando.

curl -s -D- https://hakase-labs.io | grep -i Strict

HSTS testen

De Nginx webserver installatie en configuratie met SSL Letsencrypt en het behalen van de A+ uit de SSLabs test zijn met succes afgerond.

Referenties