Website-Suche

Der ultimative Leitfaden zum Sichern, Härten und Verbessern der Leistung des Nginx-Webservers


Aufgrund der wunderbaren Dinge, die Sie über Nginx gehört haben, haben Sie sich vielleicht entschieden, es auszuprobieren. Möglicherweise hat es Ihnen so gut gefallen, dass Sie darüber nachdenken, Ihre Apache-Installationen durch Nginx zu ersetzen, nachdem Sie einige der Artikel zu diesem Thema gelesen haben, die wir auf dieser Website veröffentlicht haben.

Wenn ja, bin ich mir sicher, dass Sie diesen Leitfaden mit offenen Armen empfangen werden, da wir 12 Tipps zur Erhöhung der Sicherheit Ihrer Nginx-Server behandeln werden (von der Aktualisierung von Nginx bis hin zu Verwenden von TLS und Umleiten von HTTP zu HTTPS), und Sie werden feststellen, dass einige davon dem, was Sie mit Apache tun würden, sehr ähnlich sind.

Nicht verpassen:

13 Tipps zur Sicherheit und Härtung des Apache-Webservers

25 Apache Htaccess-Tricks zum Sichern des Apache-Webservers

Nginx-Testumgebung

In diesem Handbuch verwenden wir die folgende Umgebung:

  1. Debian GNU/Linux 8.1 (Jessie).
  2. IP-Adresse: 192.168.0.25 (tecmintlovesnginx.com) und 192.168.0.26 (nginxmeanspower.com), wie im IP-basierten Virtual beschrieben Gastgeberbereich unter

    1. „So richten Sie namensbasierte und IP-basierte virtuelle Hosts (Serverblöcke) mit Nginx ein“
  3. Nginx-Version: nginx/1.6.2.
  4. Der Einfachheit halber finden Sie hier die endgültige Konfigurationsdatei (Pastebin-Link).

In diesem Sinne beginnen wir.

TIPP Nr. 1: Halten Sie Nginx auf dem neuesten Stand

Zum Zeitpunkt des Schreibens dieses Artikels sind die neuesten Nginx-Versionen in den CentOS- (in EPEL) und Debian-Repositorys 1.6.3 und 1.6.2-5 bzw.

Nicht verpassen: Installieren Sie die neueste stabile Version von Nginx aus Repositories und Quellen

Obwohl die Installation von Software aus den Repositorys einfacher ist als das Kompilieren des Programms aus dem Quellcode, bietet diese letzte Option zwei Vorteile: 1) Sie können damit zusätzliche Module in Nginx einbauen (z. B. mod_security) und 2) es wird immer eine neuere Version bereitgestellt als die Repositories (1.9.9 ab heute). Die Versionshinweise sind immer auf der Nginx-Website verfügbar.

Nicht verpassen:

Schützen Sie Apache vor Brute-Force- und DDoS-Angriffen mit Mod_Security und Mod_Evasive

TIPP Nr. 2: Entfernen Sie unnötige Module in Nginx

Um Module während der Installation aus der Quelle explizit aus Nginx zu entfernen, gehen Sie wie folgt vor:

./configure --without-module1 --without-module2 --without-module3

Zum Beispiel:

./configure  --without-http_dav_module --withouthttp_spdy_module 

Wie Sie wahrscheinlich erraten haben, erfordert das Entfernen von Modulen aus einer früheren Nginx-Installation aus dem Quellcode eine erneute Kompilierung.

Achtung: Konfigurationsanweisungen werden von Modulen bereitgestellt. Stellen Sie sicher, dass Sie kein Modul deaktivieren, das eine Anweisung enthält, die Sie später benötigen werden! Sie sollten die Nginx-Dokumente auf die Liste der in jedem Modul verfügbaren Anweisungen überprüfen, bevor Sie eine Entscheidung über die Deaktivierung von Modulen treffen.

TIPP #3: Deaktivieren Sie die server_tokens-Direktive in Nginx

