nginx: Strong SSL Security on nginx

Beim Prüfen der nginx SSL-Konfiguration bin ich auf folgende Seite gestossen: Raymii.org: Strong SSL Security on nginx. Hier wird ausführlich beschrieben wie man die SSL-Konfiguration seines nginx Webserver stärkt. Eine weitere aktuellere Seite ist: sherbers.de: Sichere TLS Konfiguration mit NGINX.

Prüfen kann man die Konfiguration auf: ssllabs.com

Hat man die wichtigsten Einstellungen vorgenommen, sollte der SSL-Report mindestens eine A Bewertung anzeigen.

SSL-Report Bewertung
SSL-Report “monsterli.ch” Bewertung

 

Nützliche Links:

Raymii.org: Strong SSL Security on nginx

sherbers.de: Sichere TLS Konfiguration mit NGINX

ssllabs.com: SSL Server Test

 

 

Ubuntu: Apache2 Kommandos

Starten:

> sudo service apache2 start

Stoppen:

> sudo service apache2 stop

Neustarten:

> sudo service apache2 restart

Konfiguration aktualsieren:

> sudo service apache2 reload

Syntax der Konfiguration prüfen:

> apache2ctl configtest

Status anzeigen:

> sudo service apache2 status

Geladene Module anzeigen:

> apache2ctl -M

Modul aktivieren:

> sudo a2enmod

Modul deaktivieren:

> sudo a2dismod

Aktivieren eines virtuellen Hosts:

> sudo a2ensite <name>.conf

Deaktivieren eines virtuellen Hosts:

> sudo a2dissite <name>.conf

Layout der Konfiguration unter Ubuntu:

/etc/apache2/
|-- apache2.conf
|        -- ports.conf
|-- mods-enabled
|        -- *.load
|        -- *.conf
|-- conf-enabled
|        -- *.conf
|-- sites-enabled
|        -- *.conf

Standard Dokumentverzeichnis (Docoument root):

/var/www/html

Nützliche Links

Ubuntu documentation: HTTPD – Apache2 Webservice

Cheat-sheet: Apache2 Commands

Kostenloses StartSSL Serverzertifikat einrichten beim NGINX Webserver

Achtung:
Mozilla und Google haben der Zertifizierungsstelle das Vertrauen entzogen, somit werden die meisten StartSSL-Zertifikate nicht mehr als vertrauenswürdig anerkannt. Als eine gute und freie Alternative kann Let’s Encrypt eingesetzt werden.

Zum Installieren eines kostenloses StartSSL-Zertifikates auf einem NGINX Webserver, braucht es folgende Schritte:

  1. Ein Zertifikat bei StartSSL erstellen
  2. Den neu erstellten privaten Schlüssel mit “Copy & Paste” in eine Datei, mit den Namen ssl.key, speichern
  3. Die Datei ssl.key mit einem geeigneten Tool, beispielsweise WinSCP für Windows Benutzer, auf den Webserver kopieren
  4. Mit Hilfe von OpenSSL muss der private Schlüssel, auf dem Server, entschlüsselt gespeichert werden: openssl rsa -in ssl.key -out server.key
    (Hinweis zur Passworteingabe bei verwendung von Putty: Möchte man nicht die >= 32 Stellige “PEM pass phrase” von Hand abtippen, kann diese mit “shift+Ins” eingefügt werden.)
  5. Wenn das Webseiten-Zertifikat durch StartSSL erstellt wurde, erhält man eine Benachrichtigung und kann das Zertifikat unter: Control Panel-> Tool Box-> Retrieve Certificate beziehen. Dazu wieder mit “Copy & Paste” in eine Datei namens ssl.cert speichern und zum Webserver kopieren
  6. Nach diesem Schritt muss noch ein Gesamtpaket mit den Hilfszertifikaten von StartSSL und dem Webseiten-Zertifikat erstellt werden, da beim NGINX Webserver diese Zertifikate nicht einzeln in der Konfiguration angegeben werden. Die Hilfszertifikate können bei StartSSL heruntergeladen werden. Um das Gesamtpaket zu erstellen, braucht es für die kostenlosen Zertifikate die Dateien ca.pem und sub.class1.server.ca.pem. Mit dem Befehl:
    cat ssl.cert ca.pem sub.class1.server.ca.pem > server.pem
    werden alle Dateien in die Datei server.pem zusammengefasst.
  7. Nun die Dateien “server.pem” und “server.key” in das gewünschte Verzeichnis kopieren. Hier in diesem Beispiel nach “/etc/nginx/cert/”.
  8. Jetzt muss noch die NGINX Konfiguration angepasst werden:
    server {
        listen   443;
        ssl on;
        ssl_certificate /etc/nginx/cert/server.pem;
        ssl_certificate_key /etc/nginx/cert/server.key;
        server_name  www.example.org;
        root /var/www/example;
        location / {
            index  index.html;
        }
    }
  9. Zum Abschluss wird noch ein Neustart von NGINX durchgeführt.(/etc/init.d/nginx restart) Wenn beim Neustart keine Fehlermeldung in der Konsole erscheint, ist das Zertifikat erfolgreich installiert worden.

