Sécuriser Apache2
Un serveur Web peut être source de graves problèmes de sécurité si vous n'y prenez pas garde...
Keep up to date
Ce n'est pas moi qui le dit, c'est Apache2 lui même. Soyez toujours sûr d'avoir la dernière version d'Apache. Pas pour faire joli, mais pour être sûr que les dernières failles sont corrigées...
Inscrivez-vous à la liste des annonces de sécurités
Votre sources.list doit absolument contenir (à modifier selon votre branche évidemment):
deb http://security.debian.org/ squeeze/updates main
Limiter les informations visibles
Un simple telnet apporte déjà beaucoup d'information sur un serveur: Version d'apache, de l'OS, parfois de PHP et Pearl...
/home/laurent> telnet 10.9.8.3 80
Trying 10.9.8.3...
Connected to 10.9.8.3.
Escape character is '^]'.
GET / HTTP/1.1
host: www.vanille.zehome.org
HTTP/1.1 200 OK
Date: Wed, 24 Aug 2011 06:18:29 GMT
Server: Apache/2.2.16 (Debian) PHP/5.3.3-7+squeeze3 with Suhosin-Patch mod_ssl/2.2.16 OpenSSL/0.9.8o
Last-Modified: Sun, 05 Jun 2011 05:07:27 GMT
ETag: "1c39-b1-4a4eff686a1c0"
Accept-Ranges: bytes
Content-Length: 177
Vary: Accept-Encoding
Content-Type: text/html
<html><body>
It works!
This is the default web page for this server.
The web server software is running but no content has been added, yet.
</body></html>
Connection closed by foreign host.
le fichier security
Limitez donc au maximum les informations fournies par Apache en procédant comme ceci:
nano /etc/apache2/conf.d/security
... ServerTokens Prod ... ServerSignature Off ...
Informations PHP
Dans le fichier /etc/php5/apache2/php.ini, modifiez les options suivantes comme suit:
expose_php off
Prévoyez une page pour les "404"
Tout comme un telnet, une redirection sur une page ou un répertoire non trouvé peut donner des informations à une personne malveillante...
Not Found The requested URL /essai was not found on this server. Apache/2.2.16 (Debian) PHP/5.3.3-7+squeeze3 with Suhosin-Patch mod_ssl/2.2.16 OpenSSL/0.9.8o Server at vanille.zehome.org Port 80
mkdir /var/www/notfound nano /var/www/notfound/notfound.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<link type="text/css" href="/notfound/style.css" rel="stylesheet" />
<title>404 Not Found</title>
<a href="../index.html">Retour à l'accueil</a>
</head>
<body>
Not Found
<img src="/notfound/404notfound.jpg" width="754" height="652" alt="" />
</body>
</html>
Une feuille de style...
nano /var/www/notfound/style.css
body {background-color:#000000;color:white;font-family:Serif;font-size:16px;padding-top:20px;}
a {color:#FF9933;text-decoration:underline;}
a:hover,a:focus {color:#DC143C;}
Copier une image qui correspond au lien dans votre fichier html (ici: /notfound/404notfound.jpg)
Si vous êtes en root, prévoyez un chown:
chown -R www-data:www-data /var/www/notfound
Enfin, modifiez le fichier /etc/apache2/conf.d/localized-error-pages et remplacer ceci:
ErrorDocument 404 /missing.html
Par cela:
ErrorDocument 404 /notfound/notfound.html
Tout interdire par défaut
Il est conseillé de procéder ainsi:
- Tout interdire par défaut;
- Autoriser selon ses besoins.
<Directory /> Order deny,allow Deny from all </Directory>
Ensuite, il ne vous restera qu'à valider l'accès aux répertoires, selon vos besoins...
- Order précise dans quel ordre les directives 'deny' et 'allow' sont évaluées.
- Deny from all interdit l'accès depuis "tout". Avec cette directive, vous n'accédez plus au Serveur Apache.
Vous pourriez par exemple autoriser ici une (des) machine(s) de votre réseau dans laquelle vous avez confiance:
<Directory /> Order deny,allow Deny from all Allow from localhost Allow from sidlol.zehome.org </Directory>
Empêcher le parcours des répertoires
Pour empêcher le parcours du répertoire racine du serveur Apache et de tous ses sous-répertoires, ajoutez l'option -Indexes:
<Directory /> Order Allow,Deny Allow from all Options -Indexes </Directory>
Protéger vos répertoires avec un mot de passe
mkdir /var/www/admin cd /var/www/admin htpasswd -c .htpass admin New password: Re-type new password: Adding password for user admin
mkdir /var/www/test
nano /etc/apache2/sites-available/default
<Directory /var/www/test> AuthType Basic AuthName "autorisation requise" # (La ligne suivante est facultative) AuthBasicProvider file AuthUserFile /var/www/admin/.htpass Require user admin </Directory>
Rendez-vous à: http://votre.domaine.tld/test
Désactiver l'exécution de scripts CGI
Aussi évident que cela puisse paraître, il faut tout de même le rappeler, un fichier CGI malveillant dans un répertoire peut-être redoutable pour la sécurité de votre serveur...
Donc, pensez à désactiver "globalement" la possibilité d’exécuter des scripts CGI sur votre serveur.
Options -ExecCGI
Il est toujours possible dans vos <virtualhosts> de les réactiver, répertoire par répertoire...
Options +ExecCGI
Empêcher Apache de suivre les liens symboliques
Avec l'option FollowSymLinks le serveur est autorisé à suivre les liens symboliques, nécessaire pour l' URL Rewriting. "Options +FollowSymlinks" n'est pas obligatoire pour les "rewriting classiques". Désactivez cette option globalement.
Options -FollowSymLinks
Même remarque que ci-dessus, activez cette option quand nécessaire, uniquement pour les répertoires qui en ont besoin.
htaccess
Apache permet la gestion décentralisée de la configuration via des fichiers spéciaux placés dans l'arborescence du site web. Ces fichiers spéciaux se nomment en général .htaccess, mais tout autre nom peut être spécifié à l'aide de la directive AccessFileName.
Les directives placées dans les fichiers .htaccess s'appliquent au répertoire et sous-répertoires dans lequel vous avez placé le fichier
La syntaxe des fichiers .htaccess est la même que celle des fichiers de configuration principaux. Comme les fichiers .htaccess sont lus à chaque requête, les modifications de ces fichiers prennent effet immédiatement.
Vous ne devriez utiliser les fichiers .htaccess que si vous n'avez pas accès au fichier de configuration du serveur principal.
L'accès aux fichiers .htaccess
Par défaut ces fichiers ne sont pas accessibles, lisibles ou téléchargeables...
Vérifiez que c'est bien le cas:
AccessFileName .htaccess # # The following lines prevent .htaccess and .htpasswd files from being # viewed by Web clients. # <Files ~ "^\.ht"> Order allow,deny Deny from all Satisfy all </Files>
Avec un navigateur:
Forbidden You don't have permission to access /test/.htaccess on this server.
Avec wget:
wget 10.9.8.3/test/.htaccess --2011-08-25 11:01:36-- http://10.9.8.3/test/.htaccess Connexion vers 10.9.8.3:80...connecté. requête HTTP transmise, en attente de la réponse...403 Forbidden 2011-08-25 11:01:36 ERREUR 403: Forbidden.
Interdire l'utilisation des fichiers .htaccess autre que ceux définis par l'administrateur
Vous devriez empêcher les utilisateurs de créer leurs propres fichiers .htaccess qui pourraient supplanter vos propres limitations...
Pour désactiver complètement l'utilisation des fichiers .htaccess:
<Directory /> AllowOverride None </ Directory>
Cela empêchera l'utilisation de fichiers .htaccess dans tous les répertoires en dehors de ceux spécifiquement activée.
Filtrer les adresses IP
N'autorisez pas l'accès de vos répertoire à n'importe qui...
Vous pouvez choisir les adresses IP qui ont accès ou non à vos pages. Vous pouvez empêcher l'accès depuis toute autre ip que la votre à n'importe quel répertoire.
Par exemple : autoriser l'accès seulement depuis votre poste:
Order Deny,Allow Deny from all Allow from 127.0.0.1
ou encore de votre réseau local:
Order Deny,Allow Deny from all Allow from 10.9.8.0/22
ou interdire une IP précise:
Order Allow,Deny Allow from all Deny from 10.9.8.1
etc…
Le principe est le suivant : Allow,Deny : L'IP doit être dans un Allow from et ne pas être dans un Deny From pour être autorisée Deny,Allow : L'IP doit être dans un Deny from et ne pas être dans un Allow From pour être interdite
Limiter les DoS (Denial of Service)
Il est possible de tenter de limiter la portée des attaques de type Denial of Service (Dénis de Service).
Le technique consiste à limiter le nombre de connexions simultanées (MaxClients) et le nombre de connexions persistantes (MaxKeepAliveRequests).
Celles-ci sont utilisées afin d'augmenter les performances du serveur, mais elles ont leur revers...
L’utilisation d’un timeout empêche les connexions sans fin.
Voici un exemple pour un petit serveur (à placer à la fin de votre fichier apache2.conf)
MaxClients 150 KeepAlive On MaxKeepAliveRequests 100 KeepAliveTimeout 10
Il est bien évident que pour un serveur à lourde charge ces valeurs doivent êtres augmentés.
Les "Inclusions Côté Serveur" (Server Side Includes - SSI)
Les SSI permettent d'ajouter du contenu dynamique à des documents HTML préexistants.
SSI (Server Side Includes) est constitué de directives placées dans des pages HTML qui vous permettent d'ajouter du contenu généré dynamiquement à une page HTML préexistante, sans avoir à servir la page entière via un programme CGI, ou toute autre technologie de contenu dynamique.
Comme pour les autres options, désactivez globalement:
Toujours au même endroit, (dans un tag <Directory>) :
Options -Includes
<VirtualHost> et ses Directive
Les balises <VirtualHost> et </VirtualHost> permettent de rassembler un groupe de directives qui ne s'appliqueront qu'à un serveur virtuel en particulier. Chaque serveur virtuel doit correspondre à une adresse IP, un port ou un nom d'hôte spécifique
Exemple
NameVirtualHost 10.9.8.3:80 <VirtualHost 10.9.8.3:80> ServerAdmin webmaster@zehome.org DocumentRoot /var/www/webmail/ ServerName webmail.zehome.org <Directory "/var/www/webmail/"> allow from all Options None </Directory> </VirtualHost> <VirtualHost 10.9.8.3:80> ServerAdmin webmaster@zehome.org DocumentRoot /var/www/cubmail/ ServerName cubmail.zehome.org php_value suhosin.session.encrypt Off <Directory "/var/www/cubmail/"> allow from all Options None </Directory> </VirtualHost>
Pour que ceci fonctionne, vous devez vous assurez que les noms webmail.zehome.org et cubmail.zehome.org sont des alias (CNAME) pointant vers l'adresse IP 10.9.8.3
Sécuriser Apache avec Fail2ban
Il existe un module de fail2ban prévu pour repérer les échecs d'authentification au serveur Web.
Apache2 et mod_security
mod_security s'adresse à des utilisateurs avancés, ne vous lancez pas dans son installation si vous ne maîtrisez pas parfaitement le fonctionnement de Apache2...
ModSecurity est un firewall pour les applications web (WAF) pour Apache. Il permet de se prémunir contre un certain nombre d’attaques (connues/inconnues, injections SQL, failles XSS…) et permet de surveiller le traffic HTTP en temps réel.
Nous vous donnerons ici les instructions pour une installation basique. Les règles et options sont très nombreuses, notre propos n'est pas de vous expliquer leur fonctionnement, pour cela il faudra vous rendre sur les différents liens en annexe.
Installation:
apt-get update apt-get dist-upgrade apt-get install libapache-mod-security
Activation du module (l'installation à déjà du le faire, vérifiez quand même)...
a2enmod mod-security service apache2 restart
Vérifiez que les modules nécessaires soient chargés:
# apachectl -M Loaded Modules: ... security2_module (shared) ... unique_id_module (shared) Syntax OK
Pour une sombre raison, les règles présentes dans le paquet Debian fonctionnent mal...
Nous allons donc récupérer les règles directement ici:
http://updates.atomicorp.com/channels/rules/delayed/
Nous créons les dossiers et fichiers nécessaires:
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
Nous leurs donnons les droits nécessaires:
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/*
Et nous créons notre fichier de configuration:
nano /etc/apache2/conf.d/modsecurity.conf
Include /etc/apache2/modsecurity-rules/*asl*.conf
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
Nous récupérons les règles:
wget http://www.atomicorp.com/channels/rules/delayed/modsec-2.5-free-latest.tar.gz
Décompressions:
tar zxvf modsec-2.5-free-latest.tar.gz
Copie:
cp modsec/* /etc/apache2/modsecurity-rules/
Enfin redemarrez Apache2
service apache2 restart
Vérifiez si le module est bien lancé
root@vanille:~/# cat /var/log/apache2/error.log | grep ModSecurity [Fri Aug 26 12:10:09 2011] [notice] ModSecurity for Apache/2.5.12 (http://www.modsecurity.org/) configured.
Désactivation partielle
Par "virtualhosts"
Evidemment vous pouvez désactiver le module pour tous les Virtualhosts que vous souhaitez... Attention à ce que votre virtualhost soit bien défini (par d'IP ou d’astérisque...)
<VirtualHost webmail.zehome.org:80> ServerAdmin webmaster@zehome.org DocumentRoot /var/www/webmail/ ServerName webmail.zehome.org <Directory "/var/www/webmail/"> <IfModule mod_security2.c> SecRuleEngine Off </IfModule> allow from all Options None </Directory> </VirtualHost>
Par règles
Il suffit de regarder dans vos logs la/les règle(s) qui bloque(nt), repérer son id ([id "xxxxxx"])...
/var/log/apache2/modsec_audit.log
Ensuite, ajoutez ceci à votre configuration Apache:
<LocationMatch "/webmail/"> SecRuleRemoveById 960010 960032 960034 960904 981137 981139 981217 981218 981207 981208 9812O9 981210 981211 981212 960011 960015 960017 960021 970904 970017 </LocationMatch>
Test
wget -O - -U "webtrends security analyzer" http://vanille.zehome.org
--2011-08-26 16:57:00-- http://vanille.zehome.org/ Résolution de vanille.zehome.org (vanille.zehome.org)... 10.9.8.3 Connexion vers vanille.zehome.org (vanille.zehome.org)|10.9.8.3|:80...connecté. requête HTTP transmise, en attente de la réponse...403 Forbidden 2011-08-26 16:57:00 ERREUR 403: Forbidden.
Cette URL:
http://vanille.zehome.org/index.php?SELECT%20*%20FROM%20mysql.users
Forbidden You don't have permission to access /index.php on this server.
Avec curl:
apt-get install curl -y
$ curl -i http://localhost/ -A Nessus
HTTP/1.1 403 Forbidden
Date: Fri, 26 Aug 2011 14:02:40 GMT
Server: Apache
Vary: Accept-Encoding
Content-Length: 202
Content-Type: text/html; charset=iso-8859-1
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
Forbidden
You don't have permission to access /
on this server.
</body></html>
Vous devez obtenir à chaque fois "FORBIDDEN"
Sources
- (en) site officiel de modsecurity
- (en) La documentation sur votre Serveur...
- (en) Documentation officielle de modsecurity
- (fr) Installation et configuration de Mod_security
- (fr) Serveur dédié : sécuriser Apache 2 avec ModSecurity
- (en) Protecting Apache with mod_security
- (en) Installation and configuration of mod_security
- (en) Secure Your Apache With mod_security
Sources
- (fr) Conseils sur la sécurité
- (fr) mod_security et mod_dosevasive
- (fr)+(en) Apache 2.2 "la bible"
- (fr) Sécurisation d'un serveur Apache
Lol 27 août 2011 à 01:04 (CDT)