Security/Services/Apache

De TartareFR
Aller à la navigation Aller à la recherche

Sécuriser son serveur Apache

C'est ballot de mettre une serrure aux fenêtres si la porte reste grande ouverte.

C'est pourquoi, avant même de penser à sécuriser Apache, quelques sécurités de base doivent préalablement être mise en place:

  • Firewall: C'est le premier rempart de la sécurité
  • Protection basique contre le flood. Cela peut être fait avec une règle firewall du type iptables -A FORWARD -p tcp --syn -m limit --limit 1/second -j ACCEPT
  • Avoir au moins un service de détection d'intrusion: <package>ossec</package>, <package>snort</package> et/ou autres...
  • Vérifier régulièrement la présence de rootkits avec les outils <package>chkrootkit</package>, <package>rkhunter</package>, etc...
  • Surveiller les logs.
  • Mettre son système à jour régulièrement. En effet si les logiciels ne sont pas à jour ou que les patchs de sécurités ne sont pas appliqués, la sécurisation n'aurait pas de sens et ne serait qu'un arbre qui cache la forêt.

Apache

Cacher le numéro de version et autres informations sensibles

Par défaut, Apache rapporte les informations suivantes:

  • numéro de version d'Apache
  • Liste des modules installés
  • Système d'exploitation et numéro de version de celui-ci

Ajout/modification des directives dans le fichier <path>/etc/httpd/conf/httpd.conf</path>

ServerSignature Off
ServerTokens Prod

La clé ServerSignature provoque l'affichage d'informations sensibles dans les pages d'erreur (403, 404 notamment), ainsi que dans les pages auto-générées listant les fichiers du répertoire.

La clé ServerTokens est utilisée pour déterminer si des informations doivent apparaître dans l'en-tête de réponse. Si la valeur de cette clé est Prod, la seule information sera:

Server: Apache
Pour les paranoïaques
Pour qu'Apache rapporte autre chose que apache , il faut soit éditer les sources, soit utilisé le module mod_security

S'assurer qu'apache tourne avec son propre user et group

Beaucoup de serveurs web tourne avec le user nobody ou daemon. Dans le cas où Apache serait compromis, tous les processus utilisant le même user le serait aussi rapidement, et inversement.

User apache
Group apache

S'assurer que les fichiers en dehors du répertoire de travail d'apache ne soient pas servis

Pour cela on bloque la racine du serveur, et on accepte de servir uniquement les fichiers se trouvant le répertoire de travail d'Apache.

<Directory />
  Order Deny,Allow
  Deny from all
  Options None
  AllowOverride None
</Directory>
<Directory /web>
  Order Allow,Deny
  Allow from all
</Directory>
Cas des fichiers qui devraient être normalement servis et se trouvant en dehors du répertoire de travail d'Apache
Il faut explicitement déclarer chaque répertoire parent dans la configuration d'Apache et y définir les droits, comme pour le répertoire de travail.

Exemple: Apache hébergant un wiki.

Les fichiers se trouvent dans <path>/var/www/wiki</path> et dans <path>/usr/share/mediawiki/skins</path>.

La déclaration sera donc

Alias /wiki/skins /usr/share/mediawiki/skins
Alias /wiki /var/www/wiki

<Directory "/var/www/wiki">
    Options Includes FollowSymLinks
    AllowOverride None
    Order Allow,Deny
    Allow from all
</Directory>

<Directory "/usr/share/mediawiki/skins">
    Options Includes
    AllowOverride None
    Order Allow,Deny
    Allow from all
</Directory>

Désactiver l'indexation des répertoires

Il faut spécifier dans les options que l'indexation n'est pas autorisée en mettant -Indexes ou None aux Options dans la balise Directory.

Options -Indexes

Désactiver l'inclusion de fichiers

Il faut spécifier dans les options que l'inclusion n'est pas autorisée en mettant -Includes ou None aux Options dans la balise Directory.

Options -Includes

Désactiver l'exécution des scripts CGI

Il faut spécifier dans les options que l'exécution des scripts CGI n'est pas autorisée en mettant -ExecCGI ou None aux Options dans la balise Directory.

Options -ExecCGI
Nagios
Le service de supervision Nagios a besoin de pouvoir exécuter des scripts CGI. Il faudra donc ajouter la directive +ExecCGI dans la balise du répertoire de nagios.

Désactiver le suivi des liens symboliques

Il faut spécifier dans les options que le suivi des liens symboliques n'est pas autorisée en mettant -FollowSymLinks ou None aux Options dans la balise Directory.

Options -FollowSymLinks

Désactiver plusieurs options

Il faut spécifier dans les options que rien n'est autorisé en mettant None aux Options dans la balise Directory.

Options None

On peut aussi spécifier les options interdites

Options -ExecCGI -FollowSymLinks -Indexes

Désactiver le support des fichiers .htaccess

Il faut spécifier dans la directive AllowOverride que rien n'est autorisé.

AllowOverride None

Pour les répertoires nécessitant un fichier .htaccess, il convient de modifier le nom et de spécifier le nouveau nom à Apache. De plus ces fichiers doivent être interprétés mais ne doivent pas être téléchargés.

AccessFileName .httpdoverride
<Files ~ "^\.ht">
    Order allow,deny
    Deny from all
    Satisfy All
</Files>

Activer le module mod_security

