Kann ich alle Server / Betriebssystem-Informationen ausblenden?

80

Ich möchte nicht, dass jemand erkennt, dass ich NGINX oder sogar Ubuntu aus dem Internet verwende. Es gibt Tools (z. B. BuiltWith), mit denen die Server überprüft werden, um festzustellen, welche Tools sie verwenden. Einige Knackwerkzeuge können auch beim Lösen helfen. Was ist das Beste / Nächste, das ich erreichen kann, um all diese Informationen von außen zu verbergen?

orokusaki
quelle

Antworten:

115

Sie können die Ausgabe der Version von Nginx und des Betriebssystems stoppen, indem Sie hinzufügen

server_tokens off;

zu einem http, serveroder locationKontext.

Wenn Sie den Server-Header vollständig entfernen möchten, müssen Sie Nginx mit dem Modul "Headers More" kompilieren, da der Header in der Nginx-Quelle fest codiert ist und dieses Modul das Ändern von HTTP-Headern ermöglicht.

 more_clear_headers Server;

Es gibt jedoch viele versteckte Möglichkeiten, wie Server durch ihre Implementierung versehentlich arbeiten, um das System zu identifizieren. zB Wie es auf eine schlechte SSL-Anfrage reagiert. Ich sehe keinen praktischen Weg, dies zu verhindern.

Einige der Dinge, die ich vorschlagen könnte:

  • Fehlervorlagen ändern
  • Blockieren Sie alle Ports mit Ausnahme der benötigten Dienste
Andy
quelle
15
Einverstanden. Schauen Sie sich zum Beispiel die Betriebssystemerkennung von nmap an. Hierbei werden die Antworten der Zielhosts auf IP / TCP-Anforderungen angezeigt, und das Betriebssystem kann auf diese Weise bestimmt werden. Es lohnt sich wirklich nicht, sich darum zu kümmern.
EEAA
6
+1 auf den Rat von ErikA. Es ist besser, Ihren Server so gut wie möglich zu schützen, als sich auf Sicherheit durch Unbekanntheit zu verlassen.
Andy Smith
4
Servertoken deaktivieren nur die Versionsnummer. In Nginx kann der Header nicht vollständig entfernt werden.
Martin Fjordvald
45
Das Ignorieren wichtiger Sicherheitsfaktoren wie "Keine Versionsnummern" und wahrscheinlich sogar "Kein Serveranbietername" ist nur ... ein Anfängerfehler. Natürlich tut Sicherheit durch Unbekanntheit nichts für Ihre Sicherheit selbst, aber es ist absolut sicher , dass es zumindest vor den banalsten, einfachsten Angriffsmethoden schützt - Sicherheit durch Unbekanntheit ist ein notwendiger Schritt, es kann der erste sein und sollte niemals der letzte sein Das vollständige Überspringen der Messung ist ein sehr schwerwiegender Fehler. Selbst die sichersten Webserver können geknackt werden, wenn ein versionsspezifischer Angriffsvektor bekannt ist.
Specializt
1
Es gibt immer noch einen nervigen Servernamen "Nginx", der im Hauptteil einer 301-Umleitungsantwort zurückgegeben wird. Bisher wurde keine Möglichkeit gefunden, dies zu vermeiden. Die Regel zur Verwendung einer benutzerdefinierten HTML-Vorlage funktioniert für 301 nicht.
Guillaume Perrot
31

Wenn Sie nginx mit apt-get in Debian oder Ubuntu installiert haben, müssen Sie möglicherweise das Paket nginx-extras installieren, um den "Server" -Header zu setzen oder zu löschen

Sobald dies erledigt ist, können Sie die folgenden Zeilen in nginx.conf hinzufügen (normalerweise /etc/nginx/nginx.conf):

So löschen Sie den Header "Server" insgesamt:

more_clear_headers Server; 

So legen Sie eine benutzerdefinierte Zeichenfolge als "Server" fest