Die server_tokens-Direktive weist Nginx an, seine aktuelle Version auf Fehlerseiten anzuzeigen. Dies ist nicht wünschenswert, da Sie diese Informationen nicht mit der Welt teilen möchten, um Angriffe auf Ihren Webserver zu verhindern, die durch bekannte Schwachstellen in dieser bestimmten Version verursacht werden.

Um die server_tokens-Direktive zu deaktivieren, setzen Sie if innerhalb eines Serverblocks auf „off“:

server {
    listen       192.168.0.25:80;
    server_tokens        off;
    server_name  tecmintlovesnginx.com www.tecmintlovesnginx.com;
    access_log  /var/www/logs/tecmintlovesnginx.access.log;
    error_log  /var/www/logs/tecmintlovesnginx.error.log error;
        root   /var/www/tecmintlovesnginx.com/public_html;
        index  index.html index.htm;
}

Starten Sie nginx neu und überprüfen Sie die Änderungen:

TIPP Nr. 4: Verweigern Sie HTTP-Benutzeragenten in Nginx

Ein HTTP-Benutzeragent ist eine Software, die zur Inhaltsaushandlung mit einem Webserver verwendet wird. Dazu gehören auch Malware-Bots und Crawler, die letztendlich die Leistung Ihres Webservers beeinträchtigen können, indem sie Systemressourcen verschwenden.

Um die Liste unerwünschter Benutzeragenten einfacher verwalten zu können, erstellen Sie eine Datei (z. B. /etc/nginx/blockuseragents.rules) mit folgendem Inhalt:

map $http_user_agent $blockedagent {
        default         0;
        ~*malicious     1;
        ~*bot           1;
        ~*backdoor      1;
        ~*crawler       1;
        ~*bandit        1;
}

Platzieren Sie als Nächstes die folgende Zeile vor der Serverblockdefinition:

include /etc/nginx/blockuseragents.rules;

Und eine if-Anweisung, um eine 403-Antwort zurückzugeben, wenn die Benutzeragentenzeichenfolge in der oben definierten schwarzen Liste enthalten ist:

Starten Sie nginx neu und alle Benutzeragenten, deren Zeichenfolge mit der oben genannten übereinstimmt, werden vom Zugriff auf Ihren Webserver blockiert. Ersetzen Sie 192.168.0.25 durch die IP Ihres Servers und wählen Sie eine andere Zeichenfolge für den Schalter --user-agent von wget:

wget http://192.168.0.25/index.html
wget --user-agent "I am a bandit haha" http://192.168.0.25/index.html 

TIPP #5: Deaktivieren Sie unerwünschte HTTP-Methoden in Nginx

HTTP-Methoden, auch Verben genannt, geben die gewünschte Aktion an, die für eine von Nginx bereitgestellte Ressource ausgeführt werden soll. Für gängige Websites und Anwendungen sollten Sie nur GET, POST und HEAD zulassen und alle anderen deaktivieren.

Platzieren Sie dazu die folgenden Zeilen in einem Serverblock. Eine 444-HTTP-Antwort bedeutet eine leere Antwort und wird in Nginx häufig verwendet, um Malware-Angriffe zu täuschen:

if ($request_method !~ ^(GET|HEAD|POST)$) {
   return 444;
}

Verwenden Sie zum Testen curl, um eine DELETE-Anfrage zu senden, und vergleichen Sie die Ausgabe mit der Ausgabe eines regulären GET-Befehls:

curl -X DELETE http://192.168.0.25/index.html
curl -X POST http://192.168.0.25/index.html 

TIPP Nr. 6: Legen Sie Puffergrößenbeschränkungen in Nginx fest

Um Pufferüberlaufangriffe auf Ihren Nginx-Webserver zu verhindern, legen Sie die folgenden Anweisungen in einer separaten Datei fest (erstellen Sie beispielsweise eine neue Datei mit dem Namen /etc/nginx/conf.d/buffer.conf):

client_body_buffer_size  1k;
client_header_buffer_size 1k;
client_max_body_size 1k;
large_client_header_buffers 2 1k;

