« Security/Services/Apache » : différence entre les versions
(Annulation des modifications 2702 de Didier (discussion)) |
|||
| (27 versions intermédiaires par le même utilisateur non affichées) | |||
| Ligne 1 : | Ligne 1 : | ||
<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 145 : | Ligne 145 : | ||
</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 === | |||
[[Webserver/Apache/Modules/Security|mod_security]] est un module Apache écrit par Ivan Ristic, l'auteur du livre ''Apache Security'' des éditions O'Reilly. | |||
Apache | [[Webserver/Apache/Modules/Security|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 | |||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
grep LoadModule httpd.conf | grep LoadModule httpd.conf | ||
</syntaxhighlight> | </syntaxhighlight> | ||
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 | |||
{| class="wikitable" | |||
|+ 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 === | |||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
chown -R root:root / | chown -R root:root /etc/httpd | ||
chmod -R o-rwx / | chmod -R o-rwx /etc/httpd | ||
</syntaxhighlight> | </syntaxhighlight> | ||
=== | === 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. | |||
<syntaxhighlight lang="apache"> | <syntaxhighlight lang="apache"> | ||
Timeout 45 | Timeout 45 | ||
</syntaxhighlight> | </syntaxhighlight> | ||
=== | === Limiter la taille des requêtes === | ||
Apache | 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. | |||
<syntaxhighlight lang="apache"> | <syntaxhighlight lang="apache"> | ||
LimitRequestBody 1048576 | LimitRequestBody 1048576 | ||
</syntaxhighlight> | </syntaxhighlight> | ||
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. | |||
<syntaxhighlight lang="apache"> | <syntaxhighlight lang="apache"> | ||
LimitXMLRequestBody 10485760 | LimitXMLRequestBody 10485760 | ||
</syntaxhighlight> | </syntaxhighlight> | ||
=== | === Limiter les accès concurrents === | ||
Apache has several configuration settings that can be used to adjust handling | 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. | |||
<syntaxhighlight lang="apache"> | <syntaxhighlight lang="apache"> | ||
Order Deny,Allow | Order Deny,Allow | ||
Deny from all | Deny from all | ||
Allow from | Allow from 192.168.0.0/24 | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Restriction sur une adresse IP. | |||
<syntaxhighlight lang="apache"> | <syntaxhighlight lang="apache"> | ||
Order Deny,Allow | Order Deny,Allow | ||
| Ligne 230 : | Ligne 285 : | ||
</syntaxhighlight> | </syntaxhighlight> | ||
=== | === 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/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]] | |||
=== 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. | |||
<syntaxhighlight lang="apache"> | <syntaxhighlight lang="apache"> | ||
SecChrootDir /chroot/apache | SecChrootDir /chroot/apache | ||
</syntaxhighlight> | </syntaxhighlight> | ||
== PHP == | == PHP == | ||
Dernière version du 13 mai 2014 à 07:51
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
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>
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
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
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
| 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
