Outils personnels

Apache mod security, mod evasive : limitation du traffic, protection anti-DDOS : Différence entre versions

De wikiGite

(Paramètres)
(mod_security)
 
(21 révisions intermédiaires par le même utilisateur non affichées)
Ligne 1 : Ligne 1 :
Mod_evasive est un module Apache pour contrer les attaques DOS. Celui-ci est par exemple capable de détecter lorsqu'un utilisateur demande un trop grand nombre de pages sur un site web, sur un délai de temps très court. Voici comment l'installer et le configurer pour une utilisation basique.
+
'''Mod_security''' est un "web application firewall" (WAF) et un IDS/IPS pour les applications web. Il surveille le traffic HTTP en temps réel et protège les applications web des attaques "brute force". Il peut utiliser les règles Open Web Application Security Project (OWASP) Core Rules Set (CRS), mais celles-ci sont vraiment strictes. Il filtre et modifie la réponse renvoyé par le serveur web (exemple, erreur 404 ou 500).
  
 +
'''Mod_evasive''' est un module Apache pour contrer les attaques DoS (Denial of Service). Il est par exemple capable de détecter lorsqu'un utilisateur demande un trop grand nombre de pages sur un site web, sur un délai de temps très court, et de bloquer son IP par iptables, par exemple (et par défaut, d'ailleurs :) ).
  
 
= Installation =
 
= Installation =
 
Sur CentOS/BlueOnyx :
 
Sur CentOS/BlueOnyx :
 
Déclarer le dépôt EPEL ([[Dépôts_complémentaires]]), puis
 
Déclarer le dépôt EPEL ([[Dépôts_complémentaires]]), puis
  yum install --enablerepo=epel mod_evasive
+
  yum install --enablerepo=epel mod_evasive mod_security
 +
''Note : mod_security_crs mod_security_crs-extras (règles CRS) sont beaucoup trop restrictifs et occasionnent trop de faux-positifs.''
  
Sur Debian :
+
= Configuration basique =
  sudo apt-get install libapache2-mod-evasive
+
 
 +
== mod_security ==
 +
