GNU/Linux >> Tutoriels Linux >  >> Linux

nginx :comment bloquer les exploits, les injections SQL, les injections de fichiers, le spam, les agents utilisateurs, etc.

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.

  • 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".


Linux
  1. Comment configurer un proxy inverse Nginx

  2. Comment créer un hôte virtuel Nginx (bloc serveur)

  3. Comment supprimer les entrées indésirables dans le fichier /etc/shadow

  4. Comment empêcher un utilisateur non root de créer une entrée crontab sous Linux

  5. getpwnam(www) a échoué dans /etc/nginx/nginx.conf

Comment définir ou modifier l'agent utilisateur avec curl

Comprendre le fichier /etc/passwd

Comment changer ou définir un mot de passe utilisateur sous Linux

Comment bloquer XML-RPC dans WordPress en utilisant Nginx/Apache

Qu'est-ce que le fichier /etc/passwd sous Linux ?

Comment configurer un serveur Seafile avec Nginx sur Ubuntu 18.04