more_set_headers 'Server: some-string-here';
Packetlord
quelle
1
Bestätigte more_clear_headers Server;Arbeiten auch an Debian Jessie 8.5 nginx-Version: nginx / 1.6.2
Brandon
Diese Antwort braucht mehr Gegenstimmen. Obwohl vielleicht zu beachten ist, dass die Direktive in den http-Block der conf-Datei gestellt werden muss (glaube ich)
Andy
2
Dies funktioniert in http, server, location, und location ifKontexte. Quelle: ngx_headers_more documentation
Kelvin
1
Für Ubuntu-Benutzer: sudo apt-get install nginx-extras und setzen Sie dann die Header
jchnxu
Bei mir ist das mit gescheitert unknown directive "more_set_headers". Gelöst durch explizites Aktivieren des Moduls in /etc/nginx/nginx.conf. Einfach load_module modules/ngx_http_headers_more_filter_module.so;am Anfang der Konfigurationsdatei hinzufügen .
Rapstacke
18

@ Martin F. Ja, das tut es. Sie müssen es aus dem Quellcode kompilieren und die erforderlichen Änderungen vornehmen, bevor Sie den Quellcode kompilieren können.

Ich nehme an, Sie haben die letzte stabile Version heruntergeladen, die Sie dekomprimiert haben, und Sie wissen, wo sich die Dateien befinden. Wenn dies der Fall ist, gehen Sie wie folgt vor:

nano src/http/ngx_http_header_filter_module.c

Suchen Sie dann nach Zeile 48, wenn ich mich richtig erinnere.

static char ngx_http_server_string[] = "Server: nginx" CRLF;

Ersetzen Sie nginx durch MyWhateverServerNameIWant

static char ngx_http_server_string[] = "Server: MyWhateverServerNameIWant" CRLF; 

Dann

nano src/core/nginx.h 

suche nach der Linie

#define NGINX_VER          "nginx/" NGINX_VERSION

Ändern Sie "nginx /" in "MyWhateverServerNameIWant /", damit es liest

#define NGINX_VER          "MyWhateverServerNameIWant" NGINX_VERSION

Schließlich, wenn Sie auch die Versionsnummer ändern möchten

suche die Zeile #define NGINX_VERSION "1.0.4"

und ändern Sie "1.0.4" für die gewünschte Version. Zum Beispiel wird es lesen

#define NGINX_VERSION      "5.5.5"

Ich hoffe es hilft. Dennoch. Das Sichern eines Servers geht weit darüber hinaus, nicht zu zeigen, was läuft. PHP ist von Natur aus unsicher, genauso wie Linux. Natürlich kann Linux ziemlich sicher sein, wenn alle erforderlichen Maßnahmen ergriffen werden, um eine angemessene Sicherheit zu erreichen. In Bezug auf PHP würde ich die Verwendung von Suoshin empfehlen , um die Sicherheit Ihres Codes zu verbessern .

Martin M
quelle
4
+1, danke. Ich verlasse @ Andy als Beamter, nur wegen der einfacheren Herangehensweise, aber das sind ausgezeichnete Informationen.
Orokusaki
Ich denke du meinst Suhosin.
Käfer
7

Nachdem ich viel Zeit damit verbracht hatte, eine benutzerdefinierte Version von Nginx auf Ubuntu zu erstellen, wurde mir klar, dass Sie dafür das Lua-Modul verwenden können.

Wenn Sie unter Ubuntu 14.04 das nginx-extrasPaket installieren , können Sie den Server-Header entfernen, indem Sie Folgendes verwenden:

header_filter_by_lua 'ngx.header["server"] = nil';

Wenn Sie dies in den http-Block werfen, fehlt jeder Anfrage ein ServerHeader.