La configuration mod_security se trouve dans /etc/httpd/conf.d/mod_security.conf, et éventuellement dans modsecurity.d/*.conf et modsecurity.d/activated_rules/*.conf pour des règles additionnelles.
 +
 
 +
Ici on va juste le configurer pour intercepter les fichiers uploadés et les envoyer à [http://wiki.kogite.fr/index.php/LMD_:_Linux_Malware_Detect Linux Malware Detect (maldet)] qui les scannera.
 +
 
 +
Modifier /etc/httpd/conf.d/mod_security.conf :
 +
 
 +
1. S'assurer que le module est activé
 +
'''SecRuleEngine On'''
 +
SecRequestBodyAccess On
 +
  SecResponseBodyAccess Off
 +
2. Mettre en place la surveillance des uploads par HTTP :
 +
# Handling of file uploads
 +
# TODO Choose a folder private to Apache.
 +
'''SecUploadDir /var/lib/mod_security/'''
 +
SecUploadKeepFiles On
 +
SecUploadFileLimit 10
 +
Et on ajoute en-dessous :
 +
SecRule FILES_TMPNAMES "@inspectFile '''/usr/local/maldetect/modsec.sh'''" \
 +
        "log,auditlog,deny,severity:2,phase:2,t:none,msg:'Malicous File Attachment Identified.'"
 +
# Maximum request body size we will accept for buffering
 +
3. Augmenter la mémoire allouée à mod_security :
 +
SecRequestBodyLimit 1124288
 +
# Store up to 1MB in memory
 +
SecRequestBodyInMemoryLimit 1124288
 +
# Buffer response bodies of up to
 +
SecResponseBodyLimit 1124288
 +
 
 +
Et commenter :
 +
# Did we see anything that might be a boundary?
 +
#SecRule MULTIPART_UNMATCHED_BOUNDARY "!@eq 0" \
 +
#"phase:2,t:none,log,deny,msg:'Multipart parser detected a possible unmatched boundary.'"
 +
car la plupart des sites la déclenche inopinément !
  
= Configuration basique =
 
  
Toute la configuration de Mod_evasive se trouve dans le fichier /etc/httpd/conf.d/mod_evasive.conf (ou /etc/apache2/conf.d/mod-evasive pour une distribution à base de debian). Exemple de configuration :
+
Si un site pose vraiment problème (exemple : MediaWiki n'aime pas '''du tout''' mod_security, et c'est réciproque), ajouter dans la configuration du vhost (sur blueonyx, dans siteXX.include):
 +
<IfModule mod_security2.c>
 +
  SecRuleEngine Off
 +
</IfModule>
 +
 
 +
== mod_evasive ==
 +
La configuration de Mod_evasive se trouve dans le fichier /etc/httpd/conf.d/mod_evasive.conf. Exemple de configuration :
 
  <IfModule mod_evasive20.c>
 
  <IfModule mod_evasive20.c>
 
   DOSHashTableSize 3097
 
   DOSHashTableSize 3097
Ligne 18 : Ligne 58 :
 
   DOSPageCount 2
 
   DOSPageCount 2
 
   DOSPageInterval 1
 
   DOSPageInterval 1
   DOSSiteCount 150
+
   '''DOSSiteCount 150'''
 
   DOSSiteInterval 1
 
   DOSSiteInterval 1
 
   # Periode en seconde pendant laquelle on bloque le client
 
   # Periode en seconde pendant laquelle on bloque le client
   DOSBlockingPeriod 600
+
   '''DOSBlockingPeriod 600'''
   # Dossier contenant les IP blaclistes
+
   # Et par exemple :
  DOSLogDir "/var/lock/mod_evasive"
 
 
   DOSWhitelist 66.249.65.*
 
   DOSWhitelist 66.249.65.*
 
   DOSWhitelist 66.249.66.*
 
   DOSWhitelist 66.249.66.*
 
   DOSWhitelist 66.249.71.*
 
   DOSWhitelist 66.249.71.*
 
  </IfModule>
 
  </IfModule>
On met ensuite en place le dossier qui va stocker les adresses IP blacklistées :
+
 
mkdir -p /var/lock/mod_evasive
+
On relance le serveur Apache pour prendre en compte les modifications :
chown -R apache:apache /var/lock/mod_evasive
 
Et on relance le serveur Apache pour prendre en compte les modifications :
 
 
  /etc/init.d/httpd restart
 
  /etc/init.d/httpd restart
Ou pour Debian :
 
/etc/init.d/apache2 restart
 
  
 
= TIPS =
 
= TIPS =
 
== Tests ==
 
== Tests ==
Pour tester le module, on peut mettre des valeurs assez faibles et regarder ce qui se passe. Normalement, toutes les images des sites visités ne s'afficheront pas et le dossier /var/lock/mod_evasive devrait se remplir.
+
Pour tester le module, on peut mettre des valeurs assez faibles et regarder ce qui se passe. Normalement, toutes les images des sites visités ne s'afficheront pas et le dossier /tmp devrait se remplir d'IP blacklistées.
  
 
== Paramètres ==
 
== Paramètres ==
* DOSHashTableSize : Taille de la table hash, plus grande est la valeur, plus de mémoire sera necessaire pour parcourir la table, plus la valeur sera petite, plus le parcourt de la table sera rapide. Laissez la valeur par défaut.
+
*DOSHashTableSize : Taille de la table hash, plus grande est la valeur, plus de mémoire sera necessaire pour parcourir la table, plus la valeur sera petite, plus le parcourt de la table sera rapide. Laissez la valeur par défaut.
 
*DOSPageCount Nombre de requête pour une même page dans l'intervale DOSPageInvernal, au delà, l'IP est bloquée.
 
*DOSPageCount Nombre de requête pour une même page dans l'intervale DOSPageInvernal, au delà, l'IP est bloquée.
 
*DOSSiteCount Pareil qu'au dessus mais pour un site au lieu d'une page.
 
*DOSSiteCount Pareil qu'au dessus mais pour un site au lieu d'une page.
Ligne 51 : Ligne 86 :
 
(exemple : DOSSystemCommand "sudo iptables -A INPUT -s %s -j DROP")
 
(exemple : DOSSystemCommand "sudo iptables -A INPUT -s %s -j DROP")
  
== Ménage ==
+
<!-- test -->
Pour finir, on peut mettre en place la crontab suivante pour puger le dossier de blacklist de temps en temps :
 
# Menage mod_evasive
 
00 5 * * * find /var/lock/mod_evasive -mtime +1 -type f -exec rm -f '{}' \;
 

Version actuelle datée du 29 août 2013 à 09:13

Mod_security est un "web application firewall" (WAF) et un IDS/IPS pour les applications web. Il surveille le traffic HTTP en temps réel et protège les applications web des attaques "brute force". Il peut utiliser les règles Open Web Application Security Project (OWASP) Core Rules Set (CRS), mais celles-ci sont vraiment strictes. Il filtre et modifie la réponse renvoyé par le serveur web (exemple, erreur 404 ou 500).

Mod_evasive est un module Apache pour contrer les attaques DoS (Denial of Service). Il est par exemple capable de détecter lorsqu'un utilisateur demande un trop grand nombre de pages sur un site web, sur un délai de temps très court, et de bloquer son IP par iptables, par exemple (et par défaut, d'ailleurs :) ).

Installation

Sur CentOS/BlueOnyx : Déclarer le dépôt EPEL (Dépôts_complémentaires), puis

yum install --enablerepo=epel mod_evasive mod_security

Note : mod_security_crs mod_security_crs-extras (règles CRS) sont beaucoup trop restrictifs et occasionnent trop de faux-positifs.

Configuration basique

mod_security

La configuration mod_security se trouve dans /etc/httpd/conf.d/mod_security.conf, et éventuellement dans modsecurity.d/*.conf et modsecurity.d/activated_rules/*.conf pour des règles additionnelles.

Ici on va juste le configurer pour intercepter les fichiers uploadés et les envoyer à Linux Malware Detect (maldet) qui les scannera.

Modifier /etc/httpd/conf.d/mod_security.conf :

1. S'assurer que le module est activé

SecRuleEngine On
SecRequestBodyAccess On
SecResponseBodyAccess Off

2. Mettre en place la surveillance des uploads par HTTP :

# Handling of file uploads
# TODO Choose a folder private to Apache.
SecUploadDir /var/lib/mod_security/
SecUploadKeepFiles On
SecUploadFileLimit 10

Et on ajoute en-dessous :

SecRule FILES_TMPNAMES "@inspectFile /usr/local/maldetect/modsec.sh" \
        "log,auditlog,deny,severity:2,phase:2,t:none,msg:'Malicous File Attachment Identified.'"
# Maximum request body size we will accept for buffering

3. Augmenter la mémoire allouée à mod_security :

SecRequestBodyLimit 1124288 
# Store up to 1MB in memory
SecRequestBodyInMemoryLimit 1124288
# Buffer response bodies of up to
SecResponseBodyLimit 1124288 

Et commenter :

# Did we see anything that might be a boundary?
#SecRule MULTIPART_UNMATCHED_BOUNDARY "!@eq 0" \
#"phase:2,t:none,log,deny,msg:'Multipart parser detected a possible unmatched boundary.'"

car la plupart des sites la déclenche inopinément !


Si un site pose vraiment problème (exemple : MediaWiki n'aime pas du tout mod_security, et c'est réciproque), ajouter dans la configuration du vhost (sur blueonyx, dans siteXX.include):

<IfModule mod_security2.c>
  SecRuleEngine Off
</IfModule>

mod_evasive

La configuration de Mod_evasive se trouve dans le fichier /etc/httpd/conf.d/mod_evasive.conf. Exemple de configuration :

<IfModule mod_evasive20.c>
  DOSHashTableSize 3097
  # Pas plus de 2 pages par seconde, 150 requêtes (images, css, ...) par site
  DOSPageCount 2
  DOSPageInterval 1
  DOSSiteCount 150
  DOSSiteInterval 1
  # Periode en seconde pendant laquelle on bloque le client
  DOSBlockingPeriod 600
  # Et par exemple :
  DOSWhitelist 66.249.65.*
  DOSWhitelist 66.249.66.*
  DOSWhitelist 66.249.71.*
</IfModule>

On relance le serveur Apache pour prendre en compte les modifications :

/etc/init.d/httpd restart

TIPS

Tests

Pour tester le module, on peut mettre des valeurs assez faibles et regarder ce qui se passe. Normalement, toutes les images des sites visités ne s'afficheront pas et le dossier /tmp devrait se remplir d'IP blacklistées.

Paramètres

  • DOSHashTableSize : Taille de la table hash, plus grande est la valeur, plus de mémoire sera necessaire pour parcourir la table, plus la valeur sera petite, plus le parcourt de la table sera rapide. Laissez la valeur par défaut.
  • DOSPageCount Nombre de requête pour une même page dans l'intervale DOSPageInvernal, au delà, l'IP est bloquée.
  • DOSSiteCount Pareil qu'au dessus mais pour un site au lieu d'une page.
  • DOSPageInterval Intervalle du nombre de pages en secondes.
  • DOSSiteInterval Intervalle du nombre de sites par secondes.
  • DOSBlockingPeriod Période en seconde pendant laquelle l'IP sera bloquée (vous recevrez un forbidden).
  • DOSWhitelist Permet de mettre des IP en liste blanche, dans notre exemple ci-dessus, ce sont des IP du bot Google.
  • DOSSystemCommand Permet d'exécuter une commande, ici on peut lancer un script iptables

(exemple : DOSSystemCommand "sudo iptables -A INPUT -s %s -j DROP")