Sécuriser Apache 2Sécuriser Apache : faites du ménageIl convient de faire du ménage après l'installation d'Apache, afin de désactiver les éléments inutiles.
Encore une fois, faites tourner le strict minimum, c'est à dire ce dont vous vous servez et désactivez le reste qui peut mettre en péril la sécurité du serveur (surtout si vous oubliez à la longue que telle ou telle chose tourne).
un peu d'obscurentismePar défaut, Apache nous donne la version utilisée, ce qui peut permettre de savoir si telles ou telles vulnérabilités est présente.
Not Found
The requested URL /apache2-default/prout.html was not found on this server.
Apache/2.2.3 (Debian) Server at 192.168.1.10 Port 80
Ajoutez les directives suivantes dans le fichier de conf d'apache (/etc/apache2/apache2.conf) afin de masquer les versions et autres informations :
ServerTokens Prod
ServerSignature Off
nettoyer les sites/vhostsFaites du ménage dans les sites-availables : /etc/apache2/sites-available/default
Notez que la commande suivante permet de désactiver un répertoire virtuel :
a2ensite mon_repertoire_virtuel
Celle-ci de le désactiver :
a2dissite mon_repertoire_virtuel
Supprimer les modules inutilesFaites du ménage dans les modules. Les modules ajoutent des fonctionnalités (et donc des risques de vulnérabilités) au serveur Apache.
Encore une fois, ne faites tourner que les modules que vous utilisez, désactiver tous les autres modules.
La liste des modules et leurs descriptions respectives est disponible, en français, à cette adresse :
http://httpd.apache.org/docs/2.2/mod/Voir aussi cette page :
http://www.formation.ssi.gouv.fr/stages ... dules.htmlPar exemple pour désactiver le module cgi :
- Code: Tout sélectionner
demonux:/etc/apache2/mod-security# a2dismod cgid
Module cgid disabled; run /etc/init.d/apache2 force-reload to fully disable.
Vous devez comme indiqué relancer Apache.
La commande a2enmod permet de réactiver le module.
mod-SecurityCe mods permet de mettre en place du filtrage au niveau des user agents, referer, header etc.
- Code: Tout sélectionner
cd /tmp
apt-get install libxml2
wget http://etc.inittab.org/~agi/debian/libapache-mod-security2/etch/libapache2-mod-security2_2.1.5-1etch1_i386.deb
wget http://etc.inittab.org/~agi/debian/libapache-mod-security2/etch/mod-security2-common_2.1.5-1etch1_all.deb
dpkg -i *deb
ce qui nous donne :
(Lecture de la base de données... 20877 fichiers et répertoires déjà installés.)
Préparation du remplacement de libapache2-mod-security2 2.1.5-1etch1 (en utilisant libapache2-mod-security2_2.1.5-1etch1_i386.deb) ...
Dépaquetage de la mise à jour de libapache2-mod-security2 ...
Préparation du remplacement de mod-security2-common 2.1.5-1etch1 (en utilisant mod-security2-common_2.1.5-1etch1_all.deb) ...
Dépaquetage de la mise à jour de mod-security2-common ...
Paramétrage de mod-security2-common (2.1.5-1etch1) ...
Paramétrage de libapache2-mod-security2 (2.1.5-1etch1) ...
Forcing reload of web server (apache2)... waiting .
Note à l'heure où vous lisez les liens vers les packages ne sont peut-être plus bon.
Donc allez sur
http://etc.inittab.org/~agi/debian/liba ... ity2/etch/ et récupérez les nouveaux noms de fichiers.
Il convient ensuite de configurer mods-security.
Pour cela, nous allons déjà créer le fichier de configuration.
- Code: Tout sélectionner
cd /etc/apache2/
mkdir mod-security
cd mod-security
wget http://www.malekal.com/fichiers/secure_webserver/mods_security.conf
wget http://www.gotroot.com/downloads/ftp/mod_security/2.0/apache2/apache2-gotrootrules-modsec2.0-latest.tar.gz
tar xvfz apache2-gotrootrules-modsec2.0-latest.tar.gz && rm apache2-gotrootrules-modsec2.0-latest.tar.gz
echo Include /etc/apache2/mod-security/mods_security.conf >> /etc/apache2/apache2.conf
/etc/init.d/apache2 reload
Le serveur apache2 est relancé avec les règles mods-security
Il est ensuite possible de mettre en place un script qui va automatiquement mettre à jour ces règles.
Pour cela :
- Code: Tout sélectionner
cd /etc/apache2/mod-security
wget http://www.malekal.com/fichiers/secure_webserver/modsec_update.sh
chmod +x modsec_update.sh
./modsec_update.sh
Si tout va bien, vous devriez obtenir ceci :
demonux:/etc/apache2/mod-security# ./modsec_update.sh
Changing PWD: /etc/apache2/mod-security
Updating blacklist.conf: ok.
Updating rules.conf: ok.
Updating apache2-rules.conf: ok.
Restarting apache: ok.
Il suffit alors de mettre en place
un cron pour que la mise à jour se fasse automatiquement.
On notera que sur un serveur de production et selon le compte du/des site(s), la mise à jour des règles peut bloquer des sites, donc à vous de voir si vous tenez à mettre ces mises à jour de manière automatique.
crontab -e et ajouter la ligne suivante, pour que la mise à jour se lance tous les jours à 00h30 :
- Code: Tout sélectionner
30 00 * * * /etc/apache2/mod-security/modsec_update.sh
Souces :
http://gotroot.com/tiki-index.php?page= ... d_securityhttp://gotroot.com/downloads/ftp/mod_se ... /modsec.shmod-evasivemodule evasive est un module qui permet de se protéger
des attaques DoS..
Ce module analyse le nombre de requêtes par sites/par page et interdit l'accès à la page pour l'IP en question (forbidden), il est aussi possible d'exécuter une commande par exemple l'ajout d'une règle iptables pour blacklister l'IP.
Par expérience, je vous dirais que ce module est inutile car le forbidden n'est pas suffisant pour stopper une attaque DoS. Dans le cas de l'ajout automatique de règles iptables, s'il y a beaucoup d'IP cela peut être plus néfaste que bénéfique.
Enfin, il arrive régulièrement que des IP soient ajoutées sans pour autant que cela ne soit des attaques.
Donc à faire attention, néanmoins, si vous voulez tester etc... voici comment installer ce module :
Pour compiler le module evasive, vous devez utiliser apxs qui se trouve dans le package apache2-prefork-dev sur Debian.
gcc est bien sur necessaire pour compiler.
- Code: Tout sélectionner
demonux:/tmp/mod_evasive# apt-get install apache2-mpm-worker-dev gcc
Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances... Fait
Les paquets supplémentaires suivants seront installés :
comerr-dev libapr1-dev libaprutil1-dev libc6-dev libdb4.4-dev libexpat1-dev libkadm55 libkrb5-dev libldap2-dev libpcre3-dev libpcrecpp0 libpq-dev
libsqlite3-dev libssl-dev linux-kernel-headers openssl uuid-dev zlib1g-dev binutils cpp cpp-4.1 gcc-4.1 libssp0
Paquets suggérés :
doc-base glibc-doc manpages-dev db4.4-doc krb5-doc postgresql-doc-8.1 sqlite3-doc ca-certificates binutils-doc cpp-doc gcc-4.1-locales make manpages-dev autoconf automake1.9 libtool flex bison gdb gcc-doc gcc-4.1-doc libc6-dev-amd64 lib64gcc1
lib64ssp0
Paquets recommandés :
gcc c-compiler
Les NOUVEAUX paquets suivants seront installés :
apache2-prefork-dev comerr-dev libapr1-dev libaprutil1-dev libc6-dev libdb4.4-dev libexpat1-dev libkadm55 libkrb5-dev libldap2-dev libpcre3-dev
libpcrecpp0 libpq-dev libsqlite3-dev libssl-dev linux-kernel-headers openssl uuid-dev zlib1g-dev
0 mis à jour, 19 nouvellement installés, 0 à enlever et 1 non mis à jour.
Il est nécessaire de prendre 11,7Mo dans les archives.
Le site officiel du module est :
http://www.zdziarski.com/projects/mod_evasive/Vous pouvez récupérer les sources dans le cas où le lien ci-dessous n'est plus valide.
- Code: Tout sélectionner
wget http://www.zdziarski.com/projects/mod_evasive/mod_evasive_1.10.1.tar.gz
tar xvfz mod_evasive_1.10.1.tar.gz
apxs2-i -a -c mod_evasive20.c
Si tout va bien, vous devez obtenir ceci :
demonux:/tmp/mod_evasive# apxs2 -i -a -c mod_evasive20.c
/usr/share/apr-1.0/build/libtool --silent --mode=compile --tag=disable-static i486-linux-gnu-gcc -prefer-pic -DLINUX=2 -D_GNU_SOURCE -D_LARGEFILE64_SOURCE -D_REENTRANT -I/usr/include/apr-1.0 -I/usr/include/openssl -I/usr/include/postgresql -I/usr/include/xmltok -pthread -I/usr/include/apache2 -I/usr/include/apr-1.0 -I/usr/include/apr-1.0 -I/usr/include/postgresql -c -o mod_evasive20.lo mod_evasive20.c && touch mod_evasive20.slo
/usr/share/apr-1.0/build/libtool --silent --mode=link --tag=disable-static i486-linux-gnu-gcc -o mod_evasive20.la -rpath /usr/lib/apache2/modules -module -avoid-version mod_evasive20.lo
/usr/share/apache2/build/instdso.sh SH_LIBTOOL='/usr/share/apr-1.0/build/libtool' mod_evasive20.la /usr/lib/apache2/modules
/usr/share/apr-1.0/build/libtool --mode=install cp mod_evasive20.la /usr/lib/apache2/modules/
cp .libs/mod_evasive20.so /usr/lib/apache2/modules/mod_evasive20.so
cp .libs/mod_evasive20.lai /usr/lib/apache2/modules/mod_evasive20.la
PATH="$PATH:/sbin" ldconfig -n /usr/lib/apache2/modules
----------------------------------------------------------------------
Libraries have been installed in:
/usr/lib/apache2/modules
If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
- add LIBDIR to the `LD_LIBRARY_PATH' environment variable
during execution
- add LIBDIR to the `LD_RUN_PATH' environment variable
during linking
- use the `-Wl,--rpath -Wl,LIBDIR' linker flag
- have your system administrator add LIBDIR to `/etc/ld.so.conf'
See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------
chmod 644 /usr/lib/apache2/modules/mod_evasive20.so
apxs:Error: Activation failed for custom /etc/apache2/httpd.conf file..
apxs:Error: At least one `LoadModule' directive already has to exist..
Comme on peut le voir à la fin, le programme n'a pas réussi à activer le module, pas bien grave.
Editez le fichier suivant /etc/apache2/mods-available/mod_evasive.load
- Code: Tout sélectionner
vim /etc/apache2/mods-available/mod_evasive.load
Ajoutez :
- Code: Tout sélectionner
LoadModule evasive20_module /usr/lib/apache2/modules/mod_evasive20.so
créez le dossier suivants :
- Code: Tout sélectionner
mkdir /var/log/apache2/evasive/
chown www-data.www-data -R /var/log/apache2/evasive/
dans le fichier de conf d'Apache (/etc/apache2/apache2.conf), ajoutez ceci :
<IfModule mod_dosevasive20.c>
DOSHashTableSize 3097
DOSPageCount 2
DOSSiteCount 50
DOSPageInterval 1
DOSSiteInterval 1
DOSBlockingPeriod 10
# Destination du log.
DOSLogDir "/var/log/apache2/evasive/"
# Bannissement de l'IP en cas de bloquage.
#DOSSystemCommand "sudo iptables -A INPUT -s %s -j DROP"
# Liste blanche.
#DOSWhiteList 127.0.0.1
#DOSWhitelist 192.168.1.*
DOSWhitelist 66.249.65.*
DOSWhitelist 66.249.66.*
</IfModule>
- 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
Pour activer le module, tapez la commande : a2enmod mod_evasive
relance Apache : /etc/init.d/apache restart
Pour aller plus loin...Protéger vos données avec .htaccess :
http://www.malekal.com/apache.phpEventuellement mettre en place du SSL :
http://www.ac-creteil.fr/reseaux/system ... e-ssl.htmlhttp://www.coagul.org/article.php3?id_article=351http://doc.ubuntu-fr.org/tutoriel/secur ... 2_avec_sslChrooter Apache2 :
http://www.cgisecurity.com/webservers/a ... howto.htmlApache et suEXEC :
http://httpd.apache.org/docs/1.3/suexec.htmlDocumentation apache ubuntu :
http://doc.ubuntu-fr.org/apache2Je vous donne aussi ce script qui peut être interressant pour bloquer des IP sur des requêtes identiques :
http://www.malekal.com/fichiers/secure_ ... /ban_ip.shPar exemple, si l'on prend cette portion de log d'attaque.
- Code: Tout sélectionner
62.163.251.181 - - [27/Feb/2008:09:14:57 +0100] "GET http://www.malekal.com//search/index.php?action=go&blork=743hbvysbtVTRVDRW^%^F^VF^WF^D$%WD$%DWC$#WDF$%WFDW%^T&GYHU*@T^VDT^R HTTP/1.1" 403 219 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; Hotbar 4.3.1.0)"
80.200.13.7 - - [27/Feb/2008:09:14:57 +0100] "GET http://www.malekal.com//search/index.php?action=go&blork=743hbvysbtVTRVDRW^%^F^VF^WF^D$%WD$%DWC$#WDF$%WFDW%^T&GYHU*@T^VDT^R HTTP/1.1" 403 219 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.5) Gecko/20031007"
91.64.5.214 - - [27/Feb/2008:09:14:57 +0100] "GET http://www.malekal.com//search/index.php?action=go&blork=743hbvysbtVTRVDRW^%^F^VF^WF^D$%WD$%DWC$#WDF$%WFDW%^T&GYHU*@T^VDT^R HTTP/1.1" 403 219 "-" "Microsoft-WebDAV-MiniRedir/5.1.2600"
81.241.161.172 - - [27/Feb/2008:09:14:57 +0100] "GET http://www.malekal.com//search/index.php?action=go&blork=743hbvysbtVTRVDRW^%^F^VF^WF^D$%WD$%DWC$#WDF$%WFDW%^T&GYHU*@T^VDT^R HTTP/1.1" 403 219 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.5a) Gecko/20030728 Mozilla Firebird/0.6.1"
77.250.132.166 - - [27/Feb/2008:09:14:57 +0100] "GET http://www.malekal.com//search/index.php?action=go&blork=743hbvysbtVTRVDRW^%^F^VF^WF^D$%WD$%DWC$#WDF$%WFDW%^T&GYHU*@T^VDT^R HTTP/1.1" 403 219 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; Q312461)"
89.3.137.76 - - [27/Feb/2008:09:14:57 +0100] "GET http://www.malekal.com//search/index.php?action=go&blork=743hbvysbtVTRVDRW^%^F^VF^WF^D$%WD$%DWC$#WDF$%WFDW%^T&GYHU*@T^VDT^R HTTP/1.1" 403 219 "-" "Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.5) Gecko/20031021"
On peut voir que c'est la même page avec la même string qui est envoyée (
http://www.malekal.com//search/index.ph ... sbtVTRVDRW^%^F^VF^WF^D$%WD$%DWC$#WDF$%WFDW%^T&GYHU*@T^VDT^R ).
Le script fait un grep sur les logs pour récupérer cette string et récupère les IP des attaquants pour les bloquer.
Encore une fois, cela est suffisant pour certains DoS, plus le nombre d'IP est grand plus difficile l'attaque sera à bloquer.
Enfin dans le cas d'un syn flood, cela ne marche pas.