« Security/Services/Apache » : différence entre les versions

De TartareFR
Aller à la navigation Aller à la recherche
(Annulation des modifications 2702 de Didier (discussion))
 
(10 versions intermédiaires par le même utilisateur non affichées)
Ligne 1 : Ligne 1 :
= Sécuriser son serveur Apache =
<big>'''Sécuriser son serveur Apache'''</big>
{{Admon/logo|TuxCRS.png}}
{{Admon/logo|TuxCRS.png}}
C'est ballot de mettre une serrure aux fenêtres si la porte reste grande ouverte.
C'est ballot de mettre une serrure aux fenêtres si la porte reste grande ouverte.
Ligne 144 : Ligne 144 :
</Files>
</Files>
</syntaxhighlight>
</syntaxhighlight>
=== Désactiver le debug des connexions HTTP : TRACE et TRACK ===
Il faut spécifier la directive suivante. Elle est supportée sur tous les Apaches 2.2 et supérieur.
<syntaxhighlight lang="apache">
TraceEnable Off
</syntaxhighlight>
{{Admon/tip|Apache < 2.0.55 ou 1.3.34|Il faut activer le module rewrite et ajouter les lignes suivantes au fichier <path>/etc/httpd/conf/httpd.conf</path>
<syntaxhighlight lang="apache">
RewriteEngine On
RewriteCond %{REQUEST_METHOD} ^TRACE
RewriteRule .* - [F]
</syntaxhighlight>}}


=== Activer le module mod_security ===
=== Activer le module mod_security ===


mod_security module Apache écrit par Ivan Ristic, l'auteur du livre ''Apache Security'' des éditions O'Reilly.
[[Webserver/Apache/Modules/Security|mod_security]] est un module Apache écrit par Ivan Ristic, l'auteur du livre ''Apache Security'' des éditions O'Reilly.
 
mod_security peut:


[[Webserver/Apache/Modules/Security|mod_security]] peut:
*Filtrage simple
*Filtrage simple
*Filtre basé sur des expressions régulières
*Filtre basé sur des expressions régulières
Ligne 279 : Ligne 293 :
=== Méthode d'authentification ===
=== Méthode d'authentification ===


Il préférable d'utiliser la méthode Digest en lieu et place de la méthode Basic, surtout si le protocole est [[HTTP/Code|http]]. En effet le login et le mot de passe passe en clair sur le réseau avec la méthode Basic.
Il préférable d'utiliser la méthode Digest en lieu et place de la méthode Basic, surtout si le protocole est [[HTTP/Code|'''http''']]. En effet le login et le mot de passe passe en clair sur le réseau avec la méthode Basic.


[[Webserver/Apache/Authentification|Méthodes d'authentification avec Apache]]
[[Webserver/Apache/Authentification|Méthodes d'authentification avec Apache]]

Dernière version du 13 mai 2014 à 07:51

Sécuriser son serveur Apache

TuxCRS.png

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

Désactiver le debug des connexions HTTP : TRACE et TRACK

Il faut spécifier la directive suivante. Elle est supportée sur tous les Apaches 2.2 et supérieur.

TraceEnable Off


Idea.png
Apache < 2.0.55 ou 1.3.34
Il faut activer le module rewrite et ajouter les lignes suivantes au fichier <path>/etc/httpd/conf/httpd.conf</path>
RewriteEngine On 
RewriteCond %{REQUEST_METHOD} ^TRACE 
RewriteRule .* - [F]

Activer le module mod_security

mod_security est un 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...

Désactivation des modules non-utilisés

Apache est fournit avec un nombre conséquent de modules. Après analyse de la documentation de chaque module, il faut déterminer si le module est nécessaire pour l'installation.

On peut désactiver le chargement des modules non-utilisés en commentant la ligne commençant par LoadModule pour le module en question (Ajout d'un # en début de ligne).

Pour lister les modules d'Apache

grep LoadModule httpd.conf

Les modules suivants sont généralement activés par défaut mais ne sont utiles que dans des cas bien précis:

  • mod_imap
  • mod_include
  • mod_info
  • mod_userdir
  • mod_status
  • mod_cgi
  • mod_autoindex
Main module summary
Module's name Description
core The core Apache features, required in every Apache installation.
http_core The core http support, required in every Apache 2.0 installation.
prefork Multi-Processing Module (MPM) that implements a non-threaded, pre-forking web server. Can be replaced by other multiprocessing module, e.g. worker , threadpool etc. The MPM module is required in every Apache 2.0 installation.
mod_access Provides access control based on client hostname, IP address, or other characteristics of the client request. Because this module is needed to use "order", "allow" and "deny" directives, it should remain enabled.
mod_auth Required in order to implement user authentication using text files (HTTP Basic Authentication), which was specified in functionality assumptions.
mod_dir Required to search and serve directory index files: "index.html", "default.htm", etc.
mod_log_config Required to implement logging of the requests made to the server.
mod_mime Required to set the character set, content- encoding, handler, content-language, and MIME types of documents.

S'assurer que seul root puisse accéder à la configuration d'Apache

chown -R root:root /etc/httpd
chmod -R o-rwx /etc/httpd

Baisser la valeur du timeout

Par défaut, le timeout est fixé à 300 secondes. On peut baisser cette valeur afin de limiter les effets des attaques par déni de service.

Timeout 45

Limiter la taille des requêtes

Apache possède quelques directives pour limiter la taille des requêtes, Cela peut aussi être utile pour limiter les attaques par déni de service.

On limite tout d'abord la taille des requêtes avec la directive LimitRequestBody. La valeur par défaut est Illimité. Si la taille maximum des fichiers uploadés est plus petit que 1MB, on peut fixer la valeur à 1048576.

LimitRequestBody 1048576

Cette valeur peut encore être plus faible si l'upload n'est pas autorisé.

Quelques autres directives comme LimitRequestFields, LimitRequestFieldSize et LimitRequestLine sont déjà mise à des valeurs raisonnables pour la plupart des serveurs mais rien n'empêche de faire un ajustage plus fin.

Limiter la taille des requêtes XML

Si le module mod_dav est activé ( pour subversion notamment ), on peut limiter la taille des requêtes XML avec la directive LimitXMLRequestBody. Cette directive est uniquement disponible depuis apache 2 et est fixée par défaut à approximativement 1 million bytes (un peu plus qu'1Mo). Cette valeur est souvent mise à 0 pour ne pas limiter la taille des fichiers uploadés avec WebDAV, mais pour un simple dépôt de fichier source, on peut le fixer à approximativement 10Mo.

LimitXMLRequestBody 10485760

Limiter les accès concurrents

Apache has several configuration settings that can be used to adjust handling of concurrent requests.

La directive MaxClients est le nombre maximum de processus enfant créés pour satisfaire les requêtes. Il ne doit pas être trop élevé si le serveur n'a pas assez de mémoire pour gérer l'accès à de nombreux fichiers simultanément.

Les autres directives telles que MaxSpareServers, MaxRequestsPerChild, ThreadsPerChild, ServerLimit, et MaxSpareThreads doivent être ajustées en fonction du système d'exploitation et des paramètres du serveur physique ( RAM, CPU, etc...).

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.

Méthode d'authentification

Il préférable d'utiliser la méthode Digest en lieu et place de la méthode Basic, surtout si le protocole est http. En effet le login et le mot de passe passe en clair sur le réseau avec la méthode Basic.

Méthodes d'authentification avec Apache

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