Hinweis: Sollte NGINX nicht mehr starten und eine ähnliche Fehlermeldung wie:

[emerg]: SSL_CTX_use_certificate_chain_file("/etc/nginx/cert/server.crt") failed (SSL: error:02001002:system library:fopen:No such file or directory error:20074002:BIO routines:FILE_CTRL:system lib error:140DC002:SSL routines:SSL_CTX_use_certificate_chain_file:system lib)
configuration file /etc/nginx/nginx.conf test failed

in der Konsole angezeigt werden, dann deutet dies auf einen fehlenden Zeilenumbruch in der Datei server.pem hin.

NGINX - Fehler in der server.pem Datei
Fehlender Zeilenumbruch in der .PEM Datei
Einfach den Zeilenumbruch korrigieren und die Datei speichern. Nach der Korrektur sollte NGINX wieder erfolgreich starten.
Zeilenumbruch korrigiert
Zeilenumbruch korrigiert

NGINX: Command-line parameter -s

Mit dem Command-line paramter “-s” (signal) (ab version >= 0.7.53), kann der laufende Hauptprozess von nginx beeinflusst werden.

Lade die Konfigurationsdateien neu
Dieser Befehl lädt die Konfiguration neu, ohne den Betrieb von nginx
zu beinträchtigen.

nginx -s relaod

Danach werden neue Anfragen mit der neuen Konfiguration bedient.

Beendet nginx sofort

nginx -s stop

Beendet nginx “vorsichtig”

nginx -s quit

Keine neuen Anfragen werden mehr beantwortet, bestehende aber noch bedient.

Nützliche Links
nginx: command-line parameters
Starting, Stopping, and Restarting NGINX

Routingtabelle: statische Routen definieren unter: Windows, Debian Linux und Esxi-Server

Wenn eine Routingtabelle mit statischen Routeneinträge ergänzt werden soll, was bei einer VPN-Verbindung nötig sein kann, gibt es für die verschiedenen Betriebssysteme einen Befehl “route”. Dieser Befehl ist unter Windows und Linux sehr ähnlich. Der grösste Unterschied ist bei den permanenten Routings.

Einträge in der Rountingtabelle anzeigen:

  • unter Windows
    >route print

    Routingtabelle unter Windows
    Routingtabelle unter Windows
  • unter Linux
    >route

    Routingtabelle unter Linux
    Routingtabelle unter Linux
  • unter Esxi-Server
    >esxcfg-route -l

    Routingtabelle Esxi
    Routingtabelle Esxi

Eintrag in der Routingtabelle erstellen:
Achtung: Wenn das Betriebssystem neugestartet wird gehen die Einträge verloren, da es sich nicht um permanente Einträge handelt.

  • unter Windows
    >route add 192.168.7.0 MASK 255.255.255.0 10.50.147.66
  • unter Linux
    >route add -net 192.168.7.0 netmask 255.255.255.0  gw 10.50.147.66 dev eth0
  • unter Esxi-Server
    >esxcfg-route -a 192.168.7.0 255.255.255.0 10.50.147.66

