So sichern Sie Nginx unter Ubuntu 14.04

Nginx ist ein sehr sicherer und zuverlässiger Webserver, auch mit einer Standardeinstellung. Es gibt jedoch viele Möglichkeiten, Nginx weiter zu sichern.

In diesem Artikel verwenden wir ausschließlich Open-Source-Software, während wir versuchen, einige gängige Ansätze zur Absicherung von Webservern und Sicherheitsstandards zu befolgen. Wir sprechen nämlich davon, die Offenlegung von Informationen zu verhindern, die Verschlüsselung zu erzwingen, Audits durchzuführen und den Zugriff zu beschränken.

Voraussetzungen

Stellen Sie vor dem Ausführen dieses Lernprogramms sicher, dass folgende Voraussetzungen erfüllt sind:

Sofern nicht anders angegeben, sollten alle Befehle, für die in diesem Lernprogramm Root-Berechtigungen erforderlich sind, als Nicht-Root-Benutzer mit Sudo-Berechtigungen ausgeführt werden.

Schritt 1 - Alle Software aktualisieren

Das Aktualisieren Ihrer Software auf die neueste Version ist ein guter erster Schritt zur Sicherung Ihres gesamten Systems, nicht nur von Nginx.

Warnung: Bevor Sie alle Pakete auf Ihrem System aktualisieren, stellen Sie sicher, dass Sie feststellen, ob dies zu Problemen mit anderen auf Ihrem System ausgeführten Komponenten als Nginx führt. Es ist eine gute Idee, ein Backup des gesamten Systems zu erstellen, bevor eine Operation ausgeführt wird, die so viele Pakete gleichzeitig betrifft. Sie können auf die Sicherung zurückgreifen, wenn nach dem Aktualisieren aller Pakete Probleme auftreten. Führen Sie die folgenden Befehle aus, um die Repository-Paketliste und alle derzeit installierten Pakete zu aktualisieren, die mit "+ apt-get +" auf Ihrem Ubuntu-Server verwaltet werden:

sudo apt-get update && sudo apt-get upgrade

Alternativ können Sie Nginx einfach auf die neueste Version im Ubuntu-Repository aktualisieren. Dadurch werden das Nginx-Paket und alle erforderlichen Abhängigkeiten aktualisiert:

sudo apt-get upgrade nginx

Schritt 2 - Verhindern der Offenlegung von Informationen

Beginnen wir mit der Einschränkung der darin enthaltenen Informationen, um den Nginx-Webserver abzusichern. Auf jeder Ebene gehen wertvolle Informationen aus den HTTP-Server-Headern in die Anwendungsfehlerberichterstattung ein.

Beginnen wir also mit den HTTP-Headern. Standardmäßig zeigt Nginx seinen Namen und seine Version in den HTTP-Headern an. Sie können diese Informationen mit + curl + wie folgt überprüfen:

curl -I http://localhost

Die Ausgabe sollte folgendermaßen aussehen:

Output of curl -I http://localhostHTTP/1.1 200 OK

...

Wie Sie sehen können, sind die Version von Nginx und der Name des Betriebssystems in der obigen Ausgabe zu sehen. Dies ist nicht unbedingt ein ernstes Problem, sondern ein Teil des Puzzles, das ein Angreifer zu lösen versucht, um Ihren Nginx-Server zu gefährden. Aus diesem Grund werden diese Informationen ausgeblendet, indem die Nginx-Hauptkonfigurationsdatei "+ / etc / nginx / nginx.conf +" mit nano wie folgt geöffnet wird:

sudo nano /etc/nginx/nginx.conf

Fügen Sie dann im Konfigurationsteil "+ http " die Zeile " server_tokens off; +" wie folgt hinzu:

/etc/nginx/nginx.conf