Die oben genannten Anweisungen stellen sicher, dass Anfragen an Ihren Webserver keinen Pufferüberlauf in Ihrem System verursachen. Weitere Informationen zu den einzelnen Funktionen finden Sie in den Dokumenten.

Fügen Sie dann eine Include-Direktive in die Konfigurationsdatei ein:

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

TIPP Nr. 7: Begrenzen Sie die Anzahl der Verbindungen nach IP in Nginx

Um die Verbindungen nach IP einzuschränken, verwenden Sie die Anweisungen limit_conn_zone (in einem http-Kontext oder zumindest außerhalb des Serverblocks) und limit_conn (in einem http-, Serverblock- oder Standortkontext).

Beachten Sie jedoch, dass nicht alle Verbindungen gezählt werden, sondern nur diejenigen, bei denen eine Anfrage vom Server verarbeitet wurde und deren gesamter Anfrageheader gelesen wurde.

Stellen wir zum Beispiel die maximale Anzahl von Verbindungen auf 1 (ja, das ist übertrieben, aber in diesem Fall reicht es völlig aus) in einer Zone namens addr (Sie können dies auf einen beliebigen Wert festlegen). Wunschname):

limit_conn_zone $binary_remote_addr zone=addr:5m;
limit_conn addr 1;

Ein einfacher Test mit Apache Benchmark (Perform Nginx Load), bei dem insgesamt 10 Verbindungen mit 2 gleichzeitigen Anfragen hergestellt werden, hilft uns, unseren Standpunkt zu verdeutlichen:

ab -n 10 -c 2 http://192.168.0.25/index.html

Weitere Einzelheiten finden Sie im nächsten Tipp.

TIPP Nr. 8: Richten Sie Monitorprotokolle für Nginx ein

Nachdem Sie den im vorherigen Tipp beschriebenen Test durchgeführt haben, überprüfen Sie das Fehlerprotokoll, das für den Serverblock definiert ist:

Möglicherweise möchten Sie grep verwenden, um die Protokolle nach fehlgeschlagenen Anfragen zu filtern, die an die in TIPP Nr. 7 definierte addr-Zone gestellt wurden:

grep addr /var/www/logs/tecmintlovesnginx.error.log --color=auto

Ebenso können Sie das Zugriffsprotokoll nach interessanten Informationen filtern, wie zum Beispiel:

  1. Client-IP
  2. Browsertyp
  3. HTTP-Anfragetyp
  4. Ressource angefordert
  5. Server blockiert die Beantwortung der Anfrage (nützlich, wenn sich mehrere virtuelle Hosts in derselben Datei anmelden).

Und ergreifen Sie geeignete Maßnahmen, wenn Sie ungewöhnliche oder unerwünschte Aktivitäten feststellen.

TIPP Nr. 9: Verhindern Sie Bild-Hotlinking in Nginx

Bild-Hotlinking geschieht, wenn eine Person auf einer anderen Website ein auf Ihrer Website gehostetes Bild anzeigt. Dies führt zu einem Anstieg Ihrer Bandbreitennutzung (für die Sie bezahlen), während die andere Person das Bild gerne anzeigt, als wäre es ihr Eigentum. Mit anderen Worten: Es ist ein doppelter Verlust für Sie.

Nehmen wir zum Beispiel an, Sie haben ein Unterverzeichnis mit dem Namen img in Ihrem Serverblock, in dem Sie alle in diesem virtuellen Host verwendeten Bilder speichern. Um zu verhindern, dass andere Websites Ihre Bilder verwenden, müssen Sie den folgenden Standortblock in Ihre virtuelle Hostdefinition einfügen:

location /img/ {
  valid_referers none blocked 192.168.0.25;
   if ($invalid_referer) {
     return   403;
   }
}

Ändern Sie dann die Datei index.html in jedem virtuellen Host wie folgt:

