Wie man die NGINX-Sicherheit erhöht (härtet)

NGINX härten mit Servern im Hintergrund

Es gibt zwar viele Möglichkeiten, die Sicherheit deines NGINX-Servers mit Zusatzanwendungen wie Google PAM, OSSEC, Fail2Ban, Crowdsec und SNORT zu erhöhen, aber der beste Ausgangspunkt sind wahrscheinlich die Standard-Sicherheitsrichtlinien, die von Haus aus in NGINX und in deiner Linux-Distribution implementiert sind. In diesem Fall werden wir die Sicherheit nur auf NginX verstärken.

Um alles sauber und übersichtlich zu halten, erstelle ich gerne separate .conf-Dateien, meine eigenen Best Practices für Sicherheitsrichtlinien. In diesem Beispiel werden wir also die Richtlinien mit dieser Logik erstellen.

Lerne NGINX im Detail kennen

Der Kurs Nginx High Performance Webserver - Der schnelle Einstieg behandelt in über 11 Stunden die Installation, Konfiguration und Optimierung von NGINX, einschließlich der Konfiguration von Server-Blöcken, SSL/TLS-Verschlüsselung, Load Balancing, Reverse Proxy, Performance-Optimierung, Sicherheit und fortgeschrittenen Konfigurationstechniken wie dem Schreiben von NGINX-Modulen.

Buche jetzt meinen NGINX Kurs auf Udemy oder werde Youtube Mitglied im Experten status und Zugang zu über 1400 Lektionen aus allen meinen Kursen zu erhalten.

Erstellen der sec.conf

Zuerst schreiben wir eine neue Datei mit dem Nano Editor und nennen sie sec.conf. Wir legen diese Datei im NGINX-Ordner unter /etc/nginx/common ab:

sudo nano /etc/nginx/common/sec.conf

In dieser Datei werden wir 8 Sicherheitsrichtlinien hinzufügen, um einige der häufigsten Bedrohungen zu schützen. Du wirst bemerken, dass ich für alle von ihnen Return 404 verwende. Das liegt daran, dass die Wiedergabe bestimmter Fehlercodes Hackern mehr Einblick gewährt, als du wahrscheinlich willst. Du musst jede einzelne Richtlinie kopieren und einfügen, damit das Endergebnis wie in Abbildung 9 aussieht:

1. Schutz vor SQL-Injection

##
# Protect against SQL injection
##
location ~* "(eval()" { deny all; }
location ~* "(127.0.0.1)" { deny all; }
location ~* "([a-z0-9]{2000})" { deny all; }
location ~* "(javascript:)(.*)(;)" { deny all; }
location ~* "(base64_encode)(.*)(()" { deny all; }
location ~* "(GLOBALS|REQUEST)(=|[|%)" { deny all; }
location ~* "(<|%3C).*script.*(>|%3)" { deny all; }
location ~ "(|...|../|~|`|<|>||)" { deny all; }
location ~* "(boot.ini|etc/passwd|self/environ)" { deny all; }
location ~* "(thumbs?(_editor|open)?|tim(thumb)?).php" { deny all; }
location ~* "('|")(.*)(drop|insert|md5|select|union)" { deny all; }
location ~* "(https?|ftp|php):/" { deny all; }
location ~* "(='|=%27|/'/?)." { deny all; }
location ~ "({0}|(/(|...|+++|"")" { deny all; }
location ~ "(~|`|<|>|:|;|%||s|{|}|[|]||)" { deny all; }
location ~* "/(=|$&|_mm|(wp-)?config.|cgi-|etc/passwd|muieblack)" { deny all; }
location ~* "(&pws=0|_vti_|(null)|{$itemURL}|echo(.*)kae|etc/passwd|eval(|self/environ)" { deny all; }
location ~* ".(aspx?|bash|bak?|cfg|cgi|dll|exe|git|hg|ini|jsp|log|mdb|out|sql|svn|swp|tar|rdf)$" { deny all; }
location ~* "/(^$|mobiquo|phpinfo|shell|sqlpatch|thumb|thumb_editor|thumbopen|timthumb|webshell).php" { deny all; }

2. SQL-Injection-Versuche blockieren

##
# Block SQL injections
##
set $block_sql_injections 0; if ($query_string ~ "union.*select.*(") { set $block_sql_injections 1; }
if ($query_string ~ "union.*all.*select.*") { set $block_sql_injections 1; }
if ($query_string ~ "concat.*(") { set $block_sql_injections 1; }
if ($block_sql_injections = 1) { return 404; }

3. Blockdatei-Injektionen

##
# Block File injections
##
set $block_file_injections 0;
if ($query_string ~ "[a-zA-Z0-9_]=http://") { set $block_file_injections 1; }
if ($query_string ~ "[a-zA-Z0-9_]=(..//?)+") { set $block_file_injections 1; }
if ($query_string ~ "[a-zA-Z0-9_]=/([a-z0-9_.]//?)+") { set $block_file_injections 1; }
if ($block_file_injections = 1) { return 404; }

4. Allgemeine Exploits blockieren