http {

       ##
       # Basic Settings
       ##

...

Speichern und beenden Sie anschließend die Datei und laden Sie Nginx erneut, damit die Änderung wirksam wird:

sudo service nginx reload

Wenn Sie jetzt den gleichen Curl-Befehl wiederholen, gehen Sie wie folgt vor:

curl -I http://localhost

Sie sehen weniger Informationen:

Output of curl -I http://localhostHTTP/1.1 200 OK

...

Die obige Ausgabe offenbart nur die Tatsache, dass es sich um einen Nginx-Server handelt. Sie fragen sich vielleicht, ob Sie dies auch entfernen können. Dies ist leider nicht einfach zu bewerkstelligen, da es keine Konfigurationsoption dafür gibt. Stattdessen müssen Sie Nginx aus dem Quellcode neu kompilieren, was den Aufwand nicht wert ist.

Neben dem "+ Server" -Header gibt es einen weiteren Header mit vertraulichen Informationen - "+ X-Powered-By". Dieser Header zeigt normalerweise die Version von PHP, Tomcat oder einer anderen serverseitigen Engine hinter Nginx. Wenn Sie Nginx mit PHP ausführen, sieht die Ausgabe von "+ curl +" folgendermaßen aus:

Output of curl -I http://localhost on nginx with phpHTTP/1.1 200 OK
Server: nginx
...

...

Der obige "+ X-Powered-By " - Header zeigt, dass der Server Ubuntu 14 ist, auf dem PHP Version 5.5.9 ausgeführt wird. Es ist sehr wichtig, diese Informationen im Header " X-Powered-By " zu verbergen. Dies ist in Nginx nicht möglich. Stattdessen sollten Sie die entsprechende Option in der Back-End-Engine finden. Zum Beispiel müssen Sie bei PHP die Option ` expose_php = Off ` in der Hauptkonfigurationsdatei ` php.ini ` setzen. Standardmäßig ist diese Option auf " Ein +" eingestellt.

Als Nächstes müssen Sie die 4xx-Fehlerseiten (clientseitig) ändern, deren Informationen von einem Angreifer verwendet werden können. In der Regel sind dies "+ Nicht autorisierte 401" - und "+ Verbotene 403" -Fehlerseiten. Wenn Sie kein Problem beheben, müssen diese Fehler in der Regel nicht regelmäßigen Besuchern angezeigt werden. Wenn Sie über diese Fehler Bescheid wissen müssen, finden Sie sie weiterhin im Nginx-Fehlerprotokoll (+ / var / log / nginx / error.log +).

Um diese beiden Fehlerseiten zu ändern, öffnen Sie die Konfigurationsdatei für Ihren Serverblock, zum Beispiel die Standarddatei:

sudo nano /etc/nginx/sites-enabled/default

Geben Sie im Konfigurationsabschnitt des Hauptservers "+ Server +" Folgendes an:

/ etc / nginx / sites-enabled / default

server {
...

...

Stellen Sie nach dem Speichern der Änderungen an der Datei sicher, dass Nginx erneut geladen wird, damit es mit dem folgenden Befehl wirksam wird:

sudo service nginx reload

Die obigen Hinweise geben Ihnen die Idee, die Weitergabe von Informationen zu verhindern - zeigen so wenig wie möglich nicht wesentliche Webinhalte. Sie sollten Service- und Debugging-Informationen nicht nur in Nginx, sondern auch in den Backend-Engines (PHP, Tomcat usw.) und natürlich in den Webanwendungen ausblenden.

Schritt 2 - SSL konfigurieren

Das Ausführen des sicheren HTTPS-Protokolls mit SSL unter Nginx ist ein Muss für jede Site, die vertrauliche Informationen wie Anmeldeinformationen von Benutzern, private Daten usw. verarbeitet. SSL ist die einzige Möglichkeit, um sicherzustellen, dass die empfangenen und gesendeten Informationen geschützt sind, unabhängig davon, wo sich die Benutzer Ihrer Website befinden und welche Internetverbindung sie verwenden.

Der Artikel So erstellen Sie ein SSL-Zertifikat unter Nginx für Ubuntu 14.04 erklärt, wie Sie auf einfache Weise ein kostenloses SSL mit der Standard-HTTPS-Konfiguration einrichten. Obwohl dieser Artikel ein guter Anfang ist, werden Ihre Daten nicht effizient geschützt. Heutzutage sind die SSL-Standardeinstellungen und -Algorithmen nicht stark genug, um zu verhindern, dass ein Angreifer Ihren Datenverkehr entschlüsselt.

Aus diesem Grund werden wir ein SSL-Zertifikat für Nginx mit stärkeren Verschlüsselungsalgorithmen und -einstellungen konfigurieren. Auf diese Weise wird ein höheres Schutzniveau für Ihre Daten gewährleistet und Ihr HTTPS-Dienst wird den höchsten Sicherheitsstandards und -praktiken entsprechen.

Beginnen wir mit der Erstellung eines Verzeichnisses für unsere SSL-Zertifikate mit dem Befehl:

sudo mkdir /etc/nginx/ssl/

Für unser SSL benötigen wir ein Zertifikat mit einem starken Signaturalgorithmus, SHA256. Zu Testzwecken oder in Nichtproduktionsumgebungen können Sie ein selbstsigniertes Zertifikat verwenden und die SSL-Warnungen ignorieren. Erstellen wir eine mit dem Befehl:

sudo openssl req -x509 -nodes -sha256 -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/nginx.key -out /etc/nginx/ssl/nginx.crt

Dieser Befehl stellt Ihnen einige einfache Fragen zu den Details Ihrer Site und Ihres Unternehmens. Danach wird ein 2048-Bit-RSA-verschlüsselter Schlüssel in der Datei "+ / etc / nginx / ssl / nginx.key " und ein SHA256-Zertifikat in der Datei " / etc / nginx / ssl / nginx.crt +" erstellt.

Als Nächstes müssen Sie stärkere, 4096 Bit lange DH-Parameter generieren. Bereiten Sie sich darauf vor, einige Zeit zu warten. Abhängig von Ihrem Droplet kann dies bis zu 30 Minuten dauern. Führen Sie den Befehl aus:

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

Jetzt können Sie den SSL-Teil Ihres Serverblocks konfigurieren. Als Beispiel konfigurieren wir den Standard-Serverblock. Öffnen Sie die Konfigurationsdatei zum Bearbeiten mit nano:

sudo nano /etc/nginx/sites-enabled/default

Bearbeiten Sie in dieser Datei den Serverkonfigurationsteil und fügen Sie den SSL-Teil nach der Anweisung "+ Servername +" wie folgt hinzu:

/ etc / nginx / sites-enabled / default

server {
...
      server_name localhost;










...

Hier sind die Anweisungen, die wir mit den obigen Anweisungen angegeben haben:

  • + listen + - Aktiviert den SSL-Listener an Port 443, d. h. der HTTPS-Port.

  • + ssl_protocols + - Aktiviert nur diese drei derzeit als sicher geltenden Protokolle - + TLSv1 TLSv1.1 TLSv1.2 +.

  • + ssl_ciphers + - aktivieren Sie nur diese sicheren SSL-Verschlüsselungen: + EECDH + AESGCM: EDH + AESGCM: AES256 + EECDH: AES256 + EDH +

  • + ssl_prefer_server_ciphers + - Stellen Sie sicher, dass der Client die Verschlüsselungseinstellungen des Servers respektiert.

  • + ssl_dhparam + - Verwenden Sie die benutzerdefinierten, starken DH-Parameter, die wir zuvor generiert haben.

  • + ssl_certificate + - Verwenden Sie unser selbstsigniertes SSL-Zertifikat. Stellen Sie sicher, dass Sie es ändern, wenn Sie ein anderes Zertifikat verwenden.

  • + ssl_certificate_key + - Verwenden Sie unseren zuvor generierten privaten SSL-Schlüssel.

Damit die obigen Einstellungen wirksam werden, müssen Sie nginx mit dem folgenden Befehl erneut laden:

sudo service nginx reload

Verwenden Sie zum Testen Ihrer neuen SSL-Konfiguration am besten ein externes Tool wie das von SSL Labs bereitgestellte. Dort sollten Sie die Warnung, dass das SSL nicht vertrauenswürdig ist, ignorieren. Dies ist natürlich, da es sich um ein selbstsigniertes Zertifikat handelt. Beachten Sie, dass diese Site nur Sites mit einem registrierten Domainnamen testet. Sie können die SSL-Verbindung nicht nur mit der IP-Adresse Ihres Droplets testen.

Das Gesamtergebnis sollte "T" lauten wie beim "Testen", aber im Grunde genommen ist es ein A (das höchstmögliche) und es sollte "" lauten, wenn Vertrauensprobleme ignoriert werden: "" wie folgt:

Später möchten Sie wahrscheinlich die SSL-Warnung entfernen und den SSL-Test zu einem sauberen „A“ machen. Eine Möglichkeit ist, * Let’s Encrypt * zu verwenden, wie im Artikel https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-14- beschrieben. 04 [So sichern Sie Nginx mit Let’s Encrypt unter Ubuntu 14.04]. Es ist kostenlos, ermöglicht die Angabe einer RSA-Schlüsselgröße bis zu 4096 und gibt keine Warnung vor dem Selbstsignieren aus. Andernfalls können Sie einen beliebigen kommerziellen SSL-Anbieter auswählen. Wenn Sie sich für eines entscheiden, vergewissern Sie sich, dass Sie sich für ein SHA256-Zertifikat entscheiden.

Schritt 3 - Beschränken des Zugriffs per IP

Die Kennwortauthentifizierung ist nicht immer ausreichend, um die Sicherheit sensibler Bereiche Ihrer Site wie Site Control Panels, phpmyadmin usw. zu gewährleisten. Manchmal nutzen Angreifer schwache Passwörter oder Software-Schwachstellen in solchen Bereichen aus, um sich unbefugten Zugriff zu verschaffen. Aus diesem Grund wird dringend empfohlen, eine zusätzliche IP-Beschränkung hinzuzufügen, sofern Sie die IPs legitimer Benutzer ermitteln können.

Wenn Sie beispielsweise eine WordPress-Site haben und sich ihr Administrationsbereich unter "+ / wp-admin / " befindet, sollten Sie den Zugriff nur auf Ihre IP-Adresse oder die IP-Adressen aller Administratoren beschränken. Öffnen Sie zu diesem Zweck den entsprechenden Serverblock - der Standardserverblock für Nginx ist " / etc / nginx / sites-enabled / default +":

sudo nano /etc/nginx/sites-enabled/default

Fügen Sie im Konfigurationsabschnitt "+ Server +" Folgendes hinzu:

/ etc / nginx / sites-enabled / default

server {
...
   location /wp-admin/ {
       allow /24;
    allow /24;
       deny  all;
}
...
...

Vergewissern Sie sich, dass Sie in den obigen Schritten "+ 192.168.1.1 " und " 10.0.0.1 " durch Ihre IPs ersetzen. Ebenso können Sie den Zugriff für andere IPs oder sogar Netzwerke zulassen, indem Sie die Netzwerkmaske ändern (` / 24 +`).

Damit solche Einstellungen wirksam werden, müssen Sie Nginx erneut mit dem folgenden Befehl laden:

sudo service nginx reload

Wenn Sie nun versuchen, mit einem Browser außerhalb der zulässigen IP-Adressbereiche auf den Teil Ihrer Website zuzugreifen, wird eine Fehlermeldung angezeigt. Dieser Fehler ist 403 Forbidden (es sei denn, Sie haben diesen Fehler in 404 Not found geändert, wie zuvor erläutert). Gleichzeitig sehen Sie den wahren Fehlercode im Fehlerprotokoll mit dem Befehl:

sudo tail /var/log/nginx/error.log

Der Fehler "+ Zugriff verboten +" wird folgendermaßen angezeigt:

Output of sudo tail -f /var/log/nginx/error.log...
2016/01/02 04:16:12 [error] 4767#0: *13  by rule, client: X.X.X.X, server: localhost, request: "GET /wp-admin/ HTTP/1.1", host: "Y.Y.Y.Y"
...

Die Kombination aus der Anwendung mehrerer Sicherheitsmethoden, z. B. Ändern der Fehlerseite und Einschränken des Zugriffs durch IP, zeigt den kumulativen Effekt der Härtung von Nginx. Anstelle der üblichen WordPress-Administrationsseite wird Angreifern und den von ihnen verwendeten automatisierten Tools eine 404-Seite angezeigt, die nicht gefunden wurde. Dies ist verwirrend und kann sie davon abhalten, andere Ansätze zur Beeinträchtigung Ihres WordPress zu versuchen.

[[step-4-- performing-a-security-audit]] === Schritt 4 - Durchführen einer Sicherheitsüberprüfung

Es ist immer eine gute Idee, eine Sicherheitsüberprüfung unabhängig von Ihrer eigenen Meinung durchzuführen. Zu diesem Zweck können Sie ein Sicherheitsüberwachungs-Tool verwenden, das nach Web-Schwachstellen sucht. Es gibt viele solcher Tools, einschließlich kommerzieller, und für den Anfang können Sie Wapiti verwenden, das kostenlos und Open Source ist. In Wapiti fehlen möglicherweise einige der Funktionen der fortschrittlicheren Tools, aber es vermittelt Ihnen eine Vorstellung davon, was Sicherheitsüberprüfung ist.

Du kannst wapiti unter Ubuntu über apt installieren:

sudo apt-get install wapiti

Dann scannen Sie Ihre Site mit wapiti mit dem folgenden Befehl:

wapiti http:// -n 10 -b folder

Stellen Sie sicher, dass Sie "+ example.org " durch den Namen Ihrer Site ersetzen. Wir haben dem Befehl zwei zusätzliche Argumente gegeben. Das erste " -n 10 " begrenzt die Anzahl der URLs mit demselben Muster auf 10, damit Endlosschleifen vermieden werden. Das zweite Argument " -b Ordner +" legt den Gültigkeitsbereich des Scans nur auf die angegebene Domäne fest.

Nach Abschluss des Scans befinden sich die Ergebnisse in einem Verzeichnis mit dem Namen "+ generated_report " in dem Verzeichnis, in dem Sie den Scan ausgeführt haben. Laden Sie dieses Verzeichnis für eine optimale Anzeige auf Ihren lokalen Computer herunter und öffnen Sie die Datei " index.html" mit einem Webbrowser.

Im Bericht werden die Sicherheitsanfälligkeiten in 10 verschiedenen Kategorien angezeigt: SQL Injection, Blind SQL Injection, Dateihandhabung, Cross Site Scripting, CRLF, Befehlsausführung, Ressourcenverbrauch, Htaccess-Umgehung, Sicherungsdatei und potenziell gefährliche Datei.

Im Idealfall sollte Ihr Bericht so aussehen, ohne dass Schwachstellen gefunden werden:

Wenn es Schwachstellen gibt, können Sie den entsprechenden Teil des Scans erweitern, um weitere Informationen zu erhalten.

Stellen Sie sicher, dass Sie solche Scans häufig und mit verschiedenen Tools ausführen, um eine möglichst vollständige und gründliche Prüfung Ihrer Nginx-Produkte und Websites zu gewährleisten.

[[step-5-- taking-additional-security-measures]] === Schritt 5 - Ergreifen zusätzlicher Sicherheitsmaßnahmen

Einige Themen in Bezug auf die Nginx-Sicherheit werden in diesem Artikel nicht behandelt, da es bereits hervorragende Artikel zu diesen Themen gibt. Bitte machen Sie sich mit folgenden vertraut:

Naxsi ist eine Webanwendungs-Firewall für Nginx. Es schützt Sie sowohl vor bekannten als auch vor unbekannten Sicherheitslücken im Internet, indem es eine Sammlung böswilliger Signaturen verwendet.

Sie sollten wissen, dass Naxsi eine komplexe Software ist und dass die Optimierung einige Zeit und Mühe in Anspruch nimmt. Glücklicherweise gibt es leicht verfügbare Konfigurationen für die meisten gängigen Webanwendungen, die Sie bei Bedarf weiter anpassen können.

Fail2ban ist ein großartiges Tool, um die Web-Sicherheit auf die nächste Stufe zu heben und Ihren Nginx-Server proaktiv zu schützen. Bisher haben wir Benutzer daran gehindert, bestimmte Informationen zu finden und auf Teile unserer Website zuzugreifen. Mit fail2ban können Sie Angreifer für einen bestimmten Zeitraum blockieren, wenn Sie feststellen, dass sie böswillige Aktivitäten ausführen.

Überwachung ist für die Sicherheit von entscheidender Bedeutung, und Monit ist ein hervorragendes Tool für diesen Zweck, das Nginx gut unterstützt. Webprotokolle zeigen nicht nur Spuren böswilliger Aktivitäten, sondern auch Spitzen bei der CPU-Auslastung und der Speichernutzung.

Achten Sie in diesem Artikel besonders auf Schritt 5 - Überwachen von Protokollen auf Fehler und Schlüsselwörter. Dort können Sie benutzerdefinierte Warnungen konfigurieren, die bei Sicherheitsereignissen gesendet werden, z. B. wenn jemand auf sensible Teile Ihrer Site (s) zugreift oder versucht, darauf zuzugreifen.

Eine Firewall ist sehr wichtig für die Sicherheit Ihres Nginx und Ihres gesamten Tropfens. Stellen Sie sicher, dass Sie den https (tcp 443) -Port zu den zulässigen eingehenden Verbindungen neben dem standardmäßigen http (tcp 80) -Port hinzufügen.

Ein Datei- und Verzeichnisintegritätsprüfer wie AIDE warnt vor Änderungen an Dateien und Verzeichnissen. Dies ist besonders praktisch für Webdateien, da Sie wissen sollten, wann Teile Ihrer Site geändert und neue Dateien / Verzeichnisse hinzugefügt werden. Um mehr über AIDE zu erfahren, können Sie mit dem Artikel beginnen.

Der obige Artikel ist etwas veraltet und nicht speziell für Ubuntu geschrieben. Sie sollten es jedoch problemlos anpassen und auch für Ubuntu 14.04 anwenden können. Wenn Sie AIDE oder ein ähnliches Tool konfigurieren, müssen Sie sicherstellen, dass Ihre Webprotokolle und temporären Dateien wie der Webcache nicht überwacht werden.

Fazit

Nach dem Lesen dieses Artikels sollten Sie sich in Bezug auf die Nginx-Sicherheit sicherer fühlen. Achten Sie nur auf das Gleichgewicht zwischen Funktionalität und Sicherheit, damit Sie sicher sein können, dass Ihre Webumgebung wie geplant und dennoch sicher funktioniert. Denken Sie auch daran, dass das Sichern von Nginx eine fortlaufende Aufgabe ist, die regelmäßig aktualisiert, neu konfiguriert, gescannt usw. werden muss.