Eintrag in der Routingtabelle löschen:

  • unter Windows
    >route delete 192.168.7.0 MASK 255.255.255.0 10.50.147.66
  • unter Linux
    >route del -net 192.168.7.0/24  gw 10.50.147.66
  • unter Esxi-Server
    >esxcfg-route -d 192.168.7.0/24 10.50.147.66

Permanenter Eintrag in der Routingtabelle erstellen:
Nach einem Neustart des Betriebssystemes sind diese Einträge wieder in der Routingtabelle vorhanden.

  • unter Windows muss nur der Parameter -p mitgegeben werden, damit dieser Eintrag permanent wird.
    >route add 192.168.7.0 MASK 255.255.255.0 10.50.147.66 -p
  • unter Linux ist es ein wenig aufwändiger, es muss ein Eintrag in der Datei “/etc/network/interfaces” erstellt werden.
    
    iface eth0 inet static
          address 10.50.147.99
          netmask 255.255.255.0
          network 10.50.147.0
          broadcast 10.50.147.255
          gateway 10.50.147.1
          dns-nameservers 10.50.147.1 10.50.147.2
    
    #hinzufügen der statischen permanenten Route
    up route add -net 192.168.7.0 netmask 255.255.255.0  gw 10.50.147.66 dev eth0
    
  • unter Esxi-Server wird ein Eintrag in der Datei “/etc/sysconfig/static-routes” erstellt.
    
    #hinzufügen der statischen permanenten Route
    any net 192.168.7.0 netmask 255.255.255.0  gw 10.50.147.66
    

Zum starten der Esxi-Konsole (unsupported modus: left alt key + F1, type: unsupported)

Vmware Knowledge Base: Adding a static route to an ESX host
Esxcfg-Hilfe
Linux: man route

Netcat als Port Scanner verwenden

Netcat kann als einfacher “Port Scanner” verwendet werden. Dabei liefert das Tool nicht die vielen Optionen wie nmap, aber es genügt um herauszufinden welche Ports bei einem System offen sind.


nc -v 127.0.0.1 -z 80-1024

Parameter:

    -v zeige detailierte Ausgabe
    -z zero-I/O mode [Scanner-Modus]
    80-1024 Ports zum Scannen. Eingabe eines ganzen Bereiches oder nur eines einzelnen Ports

Prüfen ob der Port 80 bei www.monsterli.ch offen ist:


nc -v www.monsterli.ch -z 80
Connection to www.monsterli.ch 80 port [tcp/www] succeeded!

Port-Scanning mit nmap

Nmap ist ein sehr mächtiges Tool zum Herausfinden ob Ports offen sind und auf eingehende Verbindungen warten. Dazu bietet nmap verschiedene Möglichkeiten einen Scan durchzuführen:

Stealth SYN-Scan
Der SYN-Scan stellt keine vollständige Verbindung zum Zielrechner her, wie es beim “Three-Way-Handshake” üblich wäre. Dabei sendet nmap ein SYN-Paket und untersucht die Antwort des Zielrechners. Wird als Antwort ein SYN/ACK-Paket empfangen, werden Verbindungen auf diesem Port akzeptiert. Anstelle eines ACK-Paket zurückzusenden, wird die Verbindung durch nmap sofort unterbrochen, indem ein RST-Paket zum Zielrechner gesendet wird. Dies verhindert, dass der Dienst zu einem DoS Opfer wird.


sudo nmap -sS 192.168.0.1

UDP-Scan
Beim UDP-Scan sendet nmap an jeden zu prüfenden Port ein UDP-Paket, dabei ist der Paketinhalt meistens leer. Ist es jedoch ein “bekannter” Port wie 53 oder 161 wird der Inhalt des Paketes dem Protokoll angepasst.


sudo nmap -sU 192.168.0.1