##
# Block common exploits
##
set $block_common_exploits 0;
if ($query_string ~ "(<|%3C).*script.*(>|%3E)") { set $block_common_exploits 1; }
if ($query_string ~ "GLOBALS(=|[|%[0-9A-Z]{0,2})") { set $block_common_exploits 1; }
if ($query_string ~ "_REQUEST(=|[|%[0-9A-Z]{0,2})") { set $block_common_exploits 1; }
if ($query_string ~ "proc/self/environ") { set $block_common_exploits 1; }
if ($query_string ~ "mosConfig_[a-zA-Z_]{1,21}(=|%3D)") { set $block_common_exploits 1; }
if ($query_string ~ "base64_(en|de)code(.*)") { set $block_common_exploits 1; }
if ($block_common_exploits = 1) { return 404; }

5. SPAM blockieren

##
# Block SPAM
##
set $block_spam 0;
if ($query_string ~ "b(ultram|unicauca|valium|viagra|vicodin|xanax|ypxaieo)b") { set $block_spam 1; }
if ($query_string ~ "b(erections|hoodia|huronriveracres|impotence|levitra|libido)b") { set $block_spam 1; }
if ($query_string ~ "b(ambien|bluespill|cialis|cocaine|ejaculation|erectile)b") { set $block_spam 1; }
if ($query_string ~ "b(lipitor|phentermin|pro[sz]ac|sandyauer|tramadol|troyhamby)b") { set $block_spam 1; }
if ($block_spam = 1) { return 404; }

6. Benutzeragenten blockieren

##
# Block user agents
##
set $block_user_agents 0;
# Don't disable wget if you need it to run cron jobs!
#if ($http_user_agent ~ "Wget") { set $block_user_agents 1; }
# Disable Akeeba Remote Control 2.5 and earlier
if ($http_user_agent ~ "Indy Library") { set $block_user_agents 1; }

7. Schützt vor gängigen Bandbreitenfressern und Hacking-Tools.

##
# Protect against common bandwidth hoggers and hacking tools.
##
if ($http_user_agent ~ "libwww-perl") { set $block_user_agents 1; }
if ($http_user_agent ~ "GetRight") { set $block_user_agents 1; }
if ($http_user_agent ~ "GetWeb!") { set $block_user_agents 1; }
if ($http_user_agent ~ "Go!Zilla") { set $block_user_agents 1; }
if ($http_user_agent ~ "Download Demon") { set $block_user_agents 1; }
if ($http_user_agent ~ "Go-Ahead-Got-It") { set $block_user_agents 1; }
if ($http_user_agent ~ "TurnitinBot") { set $block_user_agents 1; }
if ($http_user_agent ~ "GrabNet") { set $block_user_agents 1; }
if ($block_user_agents = 1) { return 404; }

8. Schutz vor IP-Spoofing

##
#Protect against IP spoofing
##
if ($host !~* ^(.*ayrne.com|d+.d+.d+.d+)$ ) { return 404; }
server_name 99.129.87.23; # Public IP
server_name 127.0.0.1; # Private IP

9. Deine komplette sec.conf sollte so aussehen

