Serveur dédié : sécuriser Apache 2 avec ModSecurity
Aujourd’hui, on ajoute une couche de sécurité supplémentaire avec l’installation du module ModSecurity pour Apache.
ModSecurity est un firewall pour les applications web (WAF) pour Apache. Il permet de se prémunir contre pas mal d’attaques (connues/inconnues, injections SQL, failles XSS…) et permet de surveiller le traffic HTTP en temps réel. Très utile pour un serveur dédié sous Apache !
L’installation est très rapide, cela ne prend que quelques minutes et 3 étapes.
Etape 1 : installation de mod_security
On commence par éditer nos sources de dépôts :
nano /etc/apt/sources.list
et on ajoute les backports :
deb http://backports.debian.org/debian-backports squeeze-backports main
On met à jour et on installe mod_security :
aptitude update aptitude install libapache-mod-security
On active le module :
a2enmod mod-security
Et on relance Apache pour prendre en compte nos changements :
/etc/init.d/apache2 restart
Etape 2 : configuration de mod_security
On crée quelques dossiers et fichiers nécessaires pour nos règles :
mkdir /var/asl mkdir /var/asl/tmp mkdir /var/asl/data mkdir /var/asl/data/msa mkdir /var/asl/data/audit mkdir /var/asl/data/suspicious mkdir /etc/apache2/modsecurity.d mkdir /etc/asl/ touch /etc/asl/whitelist touch /var/log/apache2/audit_log
On regarde sous quel utilisateur tourne Apache :
ps auxwww | grep apache
Chez moi, c’est www-data :
root 19268 2.3 9.4 567512 189456 ? Ss 14:45 0:01 /usr/sbin/apache2 -k start www-data 19290 4.5 13.2 611288 265936 ? S 14:45 0:03 /usr/sbin/apache2 -k start www-data 19291 0.5 10.8 581028 217700 ? S 14:45 0:00 /usr/sbin/apache2 -k start www-data 19292 3.9 11.1 582540 224688 ? S 14:45 0:02 /usr/sbin/apache2 -k start www-data 19293 1.2 11.1 583408 224768 ? S 14:45 0:00 /usr/sbin/apache2 -k start www-data 19294 2.2 11.1 582024 223492 ? S 14:45 0:01 /usr/sbin/apache2 -k start www-data 19295 1.0 10.9 581720 221420 ? S 14:45 0:00 /usr/sbin/apache2 -k start www-data 19296 0.0 9.0 567512 183176 ? S 14:45 0:00 /usr/sbin/apache2 -k start
donc, on assigne à l’utilisateur www-data les droits sur les répertoires suivants :
chown www-data.www-data /var/asl/data/msa chown www-data.www-data /var/asl/data/audit chown www-data.www-data /var/asl/data/suspicious chmod o-rx -R /var/asl/data/* chmod ug+rwx -R /var/asl/data/*
On crée un fichier nécessaire pour mod_security :
nano /etc/apache2/conf.d/00_modsecurity.conf
et on y met :
Include /etc/apache2/modsecurity.d/*asl*.conf
Ensuite, on crée le fichier de configuration :
nano /etc/apache2/conf.d/modsecurity_crs_10_config.conf
et on y met :
SecRuleEngine On SecRequestBodyAccess On SecResponseBodyAccess On SecResponseBodyMimeType (null) text/html text/plain text/xml SecResponseBodyLimit 2621440 SecServerSignature Apache SecComponentSignature 200911012341 SecUploadDir /var/asl/data/suspicious SecUploadKeepFiles Off SecAuditEngine RelevantOnly SecAuditLogRelevantStatus "^(?:5|4(?!04))" SecAuditLogType Concurrent SecAuditLog /var/log/apache2/audit_log SecAuditLogParts ABIFHZ SecArgumentSeparator "&" SecCookieFormat 0 SecRequestBodyInMemoryLimit 131072 SecDataDir /var/asl/data/msa SecTmpDir /tmp SecAuditLogStorageDir /var/asl/data/audit SecResponseBodyLimitAction ProcessPartial SecPcreMatchLimit 100000 SecPcreMatchLimitRecursion 100000
Admins, si vous voulez échapper au filtrage de mod_security, ajoutez votre IP dans :
/etc/asl/whitelist
Etape 3 : installation des dernières règles mod_security
On télécharge les dernières règles :
wget http://www.atomicorp.com/channels/rules/delayed/modsec-2.5-free-latest.tar.gz
On décompresse :
tar zxvf modsec-2.5-free-latest.tar.gz
et on les copie dedans :
cp modsec/* /etc/apache2/modsecurity.d/
Il ne nous reste plus qu’à relancer la configuration Apache :
/etc/init.d/apache2 reload
Test de mod_security
Et si on testait tout ça ?
wget http://localhost/index.php?foo=http://fakeattacker.com
Nous retourne une belle ERROR 403 : Forbidden :
http://localhost/index.php?foo=http://fakeattacker.com Resolving localhost... 127.0.0.1 Connecting to localhost|127.0.0.1|:80... connected. HTTP request sent, awaiting response... 403 Forbidden
Parfait ! Un petit tour dans les logs Apache nous le prouve également :
[error] [client xx.xx.xx.xx] ModSecurity: Access denied with code 403 (phase 2). Match of "beginsWith http://%{SERVER_NAME}/" against "MATCHED_VAR" required. [file "/etc/apache2/modsecurity.d/10_asl_rules.conf"] [line "455"] [id "340162"] [rev "193"] [msg "Atomicorp.com - FREE UNSUPPORTED DELAYED FEED - WAF Rules: Remote File Injection attempt in ARGS (AE)"] [data ""] [severity "CRITICAL"] [hostname "www.skyminds.net"] [uri "/index.php"] [unique_id "TYYG64eklt5yZMAAEwBmIoAAAAJ"]A noter que lorsque ModSecurity est désactivé, cette requête nocive provoque une erreur 404 (not found), ce qui veut dire que le serveur essaie la requête. ModSecurity tue la requête directement (erreur 403, forbidden) avant que celle-ci n’atteigne le serveur.
Conclusion
Voilà, votre serveur est un peu plus sécurisé qu’avant. L’étape 3 sera à renouveler de temps en temps, histoire de mettre à jour les règles.
Sommaire de la série Monter un serveur dédié de A à Z
- Serveur dédié : installation d’Apache, PHP, MySQL et Webmin
- Serveur dédié : créer la base de données MySQL et importer WordPress
- Serveur dédié : créer et activer un Virtual Host sous Apache
- Serveur dédié : changer les DNS du nom de domaine et le faire pointer vers le serveur
- Serveur dédié : sécurisation des services avec iptables et fail2ban
- Serveur dédié : sécurisation de la couche TCP/IP
- Serveur dédié : création d’un serveur mail Postfix (sécurisé avec Saslauthd et certificat SSL) et Courier (accès POP et IMAP) utilisant une base MySQL d’utilisateurs/domaines virtuels
- Serveur dédié : sécuriser Apache 2 avec ModSecurity
- Serveur dédié : CHMOD récursif sur des fichiers ou répertoires en ligne de commande
- Serveur dédié : installer APC comme système de cache et configurer Varnish comme reverse-proxy pour Apache pour améliorer les performances
- Serveur dédié : afficher la véritable IP derrière un reverse-proxy comme Varnish
- Serveur dédié : intégrer SSH à WordPress pour mettre à jour le core, les plugins et les thèmes
- Serveur dédié : installer la dernière version d’APC par SVN
- Serveur dédié : analyse des performances du serveur
- Serveur dédié : mettre à jour le noyau Debian de la Kimsufi
- Serveur dédié : sauvegarde automatique des fichiers avec Backup Manager sur le serveur de sauvegarde OVH
- Serveur dédié : configurer la limite mémoire pour PHP et Suhosin