Aufgrund der hohen Performance und flexiblen Einsatzmöglichkeiten erfreut sich der nginx-Webserver immer größerer Beliebtheit. Mit der steigenden Anzahl an Webservern auf welchen der nginx Webserver betrieben wird, steigt somit auch die Anzahl der unsicher konfigurierten Webserver. In diesem Artikel wird beschrieben, wie sich der nginx Webserver sicher konfigurieren lässt.
1.1 Server-Token deaktivieren
Webserver teilen in jedem Response mit, von welchem Webserver die Antwort kommt und welche Version darauf installiert ist. Sobald Angreifer die Version erfahren, können sie nach bekannten Lücken und den dazugehörigen Exploits suchen, gegen welche der Webserver noch nicht gepatched wurde und diese ausnutzen.
Um dies zu vermeiden, weisen wir unseren Webserver dazu an, nicht mehr so viele Informationen heraus zu geben. Dies können wir erreichen, indem wir in unseren Virtualhost-Konfigurationen folgende Zeile hinzufügen:
server_tokens off;
1.2 Deaktivieren von unerwünschten HTTP Methoden
Da die meisten Webseiten lediglich die http Methoden GET, POST und HEAD benötigen, können wir die anderen deaktivieren um potenzielle Einfallstore zu deaktivieren. Dazu weisen wir den nginx dazu an, bei allen Anfragen welche nicht GET, POST oder HEAD sind, einen Error Code 444 zurückzugeben:
if ($request_method !~ ^(GET|HEAD|POST)$)
{
return 444;
}
1.3 Buffer Size limitieren
Um Buffer-Overflow-Attacken zu vermeiden, ist es sinnvoll die Buffer-Size von Anfragen zu limitieren. Somit kann der Client erst überhaupt keine großen Anfragen an den nginx-Webserver senden, welche Shellcode zur Ausführung bringen könnten.
client_body_buffer_size 1k;
client_header_buffer_size 1k;
client_max_body_size 1k;
large_client_header_buffers 2 1k;
Wichtig ist hierbei zu beachten, dass dies eine Auswirkung auf Upload-Funktionen einer Webseite haben kann. Es können dann auch nur noch Dateien mit der Größe von ca. einem Kilobyte hochgeladen werden.
1.4 Anzahl der Verbindungen eines Clients limitieren
Um DDos Attacken zu erschweren und um zu vermeiden, dass ein einzelner Client zu viele Verbindungen zum Webserver aufbauen kann, muss folgende Zeile außerhalb des server { } Blocks hinzugefügt werden:
limit_conn_zone $binary_remote_addr zone=addr:5m;
Und folgende innerhalb:
limit_conn addr 1;
1.5 Image Hooking vermeiden
Sollte eine andere Webseite ein Bild unserer Webseite einbinden, führt das häufig zu erhöhtem Traffic und einem höheren Load auf dem Webserver. Indem wir den Webserver beauftragen nur Bilder herauszuliefern, wenn wir selbst der Referer sind, können nur Bilder von der eigenen Seite eingebunden werden:
location /img/ {
valid_referers none blocked 192.168.178.1;
if ($invalid_referer){
return 403;
}}
location ~* \.(gif|jpg|jpeg|png|wmv|avi|mpg|mpeg|mp4|htm|html|js|css)$ {
valid_referers none blocked example.org www.exampleorg ~\.google\. ~\.yahoo\. ~\.bing\. ~\.facebook\. ~\.fbcdn\.;
if ($invalid_referer) {
return 403;
}
Falls der Browser in seinen Einstellungen vermerkt hat, keinen Referer zu senden, kann nun auch kein Bild ausgeliefert werden.
1.6 SSL deaktivieren und nur TLS aktivieren
Das Secure Socket Layer (SSL) Protokoll gilt seit einiger Zeit als unsicher. Da alle modernen Browser heutzutage TLS unterstützen, ist es sinnvoll dieses zu erzwingen ohne nennenswerte Einschränkungen zu generieren.
Diese Einstellung erzwingt TLS zu verwenden:
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
1.7 Unsichere Verschlüsselungs-Algorithmen deaktivieren
Die Wahl des Verschlüsselungs-Algorithmus ist bei einer verschlüsselten Verbindung entscheidend. Algorithmen wie RC4 oder MD5 gelten seit geraumer Zeit nicht mehr als sicher und können sehr einfach geknackt werden. Deshalb ist es wichtig den nginx so zu konfigurieren, dass er den Browser dazu bringt ein sicheres Verschlüsselungsverfahren zu wählen.
ssl_ciphers „EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA HIGH !RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS“;
1.8 HTTPs erzwingen
Durch eine Weiterleitung von HTTP auf HTTPs erhöhen wir zwar nicht die Sicherheit unseres Webservers, jedoch stellen wir sicher, dass unsere Besucher nicht so einfach ausgespäht werden können.
server
{
listen 80;
return 301 https://$host$request_uri;
}
1.9 Erzeugen einer einzigartigen Diffie-Hellman Gruppe
Das Diffie-Hellman Schlüssel Austausch-Verfahren ist nicht so sicher wie angenommen. Deshalb ist es sehr wichtig mit dem Tool openssl ein dhparam Datei zu erzeugen. Hierzu führen wir folgenden Befehl in der Konsole aus:
openssl dhparam -out dhparams.pem 4096
Das Erzeugen der Datei wird einige Minuten in Anspruch nehmen. Anschließend verschieben wir es in unseren SSL Ordner.
Nun binden wir den neu erzeugte Datei in unsere Konfigurationsdatei folgendermaßen ein:
ssl_dhparam /opt/cert/dhparams.pem;
1.10 Nicht benötigte Module deaktivieren
Wer den nginx-Webserver selbst kompiliert, kann vor dem kompilieren nicht benötigte Module, durch diverse Einstellungen beim kompilieren, deaktivieren.
Je weniger Module aktiv sind, desto geringer wird die Angriffsfläche für potenzielle Angreifer:
# ./configure –without-http_autoindex_module –without-http_ssi_module
# make
# make install
Mit dem folgenden Befehl lassen sich alle verfügbaren Module auflisten:
# ./configure –help | less