Scan mit “Lockadressen” (Scan with decoys)
Das Scanning mit “Lockadressen” versucht die eigene IP-Adresse, hinter mehreren aktiven IP-Adressen, zu verstecken. Dabei sendet nmap einige Pakete mit der eigenen IP-Adresse und sendet danach gefälschte Pakete mit den Lockadressen. Ein IDS kann so zwar erkennen, dass von einigen IP-Adressen einen Port-Scan durchgeführt wird, aber welche Adresse den effektiven Scan verursacht, ist nicht einfach zu bestimmen. Wichtig dabei ist, dass “decoys” gewählt werden welche aktiv sind, damit der Zielrechner nicht Opfer eines SYN-Flooding wird.


sudo nmap -D 192.168.0.200,192.168.0.300 192.168.0.1

Im Beispiel wird der Zielrechner 192.168.0.1 gescannt. Die Lockadressen sind: 192.168.0.200 und 192.168.0.300

FIN-, X-mas- und Null-Scans
Bei diesen 3 Scans wird ein unsinniges Paket an jeden Port des Zielrechner geschickt. Wenn der Port aktiv ist, werden diese Pakete einfach ignoriert. Ist der Port jedoch geschlossen und das System reagiert wie im RFC 793 definiert, dann wird es ein RST-Paket zurückschicken. Diese Techniken funktionieren nicht auf allen Systemen, da sich nicht alle Implementierungen nach dem RFC 793 richten. Unter anderem sind das Microsoft Windows, einige Cisco-Devices, BSDI und IBM OS/400.

Null-Scan


sudo nmap -sN 192.168.0.1

Dabei ist kein einziges Flag gesetzt

FIN-Scan


sudo nmap -sF 192.168.0.1

TCP FIN-Flag ist gesetzt

X-mas-Scan


sudo nmap -sX 192.168.0.1

Da dieses Paket die Flags FIN, PSH und URG gesetzt hat, heisst die Technik xmas-scan. (Es leuchtet wie ein Weihnachtsbaum)

SYN-Scan
SYN-Scan bei einem Zielrechner mit Windows

Null-Scan
Ein Null-Scan beim selben Zielsystem, führt wegen der Implementierung zu keinem Resultat

DNS-Abfragen mit nslookup

Braucht man Informationen zu einer Domain kann unter Windows und Linux nslookup verwendet werden. Das Tool nslookup bietet die Möglichkeit einen interaktiven Modus oder den nicht interaktiven Modus zu verwenden. Diese Modi unterscheiden sich beim Eingeben der Werte. Im interaktiven Modus wird in einer eigenen Konsole gearbeitet und jeder Befehl einzeln angegeben. Beim nicht interaktiven Modus hingegen, wird alles in einem Befehl definiert.

Was hat www.monsterli.ch für eine IP-Adresse?

Im interaktiven Modus:


>nslookup
>www.monsterli.ch
Server:                192.168.0.1
Address:               192.168.0.1#53

Name:      www.monsterli.ch
Address:   80.238.129.157

Durch die Eingabe von nslookup, in der Konsole, wird in den interaktiven Modus gewechselt. Nach dem wechseln des Modus, kann durch die Eingabe des Hostnamens die Abfrage gestartet werden.

Im nicht interaktiven Modus:


>nslookup www.monsterli.ch
Server:                192.168.0.1
Address:               192.168.0.1#53

Name:      www.monsterli.ch
Address:   80.238.129.157

Was ist der Mailserver der Domain monsterli.ch ?

Im interaktiven Modus:


>nslookup
>set type=mx
>monsterli.ch
Server:                192.168.0.1
Address:               192.168.0.1#53

Nicht autorisierende Antwort:
monsterli.ch    MX preference = 0, mail exchanger = mail.monsterli.ch
monsterli.ch    MX preference = 5, mail exchanger = monsterli.ch
monsterli.ch    MX preference = 10, mail exchanger = mail2.monsterli.ch

Im nicht interaktiven Modus:


>nslookup -type=mx monsterli.ch
Server:                192.168.0.1
Address:               192.168.0.1#53

Nicht autorisierende Antwort:
monsterli.ch    MX preference = 0, mail exchanger = mail.monsterli.ch
monsterli.ch    MX preference = 5, mail exchanger = monsterli.ch
monsterli.ch    MX preference = 10, mail exchanger = mail2.monsterli.ch