mod_security module Apache écrit par Ivan Ristic, l'auteur du livre Apache Security des éditions O'Reilly.

mod_security peut:

  • Filtrage simple
  • Filtre basé sur des expressions régulières
  • Validation de l'encodage d'URL
  • Validation de l'encodage Unicode
  • Audit
  • Prévention des attaques Null byte
  • Respect d'un quota pour la mémoire
  • Masquage de l'identité du serveur Web
  • Support du chroot
  • Et bien d'autres choses encore...

Disable any unnecessary modules

Apache typically comes with several modules installed. Go through the apache module documentation and learn what each module you have enabled actually does. Many times you will find that you don't need to have the said module enabled.

Look for lines in your httpd.conf that contain LoadModule. To disable the module you can typically just add a # at the beginning of the line. To search for modules run:

grep LoadModule httpd.conf

Here are some modules that are typically enabled but often not needed: mod_imap, mod_include, mod_info, mod_userdir, mod_status, mod_cgi, mod_autoindex. Make sure only root has read access to apache's config and binaries

This can be done assuming your apache installation is located at /usr/local/apache as follows:

chown -R root:root /usr/local/apache
chmod -R o-rwx /usr/local/apache

Lower the Timeout value

By default the Timeout directive is set to 300 seconds. You can decrease help mitigate the potential effects of a denial of service attack.

Timeout 45

Limiting large requests

Apache has several directives that allow you to limit the size of a request, this can also be useful for mitigating the effects of a denial of service attack.

A good place to start is the LimitRequestBody directive. This directive is set to unlimited by default. If you are allowing file uploads of no larger than 1MB, you could set this setting to something like:

LimitRequestBody 1048576

If you're not allowing file uploads you can set it even smaller.

Some other directives to look at are LimitRequestFields, LimitRequestFieldSize and LimitRequestLine. These directives are set to a reasonable defaults for most servers, but you may want to tweak them to best fit your needs. See the documentation for more info.

Limiting the size of an XML Body

If you're running mod_dav (typically used with subversion) then you may want to limit the max size of an XML request body. The LimitXMLRequestBody directive is only available on Apache 2, and its default value is 1 million bytes (approx 1mb). Many tutorials will have you set this value to 0 which means files of any size may be uploaded, which may be necessary if you're using WebDAV to upload large files, but if you're simply using it for source control, you can probably get away with setting an upper bound, such as 10mb:

LimitXMLRequestBody 10485760

Limiting Concurrency

Apache has several configuration settings that can be used to adjust handling of concurrent requests. The MaxClients is the maximum number of child processes that will be created to serve requests. This may be set too high if your server doesn't have enough memory to handle a large number of concurrent requests.

Other directives such as MaxSpareServers, MaxRequestsPerChild, and on Apache2 ThreadsPerChild, ServerLimit, and MaxSpareThreads are important to adjust to match your operating system, and hardware.

Restriction d'accès par adresse IP

Si certaines ressources ne doivent être servies que pour certaines adresses ou plages d'adresses IP, il convient de restreindre l'accès de celle-ci dans la configuration d'Apache. Restriction à la plage d'adresse 192.168.0.0/24.

Order Deny,Allow
Deny from all
Allow from 192.168.0.0/24

Restriction sur une adresse IP.

Order Deny,Allow
Deny from all
Allow from 127.0.0.1

Ajustage des connexions persistantes

D'après la documentation d'Apache, les connexions persistantes augmentent les performances de 50%, donc ces paramètres doivent être modifiés avec précaution.

Les connexions persistantes sont activés par défaut et doivent le rester. Toutefois un ajustage du nombre de connections persistantes, ainsi que du timeout peut être entrepris après une analyse très poussée des journaux d'Apache afin de déterminer les meilleures valeurs. par défaut le nombre de connections persistantes est fixé à 100 et le timeout à 15.

Exécuter Apache dans un environnement Chroot

Un Chroot permet d'exécuter un programme dans une prison isolée. Cela permet de limiter l'intrusion à ce seul service.

Ce n'est pas vraiment facile d'exécuter Apache dans un chroot, notamment à cause des dépendances des librairies. Toutefois le module mod_security le permet très facilement en ajoutant la directive suivante à la configuration d'Apache.

SecChrootDir /chroot/apache

PHP

Cacher le numéro de version

PHP expose son numéro de version ( par défaut ? ). En effet il suffit de lancer la commande suivante pour s'en rendre compte. Bien entendu le fichier index.php doit exister, sinon Apache rapporte une erreur 404.

nc localhost 80 << EOF
HEAD http://localhost/index.php http/1.1
host: localhost

EOF

Apache répond en spécifiant le numéro de version de php

HTTP/1.1 200 OK
Date: Thu, 06 Sep 2012 10:03:22 GMT
Server: Apache
X-Powered-By: PHP/5.4.6
Connection: close
Content-Type: text/html; charset=UTF-8


Ajout de la ligne suivante au fichier <path>/etc/php.ini</path>

expose_php = Off

Après la modification et un restart d'Apache plus tard

nc localhost 80 << EOF
HEAD http://localhost/index.php http/1.1
host: localhost

EOF

Cette fois le numéro de version de php est caché

HTTP/1.1 200 OK
Date: Thu, 06 Sep 2012 10:03:22 GMT
Server: Apache
Connection: close
Content-Type: text/html; charset=UTF-8