Vous êtes ici : Accueil / Debian GNU/Linux / Serveurs / Apache 2 / Installer ModSecurity pour Apache 2 sur Debian

Installer ModSecurity pour Apache 2 sur Debian

Par Pierre-Yves Landuré Dernière modification 02/03/2018 18:04

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:

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