Webserver sollten heutzutage Daten ausschließlich verschlüsselt übertragen. Wie das bei einem Linux-System bewerkstelligt werden kann, wird in diesem Artikel beschrieben. Zum Einsatz kommt der NGINX-Webserver mit Let’s Encrypt SSL-Zertifikaten auf einem vServer mit einer Ubuntu 20.04.3 LTS Installation. Zudem ist eine Domain vonnöten, die auf die IP des vServers zeigt.
Dieser Artikel orientiert sich an den Ausführungen von https://www.nginx.com/blog/using-free-ssltls-certificates-from-lets-encrypt-with-nginx/. Für Details sei daher darauf verwiesen.
Folgendes System wird auf dem vServer verwendet:
1
2
3
4
5
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 20.04.3 LTS
Release: 20.04
Codename: focal
Die Domain drstefankuhn.de zeigt auf die IP des o.g. vServer:
1
2
A @ 82.165.183.156 -
A www 82.165.183.156 -
Mit folgendem selbsterklärenden Script lassen sich NGINX und die Let’s encrypt SSL-Zertifikate auf dem vServer installieren. Außerdem wird eine automatische Erneuerung der Zertifikate über einen Eintrag in Crontab erreicht:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#!/bin/bash
#########################################################################################################
# - Installs nginx-light (web server) and certbot (let's encrypt ssl certificates)
# - Creates and enables an nginx entry for your domain (and your www.domain)
# - Registers/installs/auto-renews ssl certificates
#
# Configure your domain here:
export DOMAIN=drstefankuhn.de
#########################################################################################################
# Update package list
apt-get update
# Install web server and let's encrypt certbot
apt-get -y install nginx-light certbot python3-certbot-nginx
# Create nginx entry for your domain
cat >/etc/nginx/sites-available/${DOMAIN} <<EOL
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
server_name ${DOMAIN} www.${DOMAIN};
index index.html index.htm index.nginx-debian.html;
location / {
try_files \$uri \$uri/ =404;
}
}
EOL
# Enable that new nginx entry
ln -s /etc/nginx/sites-available/${DOMAIN} /etc/nginx/sites-enabled/${DOMAIN}
# Disable default nginx entry
rm /etc/nginx/sites-enabled/default
# Reload nginx
nginx -t && nginx -s reload
# Register domain and www.domain and install certificates
certbot -n -d ${DOMAIN} -d www.${DOMAIN} --nginx --register-unsafely-without-email --agree-tos --redirect
# Add automatic renewing of certificates
echo "0 12 * * * /usr/bin/certbot renew --quiet" | crontab -
Dieses Script bedarf einer einmaligen Ausführung auf dem einzurichtenden System. Die verwendete Domain kann an der gekennzeichneten Stelle konfiguriert werden.
Zu beachten ist, dass im certbot
-Befehl den Let’s encrypt-Vereinbarungen automatisch mittels der Option --agree-tos
zugestimmt wird: https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf.
Das Ergebnis sieht dann wie folgt aus:
Eine Anonymisierung der IPs in den log-Dateien kann durch folgende Ergänzung in der NGINX-Konfiguration /etc/nginx/nginx.conf
Abschnitt http
erreicht werden (- siehe auch https://stackoverflow.com/a/45405406 und https://chriswiegman.com/2019/09/anonymizing-nginx-logs/):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[...]
##
# Logging Settings
##
map $remote_addr $remote_addr_anonymized {
~(?P<ip>\d+\.\d+\.\d+)\. $ip.0;
~(?P<ip>[^:]+:[^:]+): $ip::;
127.0.0.1 $remote_addr;
::1 $remote_addr;
default 0.0.0.0;
}
log_format anonymized '$remote_addr_anonymized - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log anonymized;
[...]
Nach Änderung der Konfiguration muss NGINX neu gestartet werden: systemctl restart nginx
.
Update 29.08.2023: Zu diesem Artikel gibt es einen Folgeartikel Update: Webserver mit SSL im Docker Container. Dort wird beschrieben, wie sich der hier beschriebene Webserver in einen Docker Container verlagern lässt.