##
# Protect against SQL injection
##
location ~* "(eval()"  { deny all; }
location ~* "(127.0.0.1)"  { deny all; }
location ~* "([a-z0-9]{2000})"  { deny all; }
location ~* "(javascript:)(.*)(;)"  { deny all; }
location ~* "(base64_encode)(.*)(()"  { deny all; }
location ~* "(GLOBALS|REQUEST)(=|[|%)"  { deny all; }
location ~* "(<|%3C).*script.*(>|%3)" { deny all; }
location ~ "(|...|../|~|`|<|>||)" { deny all; }
location ~* "(boot.ini|etc/passwd|self/environ)" { deny all; }
location ~* "(thumbs?(_editor|open)?|tim(thumb)?).php" { deny all; }
location ~* "('|")(.*)(drop|insert|md5|select|union)" { deny all; }
location ~* "(https?|ftp|php):/" { deny all; }
location ~* "(='|=%27|/'/?)." { deny all; }
location ~ "({0}|(/(|...|+++|"")" { deny all; }
location ~ "(~|`|<|>|:|;|%||s|{|}|[|]||)" { deny all; }
location ~* "/(=|$&|_mm|(wp-)?config.|cgi-|etc/passwd|muieblack)" { deny all; }
location ~* "(&pws=0|_vti_|(null)|{$itemURL}|echo(.*)kae|etc/passwd|eval(|self/environ)" { deny all; }
location ~* ".(aspx?|bash|bak?|cfg|cgi|dll|exe|git|hg|ini|jsp|log|mdb|out|sql|svn|swp|tar|rdf)$" { deny all; }
location ~* "/(^$|mobiquo|phpinfo|shell|sqlpatch|thumb|thumb_editor|thumbopen|timthumb|webshell).php" { deny all; }
##
# Block SQL injections
##
set $block_sql_injections 0; if ($query_string ~ "union.*select.*(") { set $block_sql_injections 1; }
if ($query_string ~ "union.*all.*select.*") { set $block_sql_injections 1; }
if ($query_string ~ "concat.*(") { set $block_sql_injections 1; }
if ($block_sql_injections = 1) { return 404; }
##
# Block File injections
##
set $block_file_injections 0;
if ($query_string ~ "[a-zA-Z0-9_]=http://") { set $block_file_injections 1; }
if ($query_string ~ "[a-zA-Z0-9_]=(..//?)+") { set $block_file_injections 1; }
if ($query_string ~ "[a-zA-Z0-9_]=/([a-z0-9_.]//?)+") { set $block_file_injections 1; }
if ($block_file_injections = 1) { return 404; }
##
# Block common exploits
##
set $block_common_exploits 0;
if ($query_string ~ "(<|%3C).*script.*(>|%3E)") { set $block_common_exploits 1; }
if ($query_string ~ "GLOBALS(=|[|%[0-9A-Z]{0,2})") { set $block_common_exploits 1; }
if ($query_string ~ "_REQUEST(=|[|%[0-9A-Z]{0,2})") { set $block_common_exploits 1; }
if ($query_string ~ "proc/self/environ") { set $block_common_exploits 1; }
if ($query_string ~ "mosConfig_[a-zA-Z_]{1,21}(=|%3D)") { set $block_common_exploits 1; }
if ($query_string ~ "base64_(en|de)code(.*)") { set $block_common_exploits 1; }
if ($block_common_exploits = 1) { return 404; }
##
# Block SPAM
##
set $block_spam 0;
if ($query_string ~ "b(ultram|unicauca|valium|viagra|vicodin|xanax|ypxaieo)b") { set $block_spam 1; }
if ($query_string ~ "b(erections|hoodia|huronriveracres|impotence|levitra|libido)b") { set $block_spam 1; }
if ($query_string ~ "b(ambien|bluespill|cialis|cocaine|ejaculation|erectile)b") { set $block_spam 1; }
if ($query_string ~ "b(lipitor|phentermin|pro[sz]ac|sandyauer|tramadol|troyhamby)b") { set $block_spam 1; }
if ($block_spam = 1) { return 404; }
##
# Block user agents
##
set $block_user_agents 0;
# Don't disable wget if you need it to run cron jobs!
#if ($http_user_agent ~ "Wget") { set $block_user_agents 1; }
# Disable Akeeba Remote Control 2.5 and earlier
if ($http_user_agent ~ "Indy Library") { set $block_user_agents 1; }
##
# Common bandwidth hoggers and hacking tools.
##
if ($http_user_agent ~ "libwww-perl") { set $block_user_agents 1; }
if ($http_user_agent ~ "GetRight") { set $block_user_agents 1; }
if ($http_user_agent ~ "GetWeb!") { set $block_user_agents 1; }
if ($http_user_agent ~ "Go!Zilla") { set $block_user_agents 1; }
if ($http_user_agent ~ "Download Demon") { set $block_user_agents 1; }
if ($http_user_agent ~ "Go-Ahead-Got-It") { set $block_user_agents 1; }
if ($http_user_agent ~ "TurnitinBot") { set $block_user_agents 1; }
if ($http_user_agent ~ "GrabNet") { set $block_user_agents 1; }
if ($block_user_agents = 1) { return 404; }
##
#Protect against IP spoofing
##
if ($host !~* ^(.*ayrne.com|d+.d+.d+.d+)$ ) { return 404; }
server_name 99.129.87.23; # Public IP
server_name 127.0.0.1; # Private IP

10. Speichern die Datei sec.conf

Angenommen, deine komplette Datei sieht so aus, dann schließe die Datei und speichere sie.

11. Mache die neuen Sicherheitsrichtlinien aktiv

Um deine neuen Sicherheitsrichtlinien zu aktivieren, musst du die Datei in deiner Standard-NGINX-Konfiguration aufrufen, indem du die folgende Zeile hinzufügst:

include common/sec.conf;

Du musst auch NGINX neu starten, damit die neuen Richtlinien wirksam werden, aber bevor wir das tun, überprüfen wir die Integrität der Einträge, die wir gemacht haben:

nginx -t

Wenn alles in Ordnung ist, erhältst du eine Bestätigung, die wie folgt aussieht

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Damit die Richtlinien aktiv werden, muss NGINX neu gestartet werden:

service nginx restart

Das war's - wir sind fertig, dein NGINX ist nun sicherer!

Tipp: Bei meinen NGINX Kurs findest du noch viele weitere Konfigurationsmöglichkeiten, Tipps und Tricks rund um NGINX. Du kannst den Kurs Buchen auf Udemy oder bei Youtube auf meinen Kanal als Experten Mitglied wo du auch den Zugang zu über 1400 Lektionen aus allen meinen Kursen bekommst.

DER NEWSLETTER FÜR IT-BEGEISTERTE

Trag dich ein für den Newsletter und bleib auf dem Laufenden über alle neuesten Aktionen und IT-News!

Wir senden keinen Spam! Erfahre mehr in unserer Datenschutzerklärung.