Dieser kurze Artikel erklärt, wie Sie die häufigsten Exploits, SQL-Injektionen, Datei-Injektionen, Spam und Benutzeragenten, die von Hackern und Bandbreitenfressern verwendet werden, mit einigen einfachen Konfigurationsanweisungen von Ihren nginx-Vhosts blockieren können. Diese Konfiguration ist noch lange nicht vollständig, aber sie ist ein guter Ausgangspunkt. Sie müssen Ihre Protokolle auf versuchte Einbruchsversuche überwachen und dann versuchen, den Regelsatz zu ändern/zu vervollständigen.
Ändern Sie Ihre Nginx-Vhosts
Der Regelsatz, den ich hier verwende, muss in jeden nginx-Vhost (innerhalb eines Server-{}-Containers) eingefügt werden, wo Sie ihn verwenden möchten. Leider kann es nicht global verwendet werden, da die set-Direktive nicht innerhalb des http {}-Containers erlaubt ist.
server { [...] ## 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 403; } ## 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 403; } ## 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 403; } ## 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|blue\spill|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 403; } ## 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 403; } [...] }
Immer wenn eine der Regeln mit einer Anfrage übereinstimmt, wird ein 403 Forbidden-Fehler an den Client zurückgegeben. Ich habe die wget-Regel hier auskommentiert, da dies auch Cron-Jobs blockieren würde, die wget verwenden, was bei modernen CMS-Anwendungen recht häufig vorkommt. Wenn Ihre Anwendung wget nicht verwendet, können Sie diese Regel auch auskommentieren.
Vergessen Sie nicht, nginx neu zu laden:
service nginx reload
ISPConfig Nginx-Server
Diese Regeln können auch im Feld Nginx-Anweisungen in ISPConfig verwendet werden. Fügen Sie einfach die Regeln in das Feld Nginx-Richtlinien auf der Registerkarte Website-Optionen in ISPConfig ein, ohne den umgebenden Serverblock { ... }. Das Neuladen von nginx wird von ISPConfig automatisch angewendet, wenn Sie die Änderungen speichern.
Links
- nginx:http://nginx.org/
Über den Autor
Falko Timme ist Der Besitzer von Timme Hosting (ultraschnelles Nginx-Webhosting). Er ist der Hauptbetreuer von HowtoForge (seit 2005) und einer der Kernentwickler von ISPConfig (seit 2000). Er hat auch zum O'Reilly-Buch "Linux System Administration" beigetragen.