web-dev-qa-db-fra.com

J'ai besoin de règles pour abandonner une connexion Apache malveillante

Je laisse tout le trafic sur les ports sauf sur 80 pour mon serveur Web.

J'ai des règles comme celle-ci sur iptables:

iptables -A INPUT -p tcp -m tcp --dport 80 -m string --string "cgi" --algo bm --to 1000 -j DROP

Quelqu'un qui en a plus peut partager? Je sais que les mauvais pirates continuent de se mettre à jour, mais certains d'entre eux commencent toujours par le même code. Je dois abandonner la connexion en fonction de certains critères. Voici quelques journaux Apache (je supprime les ips mais chaque atack provient du même):

Attaque 1: Je ne sais pas ce que j'essaie de faire, mais fais 50 fois de la même adresse IP

GET / HTTP/1.1  301 224 -   Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.152 Safari/537.22
GET / HTTP/1.1  302 3387    -   Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.152 Safari/537.22

Attaque 2: cette tentative d'obtenir des informations sur le serveur uniquement.

GET / HTTP/1.1  301 224 http://myip:80/ Go-http-client/1.1
GET / HTTP/1.1  302 3228    http mywebsite  Go-http-client/1.1
GET /es/ HTTP/1.1   200 40947   https mywebsite Go-http-client/1.1

Attaque 3: ils essaient d'avoir accès à une vulnérabilité de page de connexion

GET /userlogin/login.aspx HTTP/1.1  302 186 -   -

Attaque 4: cette tentative d'accéder à un cgi à la première demande, (voir ma première règle iptables pour supprimer ceci)

GET /hndUnblock.cgi HTTP/1.0    302 186 -   Wget(linux)
GET /tmUnblock.cgi HTTP/1.0 302 186 -   Wget(linux)

Je suis très nouveau avec le serveur ces 4 attaques sont de seulement 12 dernières heures ... ont des milliers par semaine.

10
Javier Palmero

Update: La réponse actuelle est complètement mise à jour.

Selon cette discussion , j'ai créé un référentiel GitHub nommé WWW Security Assistant . Il existe une branche, appelée ask_ubuntu, dédiée à cette réponse. Toutes les références, précédemment disponibles ici , sont supprimées en raison de la limite de caractères - elles sont disponibles sur GitHub.

Voici un aperçu de plusieurs manières, impliquées dans un mécanisme complet, comment augmenter la sécurité Apache2dans Ubuntu 16.04.

Table des matières:

  • WWW Security Assistant Script (WSAS) ► Iptables
  • Iptables - Configuration de base - Enregistrer et restaurer
  • ModEvasive pour Apache2
  • ModEvasive ► WSAS ► Iptables
  • ModSecurity 2.9 pour Apache2
  • Ensemble de règles de base OWASP ModSecurity 3.x
  • Règles de sécurité modélisées
  • Règles ModSecurity ► WSAS ► Iptables
  • Fichiers journaux ModSecurity et Apache
  • Fichiers journaux ModSecurity ► Fail2Ban ► Iptables
  • ModSecurity GuardianLog ► HTTPD Guardian ► WSAS ► Iptables
  • ModSecurity GuardianLog ► Analyse personnalisée HTTPD ► WSAS ► Iptables

En outre, disons qu'il est toujours bon d'utiliser HTTPS:


WWW Security Assistant Script ► Iptables

Ici est présenté le script www-security-assistant.bash . Cela pourrait vous aider à gérer les adresses IP malveillantes. Le script a deux modes.

Mode automatique

Lorsqu'un programme externe, tel que mod_security d'Apache, fournit une adresse $IP illicite. Dans ce cas, la syntaxe qui appelle le script doit être la suivante:

www-security-assistant.bash <ip-address> Guardian
www-security-assistant.bash <ip-address> ModSecurity
www-security-assistant.bash <ip-address> ModEvasive
www-security-assistant.bash <ip-address> a2Analyst

Dans ce mode, le script fournit deux étapes/et pour chaque action, il envoie un courrier électroniqueà l'administrateur.

  • Première étape: pour les premiers 'transgressions'le code source $IP sera interdit pendant une périodeégale à la valeur de $BAN_TIME. Ce mode utilise la commande at.

  • Deuxième étape: lorsque le nombre de transgressions de certains $IP devient égal à la valeur de $LIMIT, cette adresse $IP sera bannie de manière permanentevia Iptables et sera ajoutée au $BAN_LIST.