192.168.0.26 192.168.0.25
<!DOCTYPE html>
<html>
<head>
<meta charset=”utf-8″>
<title>Nginx means power</title>
</head>
<body>
<h1>Nginx means power!</h1>
<img src=”http://192.168.0.25/img/nginx.png” />
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset=”utf-8″>
<title>Tecmint loves Nginx</title>
</head>
<body>
<h1>Tecmint loves Nginx!</h1>
<img src=”img/nginx.png” />
</body>
</html>

Navigieren Sie nun zu jeder Site und wie Sie sehen können, wird das Bild in 192.168.0.25 korrekt angezeigt, aber durch eine 403-Antwort in 192.168.0.26 ersetzt. :

Beachten Sie, dass dieser Tipp davon abhängt, dass der Remote-Browser das Referrer-Feld sendet.

TIPP Nr. 10: Deaktivieren Sie SSL und aktivieren Sie nur TLS in Nginx

Wann immer möglich, vermeiden Sie SSL in allen Versionen und verwenden Sie stattdessen TLS. Die folgenden ssl_protocols sollten in einem Server- oder HTTP-Kontext in Ihrer virtuellen Hostdatei platziert werden oder sind eine separate Datei über eine Include-Direktive (einige Leute verwenden eine Datei namens ssl.conf). , aber es liegt ganz bei Ihnen):

ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;

Zum Beispiel:

TIPP Nr. 11: Erstellen Sie Zertifikate in Nginx

Generieren Sie zunächst einen Schlüssel und ein Zertifikat. Wenn Sie möchten, können Sie auch eine andere Art der Verschlüsselung verwenden:

openssl genrsa -aes256 -out tecmintlovesnginx.key 1024
openssl req -new -key tecmintlovesnginx.key -out tecmintlovesnginx.csr
cp tecmintlovesnginx.key tecmintlovesnginx.key.org
openssl rsa -in tecmintlovesnginx.key.org -out tecmintlovesnginx.key
openssl x509 -req -days 365 -in tecmintlovesnginx.csr -signkey tecmintlovesnginx.key -out tecmintlovesnginx.crt

Fügen Sie dann in Vorbereitung auf den nächsten Tipp (http --> https-Umleitung) die folgenden Zeilen in einem separaten Serverblock hinzu und verschieben Sie auch die SSL-bezogenen Anweisungen in den neuen Block:

server {
    listen 192.168.0.25:443 ssl;
    server_tokens off;
    server_name  tecmintlovesnginx.com www.tecmintlovesnginx.com;
    root   /var/www/tecmintlovesnginx.com/public_html;
    ssl_certificate /etc/nginx/sites-enabled/certs/tecmintlovesnginx.crt;
    ssl_certificate_key /etc/nginx/sites-enabled/certs/tecmintlovesnginx.key;
    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
}

Im nächsten Tipp werden wir überprüfen, wie unsere Website jetzt ein selbstsigniertes Zertifikat und TLS verwendet.

TIPP Nr. 12: Leiten Sie den HTTP-Verkehr in Nginx auf HTTPS um

Fügen Sie dem ersten Serverblock die folgende Zeile hinzu:

return 301 https://$server_name$request_uri;

Die obige Anweisung gibt eine 301-Antwort (dauerhaft verschoben) zurück, die für die permanente URL-Umleitung verwendet wird, wenn eine Anfrage an Port 80 Ihres virtuellen Hosts gestellt wird, und leitet die Anfrage an den von uns blockierten Server weiter im vorherigen Tipp hinzugefügt.

Das Bild unten zeigt die Umleitung und bestätigt die Tatsache, dass wir TLS 1.2 und AES-256 zur Verschlüsselung verwenden:

Zusammenfassung

In diesem Artikel haben wir einige Tipps zur Sicherung Ihres Nginx-Webservers gegeben. Wir würden gerne hören, was Sie denken. Wenn Sie weitere Tipps haben, die Sie mit dem Rest der Community teilen möchten, teilen Sie uns dies gerne mit, indem Sie uns über das Kommentarformular unten eine Nachricht senden.