
Un serveur Web peut être source de graves problèmes de sécurité si vous n’y prenez pas garde…
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
Masquer les détails du serveur web
Pour des raisons de sécurité, il est nécessaire de masquer la version d’Apache (afin que l’éventuel pirate ne puisse pas identifier la version et donc d’exploiter les failles associées).
Fichier de configuration Apache : /etc/apache2/apache2.conf
Ainsi, dans le fichier de configuration Apache, il faut modifier les valeurs:
ServerTokens Prod ServerSignature Off
Nous pouvons masquer aussi la version de PHP utilisée modifiant le fichier php.ini
Fichier de configuration PHP : /etc/php/X.Y/apache2/php.ini
expose_php = Off
Dans le VirtualHost, on peut ajouter ceci afin de masquer la version de PHP utilisée :
Header unset X-Powered-By
Renforcer la sécurité dans les VirtualHosts
De manière générale, on peut ajouter dans les VirtualHosts ces directives :
# Bloquer le détournement de clic (clickjacking) Header always set X-Frame-Options DENY # Bloquer le changement des types MIME Header always set X-Content-Type-Options nosniff
Renforcer la sécurité en HTTPS
Côté SSL/TLS, afin de renforcer la note « SSL Labs » ( https://www.ssllabs.com/ssltest/ ) on peut modifier ou ajouter ces directives :
# Désactiver les protocoles non sûrs SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1 # Forcer les algorithmes forts et sûrs SSLCipherSuite HIGH:3DES:!aNULL:!MD5:!SEED:!IDEA # Forcer l'ordre de ces algorithmes SSLHonorCipherOrder on # utiliser HSTS Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains"
Se protéger contre les attaques DoS
On peut réduire le TimeOut d’apache à 60 secondes au lieu de 300 secondes (à adapter suivant si le site peut avoir des requêtes longues) :
Timeout 60
Mais aussi réduire le nombre de processus apache à lancer par le serveur :
ServerLimit 64
Utiliser le module mod_security
ModSecurity est un module d’Apache spécialisé dans la sécurité. Il permet donc de sécuriser la couche applicative avant l’arrivée des requêtes sur le site hébergé sur l’Apache en question. Même s’il s’agit d’un module, ses fonctionnalités sont vastes et permettent de toucher à tous les points de sécurité nécessaire.
Installation sous Debian
apt install libapache-mod-security
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:password Re-type new password: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.fr/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és.
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 vôtre à 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).
La 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.
Limiter les Ddos et dénis de services avec mod-evasive
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 Directives
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