Mode manuel

Ce mode accepte les options suivantes:

  • www-security-assistant.bash <ip-address>--DROP "log notes"

    Crée une entrée dans le fichier /var/www-security-assistant/iptables-DROP.list et génère une règle comme suit:

    iptables -A GUARDIAN -s $IP -j DROP
    
  • www-security-assistant.bash <ip-address>--DROP-CLEAR "log notes"

    Crée une entrée dans le fichier /var/www-security-assistant/iptables-DROP-CLEAR.list, supprime certaines règles Iptables, supprime le $IP de l'historique et du $BAN_LIST:

    iptables -D GUARDIAN -s $IP -j DROP
    
  • www-security-assistant.bash <ip-address>--ACCEPT "log notes"

    Crée uniquement une entrée dans le fichier /var/www-security-assistant/iptables-ACCEPT.list.

  • www-security-assistant.bash <ip-address>--ACCEPT-CHAIN "log notes"

    Crée une entrée dans le fichier /var/www-security-assistant/iptables-ACCEPT.list et génère une règle comme suit:

    iptables -A GUARDIAN -s $IP -j ACCEPT
    

Les dépendances

Le script utilise iptables-save.sh et la chaîne iptablesGUARDIAN, comme expliqué dans la section suivante. Il créera et maintiendra quelques fichiers dans le $WORK_DIR:

  • www-security-assistant.history - contient les données pour les transgressions de l'IP précédente.
  • www-security-assistant.mail - le contenu du dernier email envoyé par le script.
  • iptables-ACCEPT.list; iptables-DROP.list et iptables-DROP-CLEAR.list.

Le script nécessite une configuration minimale pour envoyer des emails:

Sudo apt install s-nail mutt mailutils postfix
Sudo dpkg-reconfigure postfix  # For General type: Internet Site
echo 'Test passed.' | mail -s Test-Email [email protected]

S'il existe un service HTTPS configuré, son certificat TLS peut être utilisé dans le service Postfix.

De plus, le script utilise at: Sudo apt install at.

Installation

  • Créez un répertoire de travail, appelons-le /var/www-security-assistant. Téléchargez www-security-assistant.bashet rendez-le exécutable:

    Sudo mkdir /var/www-security-assistant
    Sudo wget https://raw.githubusercontent.com/pa4080/www-security-assistant/ask_ubuntu/www-security-assistant.bash -O /var/www-security-assistant/www-security-assistant.bash
    Sudo chmod +x /var/www-security-assistant/www-security-assistant.bash
    
  • Rendre www-security-assistant.bashdisponible en tant que commande personnalisée:

    Sudo ln -s /var/www-security-assistant/www-security-assistant.bash /usr/local/bin/
    
  • Accordez à www-data l'autorisation d'exécuter www-security-assistant.bash sans mot de passe via Sudo. Utilisez la commande suivante pour créer et éditer en toute sécurité un nouveau fichier avec une règle 'sudoers' supplémentaire:

    Sudo visudo -f /etc/sudoers.d/www-security-assistant
    

    Ajoutez la ligne suivante dans le fichier - enregistrez le fichier et quittez:

    www-data ALL=(ALL) NOPASSWD: /var/www-security-assistant/www-security-assistant.bash
    
  • Tweak www-security-assistant.bash. Modifiez au moins la valeur de la variable $EMAIL_TO.

Vérification

  • Représentez-vous comme $AGENT et vérifiez si le MODE automatique fonctionne correctement:

    www-security-assistant.bash 192.168.1.177 Guardian
    

    Ensuite, vérifiez votre courrier électronique, tapez iptables -L GUARDIAN -n, examinez les fichiers www-security-assistant.history et www-security-assistant.mail. Exécutez la commande ci-dessus 5 fois et passez en revue les fichiers iptables-DROP.list et iptables-CURRENT.conf.

  • Vérifiez si le mode manuel fonctionne correctement - ajoutez votre hôte local à la liste blanche:

    www-security-assistant.bash 127.0.0.1 --ACCEPT "Server's localhost IP"
    

    Ensuite, vérifiez le fichier iptables-ACCEPT.list.


Le reste de ce didacticiel explique comment intégrer www-security-assistant à votre système.


Iptables - Configuration de base - Enregistrer et restaurer

Configuration de base

Veuillez lire ce manuel avant d'ajouter les règles suivantes.

Sudo iptables -F