Einen alternativen DNS-Server für die Abfragen verwenden

Soll bei der DNS-Abfrage nicht der standart DNS-Server verwendet werden, kann dieser angegeben werden. Hier im Beispiel wird ein öffentlicher DNS-Server von Google verwendet.

Im interaktiven Modus:


>nslookup
>server 8.8.4.4
Standardserver: google-public-dns-b.google.com
Address:  8.8.4.4

>www.monsterli.ch
Server:                8.8.4.4
Address:               8.8.4.4#53

Name:      www.monsterli.ch
Address:   80.238.129.157

Im nicht interaktiven Modus:


>nslookup www.monsterli.ch 8.8.4.4
Server:                8.8.4.4
Address:               8.8.4.4#53

Name:      www.monsterli.ch
Address:   80.238.129.157

ARP-Übersetzungstabelle anzeigen und verändern

Mit Hilfe des Tools “arp” kann unter Windows und Linux die Übersetzungstabelle für IP-Adressen zur MAC-Adresse (physikalische Adresse) angezeigt und verändert werden. Diese Übersetzungstabelle wird von ARP (Address Resolution Protocol) verwendet. Das Tool wird im Normalfall nur für Test- und Debugzwecke verwendet.


>arp -a

Zeigt die aktuellen ARP-Einträge in der Übersetzungstabelle an.

ARP-Einträge

Um einen Eintrag aus der Tabelle zu löschen:


>arp -d 192.168.0.22

Um einen eigenen statischen Eintrag hinzuzufügen:


>arp -s 192.168.0.22 00-aa-00-62-c6-09

nslookup: anzeigen einer Liste mit allen IP’s und Aliasse einer Domain

Um eine Liste mit allen IP’s und Aliasse einer Domain zu erhalten, kann mit Hilfe des Tools nslookup ein Zonen-Transfer simuliert werden. Dies setzt voraus, dass der zuständige DNS-Server die Option “Zone-Transfere” eingeschaltet hat.

Aus dem Gesichtspunkt der Sicherheit, sollte diese Option bei einem DNS-Server nicht aktiviert sein. Mehr zu diesem Thema “Why is securing DNS zone transfer necessary?”

Um die Liste zu erstellen, braucht es folgende Schritte:

  1. nslookup im interaktiven Modus starten
  2. den Typ der Abfrage auf Nameserver setzen (ns)
  3. ermitteln des Domain-Servers
  4. Simulieren eines Zonen-Transfers

In den interaktiven Modus wechseln und den zuständige DNS-Server bestimmen:


>nslookup
>set type=ns
>2022.ch
>
Nicht autorisierende Antwort:
2022.ch nameserver = ns15.zoneedit.com
2022.ch nameserver = ns13.zoneedit.com

ns13.zoneedit.com       internet address = 66.223.97.114
ns15.zoneedit.com       internet address = 216.227.210.9

Auf den obigen Zeilen 6 und 7 sind die zuständigen DNS-Server abgebildet. Nun wird einer dieser DNS-Server unter nslookup definiert, als Server für die Anfragen, danach wird die Simulation des Zonen-Transfers gestartet:


>server ns15.zoneedit.com
>ls -d 2022.ch
>
[ns15.zoneedit.com]
 2022.ch.                       SOA    ns13.zoneedit.com soacontact.zoneedit.com
. (2011330253 300 300 300 300)
 2022.ch.                       NS     ns15.zoneedit.com
 2022.ch.                       NS     ns13.zoneedit.com
 2022.ch.                       A      80.238.129.157
 demo                           A      194.88.197.97
 www                            A      80.238.129.157
 2022.ch.                       SOA    ns13.zoneedit.com soacontact.zoneedit.com
. (2011330253 300 300 300 300)

Will man das Resultat direkt in eine Textdatei speichern, kann der Befehl auch folgendermassen eingegeben werden:


>ls -d 2022.ch > DateiZumSpeichern.txt

Der Output kann jetzt in der Datei “DateiZumSpeichern.txt” angeschaut werden.