Ce court article explique comment vous pouvez bloquer les exploits les plus courants, les injections SQL, les injections de fichiers, les spams et les agents utilisateurs utilisés par les pirates et les accapareurs de bande passante de vos vhosts nginx avec quelques directives de configuration simples. Cette configuration est loin d'être complète, mais c'est un bon point de départ. Vous devrez surveiller vos journaux pour les tentatives d'effraction, puis essayer de modifier/compléter l'ensemble de règles.
Modifier vos Vhosts Nginx
L'ensemble de règles que j'utilise ici doit être inséré dans chaque vhost nginx (à l'intérieur d'un conteneur de serveur {}) où vous souhaitez l'utiliser. Malheureusement, il ne peut pas être utilisé globalement car la directive set n'est pas autorisée dans le conteneur http {}.
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; } [...] }
Chaque fois qu'une des règles correspond à une requête, une erreur 403 Forbidden est renvoyée au client. J'ai commenté la règle wget ici car cela bloquerait également les tâches cron qui utilisent wget, ce qui est assez courant parmi les applications CMS modernes. Si votre application n'utilise pas wget, vous pouvez également décommenter cette règle.
N'oubliez pas de recharger nginx :
service nginx reload
Serveurs ISPConfig Nginx
Ces règles peuvent également être utilisées dans le champ Directives Nginx dans ISPConfig. Collez simplement les règles dans le champ Nginx Directives de l'onglet des options du site Web dans ISPConfig, sans le bloc de serveur { ... } environnant. Le rechargement nginx est automatiquement appliqué par ISPConfig lorsque vous enregistrez les modifications.
Liens
- nginx :http://nginx.org/
À propos de l'auteur
Falko Timme est le propriétaire de Timme Hosting (hébergement web nginx ultra-rapide). Il est le mainteneur principal de HowtoForge (depuis 2005) et l'un des principaux développeurs d'ISPConfig (depuis 2000). Il a également contribué au livre O'Reilly "Linux System Administration".