Sudo iptables -I INPUT 1 -i lo -j ACCEPT
Sudo iptables -I INPUT 2 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

Sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
Sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
Sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# This rule may lock you out of the system!
Sudo iptables -P INPUT DROP
Sudo iptables -P OUTPUT ACCEPT

Avant d'effectuer les actions suivantes, ouvrez une nouvelle connexion SSH et essayez de vous connecter à votre système pour vérifier si tout fonctionne bien!

Sauvegarder et restaurer

Cela pourrait être réalisé via des scripts personnalisés, qui enregistreront et restaureront le iptables coning pendant le processus d'arrêt-démarrage (ou de redémarrage) du système. (Si nous utilisons UFW pour configurer les règles Iptables, cette étape n'est pas nécessaire.)

printf '#!/bin/sh\n/sbin/iptables-save > /var/www-security-assistant/iptables-CURRENT.conf\nexit 0\n' | Sudo tee /var/www-security-assistant/iptables-save.sh
printf '#!/bin/sh\n/sbin/iptables-restore < /var/www-security-assistant/iptables-CURRENT.conf\nexit 0\n' | Sudo tee /var/www-security-assistant/iptables-restore.sh
Sudo chmod +x /var/www-security-assistant/iptables-restore.sh /var/www-security-assistant/iptables-save.sh
Sudo ln -s /var/www-security-assistant/iptables-save.sh /etc/network/if-post-down.d/iptables-save
Sudo ln -s /var/www-security-assistant/iptables-restore.sh /etc/network/if-pre-up.d/iptables-restore

Créer une nouvelle chaîne

Créez une nouvelle chaîne, appelée GUARDIAN et insérez-la sous le numéro 3 dans la chaîne INPUT:

Sudo iptables -N GUARDIAN
Sudo iptables -I INPUT 3 -j GUARDIAN

Vérification

Redémarrez le système et vérifiez la configuration. Veuillez utiliser Sudo systemctl reboot (n'utilisez pas l'option de force reboot -f). Lorsque le système est de nouveau en ligne, nous pouvons vérifier si la chaîne nouvellement créée existe en:

Sudo iptables -L GUARDIAN -n


ModEvasive pour Apache2

ModEvasive est un module de manoeuvres d'évitement destiné à Apache afin de permettre une action d'évitement en cas d'attaque HTTP DoS ou DDoS ou d'attaque en force. En lire plus ...

Installation

  • Installez et activez le module:

    Sudo apt install libapache2-mod-evasive
    Sudo a2enmod evasive
    
  • Créez un répertoire de journaux et rendez-le accessible pour www-data:

    Sudo mkdir -p /var/log/Apache2_mod_evasive
    Sudo chown www-data /var/log/Apache2_mod_evasive
    
  • Ajustez la configuration de base - supprimez le commentaire et modifiez certaines directives dans le fichier de configuration:

    /etc/Apache2/mods-enabled/evasive.conf
    
  • Redémarrez Apache: Sudo systemctl restart Apache2.service.

Vérification

  • Ouvrez une page Web à partir de votre serveur et actualisez la fenêtre du navigateur plusieurs fois de manière intensive (appuyez sur F5) - vous devez obtenir le message 403 Interdit error. Dans le répertoire des journaux, un nouveau fichier de verrouillage sera généré. Ce fichier doit être supprimé pour la détection ultérieure des transgressions à partir de cette adresse IP.


ModEvasive ► WSAS ► Iptables

Ici, nous allons configurer mod_evasive pour parler à iptables par le biais de www-security-assistant.bash, créé dans la section ci-dessus.

  • Éditez /etc/Apache2/mods-available/evasive.confde cette manière:

    <IfModule mod_evasive20.c>
        DOSHashTableSize    3097
        DOSPageCount        9
        DOSSiteCount        70
        DOSPageInterval     2
        DOSSiteInterval     2
        DOSBlockingPeriod   10
    
        #DOSEmailNotify     [email protected]
        DOSLogDir           "/var/log/Apache2_mod_evasive"
        DOSSystemCommand    "Sudo /var/www-security-assistant/www-security-assistant.bash %s 'ModEvasive' 'AutoMode' >> /var/www-security-assistant/www-security-assistant.execlog 2>&1"
    </IfModule>
    
  • Créer un fichier journal et redémarrer Apache:

    Sudo touch /var/www-security-assistant/www-security-assistant.execlog && Sudo chown www-data /var/www-security-assistant/www-security-assistant.execlog
    

