Installer ModSecurity pour Apache 2 sur Debian
ModSecurity est un module Apache protégeant le serveur des vecteurs d'attaques connus. Il est recommandé de le mettre en place pour limiter les risques d'intrusion sur le serveur. Ce guide facilite sa mise en place sur Debian.
Ce guide est testé sur:
- Debian 7.0 Wheezy
Avertissement
ModSecurity est une protection très complète mais très sensible. Sa mise en place en environnement de production peut causer de nombreux problème si elle n'est pas faite avec prudence et patience.
Ce guide donne les grandes lignes de la mise en place de cet outil. Contrairement à de nombreux autres guides de ce site, il nécessite votre compréhension et attention pour que le résultat final soit adapté à votre environnement.
Prérequis
Ce guide nécessite:
- un serveur HTTP Apache 2, comme décrit par Installer Apache 2 sur Debian.
Installation
Détectez le proxy de commande (command ou sudo):
cmdProxy='command'
command type -f 'sudo' &>'/dev/null' && cmdProxy='sudo'
Renseignez le chemin des règles actives de mod-security:
activatedRulesPath='/usr/share/modsecurity-crs/activated_rules'
Préparation de l'environnement
Installez les logiciels nécessaire:
${cmdProxy} apt-get install libapache2-modsecurity lua5.2 multitail
Mettez en place le fichier de configuration recommandé:
${cmdProxy} cp '/etc/modsecurity/modsecurity.conf-recommended' '/etc/modsecurity/modsecurity.conf'
Augmentez la limite de correspondances PCRE de ModSecurity:
${cmdProxy} sed -i \
-e 's/^SecPcreMatchLimit .*$/SecPcreMatchLimit 1000/' \
-e 's/^SecPcreMatchLimitRecursion .*$/SecPcreMatchLimitRecursion 1000/' \
'/etc/modsecurity/modsecurity.conf'
Activez le module dans la configuration Apache:
${cmdProxy} a2enmod 'mod-security'
Rechargez la configuration Apache:
${cmdProxy} service apache2 force-reload
Mise en place des règles de sécurité
Créez les fichiers de configuration Apache 2 pour l'activation des règles CRS pour ModSecurity:
command echo '# Dummy. See mod-security-crs.conf' \
| ${cmdProxy} tee '/etc/apache2/mods-available/mod-security-crs.load'
command echo "# Security rules loading for mod-security.
<IfModule security2_module>
Include /usr/share/modsecurity-crs/*.conf
Include ${activatedRulesPath}/*.conf
</IfModule>" \
| ${cmdProxy} tee '/etc/apache2/mods-available/mod-security-crs.conf'
Activez les règles CRS pour ModSecurity:
${cmdProxy} a2enmod 'mod-security-crs'
Créez un fichier de configuration destiné à contenir les désactivations globales de règles:
echo "<IfModule security2_module>
</IfModule>" | ${cmdProxy} tee '/etc/apache2/conf.d/mod-security-rules-disabled.conf'
Sur Debian Wheezy, remplacez les règles buggées du fichier modsecurity_crs_41_sql_injection_attacks.conf par une version corrigée:
${cmdProxy} wget 'https://raw.github.com/biapy/howto.biapy.com/master/apache2/modsecurity_crs_41_sql_injection_attacks_950901b.conf' \
--no-check-certificate --output-document='/usr/share/modsecurity-crs/base_rules/modsecurity_crs_41_sql_injection_attacks_950901b.conf'
Activez les règles de base:
${cmdProxy} find '/usr/share/modsecurity-crs/base_rules' -type f \( -name '*.conf' -o -name '*.data' \) \
-exec bash -c "command ln -s \"\${1}\" '${activatedRulesPath}/'" _ '{}' \;
Mettez en place les règles optionnelles:
${cmdProxy} find '/usr/share/modsecurity-crs/optional_rules' -type f \( -name '*.conf' -o -name '*.data' \) \
-exec bash -c "command ln -s \"\${1}\" '${activatedRulesPath}/'" _ '{}' \;
Vérifiez que la configuration Apache 2 ne contient pas d'erreur:
${cmdProxy} apache2ctl -t
Rechargez la configuration Apache 2:
${cmdProxy} service apache2 force-reload
Désactivation des règles les plus sensibles
Désactivez les règles de détection des crawlers Google, Yahoo et Bing:
${cmdProxy} rm "${activatedRulesPath}/modsecurity_crs_55_marketing.conf"
Désactivez la règle 981059 détectant les changements d'adresse IP des sessions. Elle peut causer problème aux périphériques mobiles utilisant une connexion 3G:
${cmdProxy} sed -i \
-e '/<\/IfModule>/i\
SecRuleRemoveById 981059' \
'/etc/apache2/conf.d/mod-security-rules-disabled.conf'
Vérifiez que la configuration Apache 2 ne contient pas d'erreur:
${cmdProxy} apache2ctl -t
Rechargez la configuration Apache 2:
${cmdProxy} service apache2 force-reload
Analyse et résolution des faux positifs
ModSecurity lève, par nature, beaucoup de faux positifs. Il faut analyser application web par application web les faux positifs détectés et désactiver la règle concernée pour l'application. Les messages d'information de ModSecurity se trouvent dans les journaux d'erreur d'Apache 2. Affichez et suivez en temps réel tous ces journaux (évitez d'utiliser cette commande sur un serveur ayant plus de 10 hôtes virtuels):
${cmdProxy} multitail '/var/log/apache2/'*'error.log'
Une alerte ModSecurity a pour format:
[Mon Mar 03 23:54:33 2014] [error] [client 43.213.160.93] ModSecurity: Warning. Match of "streq %{SESSION.IP_HASH}" against "TX:ip_hash" required. [file "/usr/share/modsecurity-crs/activated_rules/modsecurity_crs_16_session_hijacking.conf"] [line "35"] [id "981059"] [msg "Warning - Sticky SessionID Data Changed - IP Address Mismatch."] [hostname "howto.biapy.com"] [uri "/fr"] [unique_id "UxUIKQoAAAEAAFSkFM0AAAAP"]
Notez l'information [id "981059"]. La règle à l'origine de ce message est la n°981059. Dans la suite de ce guide, cette ID est utilisé pour désactiver sélectivement les règles causant des faux positifs. Apprenez à extraire cette information des messages de détection de ModSecurity.
Désactivation complète de ModSecurity pour une adresse IP
Dans le cadre de l'utilisation d'un outil de monitoring tel que Nagios, il peut être nécessaire de désactiver certaines règles globalement pour l'adresse IP du serveur de monitoring.
Avertissement
Cette manipulation peut causer des failles de sécurité. Utilisez la avec prudence !
Mise en place
Renseignez l'adresse IP autorisée:
allowedIP="10.10.1.1"
Créez le dossier destiné à contenir les règles globales locales:
${cmdProxy} mkdir -p '/etc/modsecurity/modsecurity.local'
Créez la configuration globale autorisant la règle pour l'IP:
echo "SecRule REMOTE_ADDR '^${allowedIP//\./\\.}\$' phase:1,nolog,allow,ctl:ruleEngine=Off" \
| ${cmdProxy} tee "/etc/modsecurity/modsecurity.local/disabled-for-${allowedIP}.conf"
Activez la règle:
${cmdProxy} ln -s "/etc/modsecurity/modsecurity.local/disabled-for-${allowedIP}.conf" "${activatedRulesPath}"
Testez la configuration Apache 2:
${cmdProxy} apache2ctl -t
Si tout est correct, rechargez la configuration Apache 2:
${cmdProxy} service apache2 force-reload
Désactivation de ModSecurity sur un VirtualHost pour une adresse IP
Renseignez le nom du fichier du VirtualHost:
vhostFile='/etc/apache2/sites-available/http-www.videoplusfrance.com'
Renseignez l'adresse IP autorisée:
allowedIP="10.10.1.1"
Insérez la règle de désactivation dans la configuration Apache 2:
${cmdProxy} sed -i -e "/<\/VirtualHost>/i\\
<IfModule security2_module>\\
SecRule REMOTE_ADDR '^${allowedIP//\./\\\\.}\$' phase:1,nolog,allow,ctl:ruleEngine=Off\\
</IfModule>" \
"${vhostFile}"
Testez la configuration Apache 2:
${cmdProxy} apache2ctl -t
Si tout est correct, rechargez la configuration Apache 2:
${cmdProxy} service apache2 force-reload
Désactivation d'une règle pour tous les VirtualHosts
Renseignez l'ID de la règle désactivée:
secRuleId=950901
Désactivez la règle pour tous les VirtualHosts:
command sed -i \
-e "/<\/IfModule>/i\\
SecRuleRemoveById ${secRuleId}" \
'/etc/apache2/conf.d/mod-security-rules-disabled.conf'
Désactivation d'une règle sur un VirtualHost pour une URL
Renseignez le nom du fichier du VirtualHost:
vhostFile='/etc/apache2/sites-available/http-www.videoplusfrance.com'
Renseignez l'ID de la règle désactivée:
secRuleId=950901
Renseignez l'URI pour laquelle désactiver la règle:
bypassURI='/datas'
Insérez la règle de désactivation dans la configuration Apache 2:
${cmdProxy} sed -i -e "/<\/VirtualHost>/i\\
<IfModule security2_module>\\
<LocationMatch '^${bypassURI}'>\\
SecRuleRemoveById ${secRuleId}\\
</LocationMatch>\\
</IfModule>" \
"${vhostFile}"
Testez la configuration Apache 2:
${cmdProxy} apache2ctl -t
Si tout est correct, rechargez la configuration Apache 2:
${cmdProxy} service apache2 force-reload
Activation du blocage des attaques
Avertissement
Avant de bloquer les attaques, assurez-vous d'avoir éliminé les faux positifs. Soyez patient et attentif au contenu de vos journaux d'erreur.
Activation
Par défaut, ModSecurity ne bloque pas les attaques. Il est enregistre dans le journal '/var/log/apache2/modsec_audit.log'. Activez le blocage avec:
${cmdProxy} sed -i -e 's/^SecRuleEngine.*$/SecRuleEngine on/' '/etc/modsecurity/modsecurity.conf'
Remarque: pour désactiver le blocage, utilisez:
# ${cmdProxy} sed -i -e 's/^SecRuleEngine.*$/SecRuleEngine DetectionOnly/' '/etc/modsecurity/modsecurity.conf'
Rechargez la configuration d'Apache 2:
${cmdProxy} service apache2 force-reload
Remerciements
- Merci aux développeurs de ModSecurity (en).
- Merci aux auteurs de ModSecurity (fr) dans la documentation Ubuntu francophone (fr).
- Merci à Rearden888 pour HOWTO: Set up Modsecurity on Debian 7 (en).
- Merci à Tux-planet (fr) pour Installation et configuration de Mod_security (fr).
- Merci à Unix Garden (fr) pour Sécurité avancée du serveur web Apache : mod_security et mod_dosevasive (fr).
- Merci à AskApache (en) pour Mod_Security .htaccess tricks (en).
- Merci à Apyka (fr) pour Corriger les faux positifs de mod_security (fr) et Sécuriser Apache contre les injections SQL, les DDOS et d’autres attaques (fr).
- Merci à YourHowto.net (en) pour Installing mod_security and mod_evasive on Debian (en).
- Merci à ModSecurity Blog (en) pour Handling False Positives and Creating Custom Rules (en).
- Merci à Ben Richard pour How to Whitelist an IP Address Using Mod_Security (en).
- Merci à Pure Hacking (en) pour Increasing ModSecurity Collection Size Limits (en).