Wenn dies nicht funktioniert nginx -V, überprüfen Sie, ob das Lua-Modul in Ihrer Kopie von Nginx kompiliert ist. Wenn nicht, gibt es wahrscheinlich ein alternatives Paket, mit dem Sie es bekommen können.

matschaffer
quelle
Bestätigt, dass dies auf Debian Jessie 8.5 funktioniert.
Brandon
1
Bei Debian-Tests scheint dies nicht zu funktionieren, ABER die Installation nginx-extrahat more_set_headers "Server: whatever";funktioniert, also +1: D
Shautieh
Sie müssen nur LUA aktivieren, damit dies funktioniert. Tnx
glavić
6

Anstelle der Anweisung header_filter_by_lua wird empfohlen, die neue Anweisung header_filter_by_lua_block zu verwenden, die die Lua-Quelle direkt zwischen geschweiften Klammern ( {}) einfügt . Damit ist es nicht erforderlich, Sonderzeichen zu entkommen.

header_filter_by_lua_block { ngx.header["server"] = nil }

https://github.com/openresty/lua-nginx-module#header_filter_by_lua_block

Jürgen Kraus
quelle
1

In erster Linie: Warum ein zusätzliches Modul als Header More Nginx verwenden? Nur um den Serverheader auszublenden. Bei einigen Zeilen kann ein einfacher Patch dieselbe Lösung für Sie erreichen.

Da die Verwendung eines zusätzlichen Moduls zu Instabilität (wie gut wurde es mit Ihrer Umgebung getestet? Mit Ihren anderen Modulen usw.) oder Unsicherheit führen kann (wird dieses Modul regelmäßig mit Fehler- und / oder Sicherheitskorrekturen aktualisiert?)

Zweitens. Dieser Thread beschreibt als Antwort 279389, wie Sie den Nginx-Code anpassen können, um den Server-Header zu ändern. Problem ist, dass sie HTTP / 2 vergessen haben. Kurz gesagt, wird sich nichts ändern. Der Serverheader ist weiterhin sichtbar.

Weniger ist mehr ist besser. Ok, ich gebe zu, ich habe auch lange nach einer guten Lösung gesucht. Aber endlich gefunden:

Patch zum Entfernen des Nginx-Server-Headers

Ich bin endlich von diesem nervigen Nginx-Server-Header befreit.

Bertus Du Jang
quelle
0

Führen Sie diese Bash-Funktion im Nginx-Quellcode-Ordner aus. In der nginx- $ -Version, nicht in src /.

Basierend auf dieser Antwort .

hidengxver () {
read -r -p "Your own http_server_string for safety: " http_server_string
first_string="static char ngx_http_server_string\[\] = \"Server: nginx\" CRLF;"
second_string="static char ngx_http_server_string\[\] = \"$http_server_string\" CRLF;"
sed -ire "s/$first_string/$second_string/g" src/http/ngx_http_header_filter_module.c

read -r -p "Your own NGINX_VER const: " nginx_ver
third_string="\#define NGINX\_VER          \"nginx\/\" NGINX\_VERSION"
forth_string="\#define NGINX\_VER          \"$nginx_ver\" NGINX\_VERSION"
sed -ire "s/$third_string/$forth_string/g" src/core/nginx.h

real_nginx_version=$( grep '#define NGINX_VERSION' src/core/nginx.h | gawk -F'"' '{print $2}' )
read -r -p "Your own NGINX_VERSION const: " new_nginx_version
fifth_string="\#define NGINX\_VERSION      \"$real_nginx_version\""
sixth_string="\#define NGINX\_VERSION      \"$new_nginx_version\""
sed -ire "s/$fifth_string/$sixth_string/g" src/core/nginx.h
}
stranger777
quelle
-1

Beziehen Sie sich auf diesen Kern . Wird dir sicherlich helfen.

Aamish Baloch
quelle
9
Willkommen bei Server Fault! Während dies theoretisch die Frage beantworten mag, wäre es vorzuziehen , die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen.
Gerald Schneider