Pour tester cette configuration, nous pouvons simuler une attaque DDOS via la méthode F5 susmentionnée ou utiliser des commandes telles que ab, hping3, etc.

Attention:Faites attention car la règle iptables, utilisée dans WSAS, supprimera toutes les nouvellesconnexions de la source $IP, y compris vos connexions SSH. Il est bon de disposer d’un moyen de sauvegarde pour se connecter au serveur pendant les tests. Vous pouvez modifier cette règle pour ne travailler qu'avec les ports HTTP/HTTPS.


ModSecurity 2.9 pour Apache2

ModSecurity est un moteur de pare-feu pour applications Web offrant très peu de protection. Pour devenir utile, ModSecurity doit être configuré avec des règles. Afin de permettre aux utilisateurs de tirer pleinement parti de ModSecurity, Spider Labs de Trustwave fournit un ensemble de règles certifiées gratuites ... En lire plus ... =

Installation

  • Installez et activez le module:

    Sudo apt install libapache2-mod-security2
    Sudo a2enmod security2
    
  • Créer un fichier de configuration:

    Sudo cp /etc/modsecurity/modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf

    Lisez et éditez le /etc/modsecurity/modsecurity.conf avec soin! Ajoutez ou modifiez au moins les directives suivantes:

    # -- Rule engine initialization ----------------------------------------------
    SecRuleEngine On
    
    # -- Debug log configuration -------------------------------------------------
    SecDebugLogLevel 2
    SecDebugLog "/var/log/Apache2_mod_security/modsec_debug.log"
    
    # -- Audit log configuration -------------------------------------------------
    SecAuditLog "/var/log/Apache2_mod_security/modsec_audit.log"
    
    # -- Guardian log configuration -------------------------------------------------
    SecGuardianLog /var/log/Apache2_mod_security/modsec_guardian.log
    
  • Le fichier /etc/Apache2/mods-enabled/security2.conf implique /etc/modsecurity/modsecurity.conf dans la configuration d'Apache. À ce stade, security2.conf doit ressembler à ceci:

    <IfModule security2_module>
        SecDataDir /var/cache/modsecurity
        IncludeOptional /etc/modsecurity/*.conf
    </IfModule>
    
  • Créer un répertoire de journaux:

    Sudo mkdir -p /var/log/Apache2_mod_security
    
  • Rotation du journal d'installation. Créez d'abord le fichier de configuration:

    Sudo cp /etc/logrotate.d/Apache2 /etc/logrotate.d/Apache2-modsec
    

    Puis éditez le nouveau fichier de cette manière:

    /var/log/Apache2_mod_security/*.log { … }
    
  • Redémarrez Apache.

Vérification

  • Créez un fichier de configuration supplémentaire dans /etc/modsecurity, appelez-le par exemple z-customrules.conf et ajoutez la règle suivante comme contenu:

    # Directory traversal attacks
    SecRule REQUEST_URI "../" "t:urlDecodeUni, deny, log, id:109"
    

    Redémarrez le serveur: Sudo systemctl restart Apache2.service. Ouvrez votre navigateur et tapez https://example.com/?abc=../. Le résultat sera: 403 Interdit . Consultez les fichiers journaux dans /var/log/Apache2_mod_security pour plus de détails.

  • Pour rendre les choses plus amusantes , placez le script issues.php dans un emplacement approprié dans votre DocumentRoot (ici, je suppose que cet endroit est /var/www/html):

    Sudo wget https://raw.githubusercontent.com/pa4080/www-security-assistant/ask_ubuntu/appendix/var/www/html/issues.php -O /var/www/html/issues.php
    

    Puis modifiez la règle ci-dessus de la manière suivante:

    # Directory traversal attacks with redirection (or use URL instead of URI: redirect:'https://example.com/issues.php')
    SecRule REQUEST_URI "../" "t:urlDecodeUni, deny, log, id:109, redirect:'/issues.php'"
    

    Redémarrez Apache, puis ouvrez votre navigateur et tapez https://example.com/?abc=../ ;-) L'idée est empruntée au script du SE BotLovin.cs .

  • Éditez /etc/modsecurity/z-customrules.conf une fois de plus et commentez (désactivez) la règle - il ne s'agit que d'un exemple de test et elle est couverte par OWASP CRS, décrite dans la section suivante.

  • Voici un autre exemple où nous allons rediriger toutes les requêtes de page wp-admin, à l'exception de celles provenant de certaines adresses IP (notez le chain):

    # Block wp-admin access
    SecRule REQUEST_URI "^/wp-admin" "id:108, log, deny, status:403, t:lowercase, chain, redirect:'/issues.php'"
        SecRule REMOTE_ADDR "!@ipMatch 192.168.1.11,99.77.66.12"
    

    Nous avons ici deux actions perturbatrices: (1) deny, status:403 et (2) redirect:'/issues.php'. En réalité, nous n’avons pas besoin de l’action deny car elle sera annulée par l’action redirect.


Ensemble de règles de base OWASP ModSecurity 3.x

Dans Ubuntu 16.04, vous pouvez installer CSR 2.x: apt install modsecurity-crs. Ici, nous allons installer CSR 3.x , des instructions détaillées sont fournies dans le Manuel d'installation (git est requis).

Installation

  • Cloner le CSR dans le dossier /usr/share/modsecurity-crs.3:

    Sudo git clone https://github.com/SpiderLabs/owasp-modsecurity-crs /usr/share/modsecurity-crs.3
    
  • Mettre à niveau et renouveler automatiquement la base de données GeoIP. (La base de données GeoIP n'est plus incluse dans le CRS. Il est conseillé de la télécharger régulièrement.) Le script util/upgrade.py apporte cette fonctionnalité. Vous pouvez l'utiliser comme suit dans cron - Sudo crontab -e:

    0 2 * * * /usr/share/modsecurity-crs.3/util/upgrade.py --geoip --crs --cron >> /var/log/Apache2_mod_security/owasp-crs-upgrade.log 2>&1
    
  • Créer des fichiers de configuration:

    Sudo cp /usr/share/modsecurity-crs.3/crs-setup.conf{.example,}
    Sudo cp /usr/share/modsecurity-crs.3/rules/REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf{.example,}
    Sudo cp /usr/share/modsecurity-crs.3/rules/RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf{.example,}
    

    Lisez et éditez ces fichiers attentivement! Décommentez au moins la directive SecGeoLookupDB:

    SecGeoLookupDB util/geo-location/GeoIP.dat
    
  • Appliquez la configuration d'Apache. Éditez /etc/Apache2/mods-available/security2.conf de cette manière:

    <IfModule security2_module>
        SecDataDir /var/cache/modsecurity
        IncludeOptional /etc/modsecurity/*.conf
        IncludeOptional /usr/share/modsecurity-crs.3/crs-setup.conf
        IncludeOptional /usr/share/modsecurity-crs.3/rules/*.conf
    </IfModule>
    

    Enregistrez le fichier puis redémarrez Apache.


Règles de sécurité modélisées

La liste blanche des règles ModSecurity peut être créée via les directives ModSec suivantes, qui peuvent être utilisées à l’échelle du système ou dans la configuration de l’hôte virtuel, de manière globale également, pour des répertoires spécifiques ou des correspondances d’emplacement:

SecRuleRemoveById
SecRuleRemoveByMsg
SecRuleRemoveByTag
SecRuleUpdateTargetById
SecRuleUpdateTargetByMsg
SecRuleUpdateTargetByTag
SecRuleUpdateActionById

Désactiver mod_security2 pour PhpMyAdmin. Changez /etc/phpmyadmin/Apache.conf de cette manière:

<Directory /usr/share/phpmyadmin>
    <IfModule security2_module>
        SecRuleEngine Off
    </IfModule>
</Directory>

Désactiver des règles spécifiques pour certains répertoires:

<Directory /var/www/html>
    <IfModule security2_module>
        SecRuleRemoveById 973301
    </IfModule>
</Directory>

Désactiver les règles globalement. Pour cela, nous devons ajouter nos directives quelque part dans les fichiers de configuration d'Apache: /etc/modsecurity/z-customrules.conf est un bon endroit.

  • Désactivez les règles dans l'ensemble de la configuration d'Apache:

    SecRuleRemoveById 973301 950907
    
  • Liste blanche d'une adresse IP afin qu'elle puisse passer par ModSecurity:

    SecRule REMOTE_ADDR "@ipMatch 192.168.110.1" "phase:1,nolog,allow,ctl:ruleEngine=Off,ctl:auditEngine=Off"
    
  • Désactiver les règles dans la correspondance d'annuaire:

    <Directory /var/www/mediawiki/core>
        SecRuleRemoveById 973301 950907
    </Directory>
    
  • Mise à jour de l'action de la règle en fonction de son IDdans l'emplacement correspondant:

    <LocationMatch "/index.php.*">
        SecRuleUpdateActionById 973301 "pass"
        SecRuleUpdateActionById 950907 "pass"
    </LocationMatch>
    

Dans les exemples ci-dessus, nous supposons que 973301 et 950907 sont des ID de règle qui gênent le travail normal de nos applications Web. On peut trouver de telles règles en analysant modsec_audit.log.


Règles ModSecurity ► WSAS ► Iptables

Voici quelques exemples supplémentaires sur la façon de créer des SecRules personnalisées, ainsi que sur la manière dont nous pouvons appeler WSAS (WWW Security Assistant Script).

La configuration initiale

Nous avons besoin d'un script de démarrage supplémentaire - modsecurity-assistant.sh . La raison en est que l'action exec de ModSecurity a une syntaxe trop simple et limitée.

Sudo wget https://raw.githubusercontent.com/pa4080/www-security-assistant/ask_ubuntu/modsecurity-assistant.sh -O /var/www-security-assistant/modsecurity-assistant.sh
Sudo chmod +x /var/www-security-assistant/modsecurity-assistant.sh

Si vous regardez à l'intérieur du script, vous verrez quelques variables exportées par ModSecurity. Ce sont: $REQUEST_URI, $ARGS, $SERVER_NAME, $REMOTE_ADDR, $REMOTE_Host et $UNIQUE_ID. Les autres variables sont expliquées dans le script.

Créer une règle personnalisée et appeler nos scripts à travers elle

Commençons par créer une règle qui exécutera modsecurity-assistant.sh (et appelera www-security-assistant.bash) lorsque l'URI de la demande contient un mot inclus dans notre liste noire. Ouvrez /etc/modsecurity/z-customrules.conf et ajoutez les lignes suivantes en bas:

# REQUEST_URI words blacklist
#
SecRule REQUEST_URI "@pmFromFile /var/www-security-assistant/modsecurity-uri-black.list" \
    "id:150, log, t:lowercase, chain, \
    drop, deny, status:403, redirect:'/issues.php'"
    SecRule REMOTE_ADDR "!@ipMatchFromFile /var/www-security-assistant/modsecurity-ip-white.list" \
        "setenv:REMOTE_Host=%{REMOTE_Host}, \
         setenv:ARGS=%{ARGS}, \
         exec:/var/www-security-assistant/modsecurity-assistant.sh"
  • REQUEST_URI - cette variable contient l'URI complet de la demande en cours. La règle pourrait être plus large: SecRule REQUEST_URI|ARGS|REQUEST_BODY ...

  • @pmFromFile va lire le fichier modsecurity-uri-black.list qui contient une liste de phrases, chaque phrase ou mot spécifique étant placé dans une nouvelle ligne. Vous pouvez collecter des mots et des phrases intéressantes à partir des fichiers journaux. S'il y a une correspondance particulière entre REQUEST_URI et notre liste de modèles, la règle sera appliquée. Le fichier peut être vide, mais vous devez le créer (touch).

  • L'action log créera des entrées de journal dans les fichiers journaux de cette règle avec id:150.

  • Les actions drop, deny (avec status) et redirect appartiennent au groupe perturbateur , elles doivent figurer au début de la règle chain (s'il existe une chaîne). La deuxième action remplacera la première et la troisième remplacera la deuxième. Vous devez donc choisir laquelle vous voulez exécuter et supprimer les autres.

  • L'action chain appellera la prochaine règle de la chaîne. Notez que la deuxième règle n'a pas id.

  • REMOTE_ADDR contient l'adresse IP de la demande.

  • @ipMatchFromFile sera le fichier modsecurity-ip-white.list qui contient une liste blanche d'adresses IP, séparées à de nouvelles lignes. Les entrées CIDR sont également acceptables. Étant donné que l'action perturbatrice est toujours située dans la règle principale de la chaîne, elle sera appliquée, mais lorsque certaines adresses IP se trouvent dans cette liste blanche, l'action exec ne sera pas appliquée. Le fichier peut être vide, mais vous devez le créer (touch).

  • L'action exec appellera notre script externe. Cette action ne perturbe pas et sera exécutée lorsque la règle actuelle renverra la valeur true. Lorsque cette action est appliquée, l'adresse IP distante sera traitée à travers nos scripts.

  • setenv cette action exportera certains variables internes=%{...} en tant qu'envars, les noms exportés peuvent être différents des internes. Certaines variables doivent être exportées manuellement, d’autres automatiquement: il s’agit probablement d’un petit bogue (l’exportation manuelle portant les mêmes noms, par exemple setenv:REQUEST_URI=%{REQUEST_URI}, provoquera une valeur vide de la variable exportée).

Vérification

Supposons que Joomla ne soit pas sur votre serveur, éditez le fichier modsecurity-uri-black.list et ajoutez une ligne avec le contenu /joomla. Puis tapez dans votre navigateur https://exemple.com/joomla. Vous devriez être redirigé et bloqué via Iptables. Effacez les enregistrements Sudo www-security-assistant.bash <your-ip> --DROP-CLEAR 'some note', ajoutez votre adresse IP dans modsecurity-ip-white.list et recommencez l’exercice. Maintenant, vous devriez être redirigé, mais pas bloqué.

Connectez nos scripts avec OWASP Core Rule Set 3.x

Pour ce faire, nous mettrons à jour l'action par défaut des règles de mode d'anomalie(949110 et 959100). A cette fin, éditez le fichier /usr/share/modsecurity-crs.3/rules/RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf et ajoutez les lignes suivantes en bas:

# -- Anomaly Mode - Update actions by ID -----
#

SecRuleUpdateActionById 949110 "t:none, drop, deny, status:403, redirect:'/issues.php', \
     setenv:REMOTE_Host=%{REMOTE_Host}, setenv:ARGS=%{ARGS}, \
     exec:/var/www-security-assistant/modsecurity-assistant.sh"

SecRuleUpdateActionById 959100 "t:none, drop, deny, status:403, redirect:'/issues.php', \
     setenv:REMOTE_Host=%{REMOTE_Host}, setenv:ARGS=%{ARGS}, \
     exec:/var/www-security-assistant/modsecurity-assistant.sh"

# -- Anomaly Mode - Whitelist some URI and IP addresses -----
#

SecRule REQUEST_URI "^/wp-admin/admin-ajax.php*|^/index\.php\?title=.*&action=(submit|raw&ctype=text/javascript|raw&ctype=text/css)$" \
    "id:'999010', t:none, phase:1, pass, \
     ctl:ruleRemoveById=949110, \
     ctl:ruleRemoveById=959100"

SecRule REMOTE_ADDR "@ipMatchFromFile /var/www-security-assistant/modsecurity-ip-white.list" \
    "id:'999020', t:none, phase:1, pass, \
     ctl:ruleRemoveById=949110, \
     ctl:ruleRemoveById=959100"

Vérification

N'oubliez pas de redémarrer (ou de recharger) Apache pour appliquer les modifications de configuration. N'oubliez pas d'effacer les enregistrements périodiquement pendant les tests, sinon vous pouvez être bloqué de manière permanente :-)

Simuler une attaque de traversée de répertoire:

https://example.com/?abc=../../../                         # This should be redirected and blocked
https://example.com/wp-admin/admin-ajax.php?abc=../../../  # This should pass because of the whitelist rule

Simuler une attaque par injection SQL:

https://example.com/?username=1'%20or%20'1'%20=%20'1&password=1'%20or%20'1'%20=%20'1
https://example.com/index.php?username=1'%20or%20'1'%20=%20'1'))/*&password=foo


Fichiers journaux ModSecurity et Apache

Le serveur Web Apache peut être configuré pour donner à l'administrateur du serveur des informations importantes sur son fonctionnement ... L'affichage de fichiers journaux constitue le principal moyen de fournir des informations à l'administrateur. En lire plus ...

ModSecuritypossède un mécanisme de journalisation puissant. Par la directive SecGuardianLog , il fournit un journal de bord spécialement conçu pour fonctionner avec des scripts externes.

Actuellement, le seul outil connu pour travailler avec la consignation du gardien est httpd-guardian, qui fait partie du projet Apache httpd tools . L'outil httpd-guardian est conçu pour se défendre contre les attaques par déni de service. Il utilise le blacklist tool pour interagir avec un pare-feu ... basé sur iptables, en créant une liste noire dynamique des adresses IP incriminées. En lire plus ...


Fichiers journaux ModSecurity ► Fail2Ban ► Iptables

Il est possible de configurer Fail2Ban pour l'analyse des données des fichiers journaux d'Apache. modsec_audit.log est probablement le meilleur choix, mais voir aussi les sections où nous parlons de SecGuardianLog.

Faites attention que SecAuditLogRelevantStatus dans /etc/modsecurity/modsecurity.conf est commenté. Sinon, chaque personne recevant une page d'erreur 404 serait bloquée par fail2ban.

SecAuditEngine RelevantOnly
#SecAuditLogRelevantStatus "^(?:5|4(?!04))"

Actuellement, Fail2Ban n'est implémenté d'aucune manière dans ce projet.


ModSecGuardianLog ► HTTPD-Guardian ► WSAS ► Iptables

httpd-guardian - Détectez les attaques par déni de service en surveillant les requêtes. Apache Security, Copyright © 2005 Ivan Ristic - est conçu pour surveiller toutes les requêtes du serveur Web par le biais du mécanisme de journalisation canalisé. Il garde la trace du nombre de requêtes envoyées depuis chaque adresse IP ... httpd-guardian peut soit émettre un avertissement, soit exécuter un script pour bloquer l'adresse IP ...

Ce script peut être utilisé avec mécanisme de journalisation Apache2 , ou avec ModSecurity (meilleur).

Installation et configuration dans les circonstances actuelles

Téléchargez httpd-guardian et rendez-le exécutable:

Sudo wget https://raw.githubusercontent.com/pa4080/www-security-assistant/ask_ubuntu/httpd-guardian.pl -O /var/www-security-assistant/httpd-guardian.pl
Sudo chmod +x /var/www-security-assistant/httpd-guardian.pl

Lisez les lignes 98-119 pour voir comment le script est connecté à notre script WSAS.

Appliquez la modification suivante dans la configuration d'Apache (/etc/modsecurity/modsecurity.conf), puis redémarrez-la:

#SecGuardianLog /var/log/Apache2_mod_security/modsec_guardian.log
SecGuardianLog "|/var/www-security-assistant/httpd-guardian.pl"

Vérification

Pour tester le script, désactivez ModEvasive (Sudo a2dismod evasive n'oubliez pas de l'activer ultérieurement) et redémarrez Apache. Puis tail le journal exec:

tail -F /var/www-security-assistant/www-security-assistant.execlog

Et à partir d’une autre instance, effectuez une attaque DoS, par exemple, utilisez ab de cette manière:

for i in {1..20}; do (ab -n 200 -c 10 https://example.com/ &); done


ModSecGuardianLog ► Analyse personnalisée ► WSAS ► Iptables

Voici un script simple, appelé httpd-custom-analyze.bash , ce n'est pas quelque chose de spécial, mais pourrait être un bel exemple. Ses caractéristiques sont décrites dans le corps du script.

Installation et configuration

Téléchargez httpd-custom-analyze.bash et rendez-le exécutable:

Sudo wget https://raw.githubusercontent.com/pa4080/www-security-assistant/ask_ubuntu/httpd-custom-analyze.bash -O /var/www-security-assistant/httpd-custom-analyze.bash
Sudo chmod +x /var/www-security-assistant/httpd-custom-analyze.bash

Appliquez la modification suivante dans la configuration d'Apache (/etc/modsecurity/modsecurity.conf) et redémarrez-la:

#SecGuardianLog /var/log/Apache2_mod_security/modsec_guardian.log
#SecGuardianLog "|/var/www-security-assistant/httpd-guardian.pl"
SecGuardianLog "|/var/www-security-assistant/httpd-custom-analyze.bash"
  • Le script appelle WSAS lorsque le seuil est atteint - lisez la ligne 86 et 35.

  • Pour que les deux scripts httpd- fonctionnent simultanément, éditez modsecurity.conf et dirigez SecGuardianLog vers les deux.

  • Pour effectuer un test, suivez les conseils de la section ci-dessus.

18
pa4080

Je me rends compte que pa4080 a donné une réponse détaillée et probablement très utile pour s’occuper de tout cela seul. Bien que vous puissiez vous sentir à l'aise en réglant vos problèmes vous-même, cela peut également prendre beaucoup de temps .

  1. Familiarisez-vous avec Cloudflare car ils fournissent une protection gratuite contre les attaques DDoS.
  2. Si vous utilisez actuellement uniquement Apache, envisagez le fonctionnement de NGINX pour équilibrer votre charge. NGINX est idéal pour l'équilibrage de charge Apache présenté ici et ici .
  3. Review Astuces de sécurité d'Apache sur leurs documents .
1
Asphyxia