Etape 1 : Installation du mod proxy

  • http://www.it-connect.fr/mise-en-place-dun-reverse-proxy-apache-avec-mod_proxy/

Etape 2 : Installation du mod_security

  • http://www.it-connect.fr/installation-de-mod_security-devant-un-serveur-web-apache/

Etape 3 : installation du mod_evasive

  • http://wiki.kogite.fr/index.php/Apache_mod_security,_mod_evasive_:_limitation_du_traffic,_protection_anti-DDOS

Fichier de config de vhost:

<VirtualHost *:80>

### Configuration de base ###

 ServerName XXXXX.domain.fr

 #SSL#
 SSLEngine on
 SSLProxyEngine On
 SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
 SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key

 #Proxy#
 ProxyPreserveHost On
 ProxyRequests Off
 ProxyPass / https://xxxxxxxxxxx.cnrs.fr
 ProxyPassreverse / https://xxxxxxxxx.fr ErrorLog

### Désactivation d'une IP ###

 #<Proxy *>
 #   order allow,deny
 #   Deny from XXX.XXX.XXX.XXX
 #</Proxy>

### Désactivation du mod_security si besoin ###

#Désactivation totale

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

#Désactivation partielle

 #<LocationMatch "/wp-admin">
 # <IfModule mod_security2.c>
 # SecRuleEngine Off
 # </IfModule>
 #</LocationMatch>

#Désactivation d'une règle

 #SecRuleRemoveById 960017
 
### Gestion des logs ###

 #ErrorLog ${APACHE_LOG_DIR}/gestion-equipe-error.log
 #LogLevel warn
 #CustomLog ${APACHE_LOG_DIR}/gestion-equipe-access.log combined

</Virtualhost>

Désactiver une règle

Et on scrute les fichiers de logs pour détecter les éventuels problèmes :

tail -f /var/log/httpd/modsecurity-audit.log
tail -f /var/log/httpd/error_log

Pour ma part, j’ai remarqué que dans les logs le message suivant revenait souvent :

Request Missing a Host Header
Request Missing an Accept Header
Request Missing a User Agent Header
...

Cela arrive quand le client qui se connecte au serveur utilise des headers mal configurés. Ce n’est pas vraiment un problème de sécurité en soit, à moins d’être paranoïaque. J’ai donc désactivé la couche qui vérifie les en-têtes comme ceci :

cd /etc/httpd/modsecurity.d/base_rules/
mv modsecurity_crs_21_protocol_anomalies.conf \
modsecurity_crs_21_protocol_anomalies.conf.disable

J’ai également désactivé les règles qui détectent les mauvais robots. Car celles-ci bloquent les requêtes faite sur le site avec wget ou curl, or beaucoup d’articles publiés préconisent d’utiliser ces commandes :

mv modsecurity_crs_35_bad_robots.conf \
modsecurity_crs_35_bad_robots.conf.disable

Test de sécurité

Je déconseille fortement la mise en place de Mod_security sur un serveur en production, ne serait-ce parce que ce genre de firewall applicatif génère des faux-positifs. Voici quelques exemples de tests que l’on peut réaliser. Les actions suivantes doivent par exemple être bloquées :

  • saisir « OR 1=1 » dans un champ de recherche
  • ajouter « <script>xss</script> » à la fin d’une url du site
  • ajouter « /../../etc/passwd » à la fin d’une url du site

 

Installation de Mod_security

Pour installer Mod_security sur une distribution à base de RPM (Red Hat, centOS, Fedora…), ouvrez un terminal et lancez la commande suivante en root :

yum install mod_security

Ou celle-ci pour une distribution à base de Debian :

sudo apt-get install libapache2-mod-security2

Exemple mod_evasive

<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>