Sécuriser Apache2

De wiki.debian-fr.xyz
Aller à : navigation, rechercher

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
    

    404.jpeg

    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

    Mot de passe apache.jpeg

    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 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.

    Explication Ici

    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.

    Modsecurity.gif

    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 répertoires 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-rules
    mkdir /etc/asl/
    touch /etc/asl/whitelist
    touch /var/log/apache2/modsec_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/modsec_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 IP ou 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

    Sources


    Lol 27 août 2011 à 01:04 (CDT)