Propositions d'améliorations pour HowtoApache

This commit is contained in:
Jérémy Lecour 2016-10-05 14:20:23 +02:00 committed by Gregory Colpart
parent 385c90e80c
commit 29eb6a1d56

View file

@ -3,16 +3,17 @@ categories: web
title: Howto Apache
...
<https://httpd.apache.org/docs/2.4/>
* Site officiel : <http://httpd.apache.org/>
* Documentation officielle : <https://httpd.apache.org/docs/2.4/>
Apache est le serveur [HTTP](HowtoHTTP) le plus utilisé sur le web depuis 1996.
## Installation
Nous utilisons [Apache-ITK](http://mpm-itk.sesse.net/) depuis des années en production sur de nombreux serveurs critiques. Apache-ITK permet de préciser pour chaque VirtualHost un utilisateur/groupe/*MaxClients* spécifique, ce qui est utile pour la sécurité d'un serveur multi-sites.
Nous utilisons [Apache-ITK](http://mpm-itk.sesse.net/) depuis des années en production sur de nombreux serveurs critiques. Apache-ITK permet de préciser pour chaque VirtualHost un utilisateur/groupe et *MaxClients* spécifiques, ce qui est utile pour la sécurité d'un serveur multi-sites.
~~~
# aptitude install apache2-mpm-itk libapache2-mod-evasive apachetop libwww-perl
# apt install apache2-mpm-itk libapache2-mod-evasive apachetop libwww-perl
~~~
## Configuration de base
@ -73,7 +74,7 @@ umask 007
## VirtualHost
Le terme *VirtualHost* réfère à la pratique de séparer plusieurs sites sur un même serveur HTTP.
Le terme **VirtualHost** correspond à la séparation de plusieurs sites sur un même serveur HTTP.
Apache permet d'avoir des VirtualHost basés sur des noms de domaine différents (ou des adresses IP différentes).
Exemple d'un VirtualHost basé sur un nom de domaine via `/etc/apache2/sites-available/example.conf` :
@ -141,7 +142,8 @@ Il est donc impossible pour un utilisateur d'accéder en lecture à des fichiers
### Restriction en écriture pour Apache
Par défaut on souhaite donner uniquement un droit de lecture à Apache, sauf sur certains répertoires du type *uploads/*, *cache/*, etc. On utilise pour cela un utilisateur distinct pour Apache (www-example) et la gestion du code via FTP/SSH/SFTP/SCP/RSYNC (example), le groupe étant identique. Ainsi on donnera la permission **g+w** pour les répertoires nécessitant un droit en écrite pour Apache. Les fichiers uploadés via Apache auront des permissions adéquats (g+rwX) pour être lus/modifiés/effacés via FTP/SSH/SFTP/SCP/RSYNC (l'opération *chmod* est impossible mais n'est pas nécessaire car le umask d'Apache est forcé à 007).
Par défaut on souhaite donner uniquement un droit de lecture à Apache, sauf sur certains répertoires du type *uploads/*, *cache/*, etc.
On utilise pour cela un utilisateur distinct pour Apache (`www-example`) et la gestion du code via FTP/SSH/SFTP/SCP/RSYNC (example), le groupe étant identique. Ainsi on donnera la permission `g+w` pour les répertoires nécessitant un droit en écrite pour Apache. Les fichiers uploadés via Apache auront des permissions adéquats (`g+rwX`) pour être lus/modifiés/effacés via FTP/SSH/SFTP/SCP/RSYNC (l'opération `chmod` est impossible mais n'est pas nécessaire car le umask d'Apache est forcé à 007).
~~~
# echo "umask 027" >> /etc/profile
@ -188,13 +190,13 @@ La configuration d'un VirtualHost pour HTTPS pourra ainsi ressembler à :
</VirtualHost>
~~~
Pour une configuration avancées des paramètres SSL : <http://trac.evolix.net/infogerance/wiki/HowtoSSL#AvecApache>
Pour une configuration avancée des paramètres SSL : <http://trac.evolix.net/infogerance/wiki/HowtoSSL#AvecApache>
## Configuration avancée
### mod_deflate
La compression des fichiers texte/Javascript/CSS/RSS en GZIP se fait désormais par défault car le module mod_deflate est activé dès l'installation.
La compression des fichiers texte/Javascript/CSS/RSS en GZIP se fait désormais par défault car le module **mod_deflate** est activé dès l'installation.
### mod_proxy_http
@ -220,9 +222,9 @@ TODO
### mod_rpaf / mod_remoteip
En Jessie, on utilisera mod_remoteip
En Jessie, on utilisera **mod_remoteip**
En Wheezy, pour éviter d'avoir l'IP d'un reverse-proxy dans les logs et utiliser les directives mod_access (Allow/Deny From), on installe mod_rpaf
En Wheezy, pour éviter d'avoir l'IP d'un _reverse-proxy_ dans les logs et utiliser les directives **mod_access** (Allow/Deny From), on installe **mod_rpaf**
~~~
# aptitude install libapache2-mod-rpaf
@ -235,21 +237,21 @@ RPAFproxy_ips 127.0.0.1 192.0.2.10
</IfModule>
~~~
Note : Attention, bien modifier la directive IfModule? qui est incorrecte dans le paquet : IfModule? mod_rpaf.c -> IfModule? mod_rpaf-2.0.c
Note : Attention, bien modifier la directive `IfModule?` qui est incorrecte dans le paquet : `IfModule? mod_rpaf.c``IfModule? mod_rpaf-2.0.c`.
Note 2 : bien mettre l'IP du reverse-proxy dans RPAFproxy_ips
Note 2 : bien mettre l'IP du reverse-proxy dans `RPAFproxy_ips`
### mod_xsendfile
Le module xsendfile permet de rediriger l'envoi d'un fichier vers Apache via un Header HTTP, notamment utilisé pour servir des fichiers via Apache tout en permettant de gérer le contrôle d'accès via une application web.
Le module **xsendfile** permet de rediriger l'envoi d'un fichier vers Apache via un Header HTTP, notamment utilisé pour servir des fichiers via Apache tout en permettant de gérer le contrôle d'accès via une application web.
~~~
# aptitude install libapache2-mod-xsendfile
# a2enmod xsendfile
~~~
Pour autoriser son utilisation via .htaccess, on ajoute *Options* à `AllowOverride`.
Pour autoriser son utilisation via .htaccess, on ajoute `Options` à `AllowOverride`.
## mod_spdy (deprecated)
@ -323,11 +325,11 @@ Note : pour utiliser *ldaps* avec un certificat non reconnu par le système, il
<http://httpd.apache.org/docs/2.4/mod/mod_rewrite.html>
Voici quelques motifs classiques de redirection vers un nouveau domaine (HTTP 302) ...du plus simple au plus compliqué :
Voici quelques motifs classiques de redirection vers un nouveau domaine (HTTP 302) du plus simple au plus compliqué :
- RedirectPermanent / http://new.example.com
- RedirectMatch ^/(.*)$ http://new.example.com/$1
- RewriteRule ^/(.*) http://new.example.com/$1 [L,R=permanent]
- `RedirectPermanent / http://new.example.com`
- `RedirectMatch ^/(.*)$ http://new.example.com/$1`
- `RewriteRule ^/(.*) http://new.example.com/$1 [L,R=permanent]`
Pour supprimer un Query String avec une Rewrite Rule : <https://www.philipphoffmann.de/blog/2012/08/16/how-to-discard-the-query-string-in-a-rewriterule-apache-mod_rewrite/>
@ -335,7 +337,7 @@ Pour supprimer un Query String avec une Rewrite Rule : <https://www.philipphoffm
### mod_evasive
Le module *mod_evasive* permet de limiter certaines attaques DoS en limitant l'accès à une ou plusieurs pages par un temps de banissement d'une IP source. Par défaut, nous ajustons la configuration de façon à ce que si une adresse IP accède plus de 5 fois à la même page en 30s, ou à plus de 30 requêtes sur tout le site en 1s, il sera banni (erreur HTTP 403) pendant 60s. Une notification sera alors envoyée à syslog et par email.
Le module **mod_evasive** permet de limiter certaines attaques DoS en limitant l'accès à une ou plusieurs pages par un temps de banissement d'une IP source. Par défaut, nous ajustons la configuration de façon à ce que si une adresse IP accède plus de 5 fois à la même page en 30s, ou à plus de 30 requêtes sur tout le site en 1s, il sera banni (erreur HTTP 403) pendant 60s. Une notification sera alors envoyée à syslog et par email.
~~~{.apache}
<IfModule mod_evasive20.c>
@ -349,7 +351,7 @@ Le module *mod_evasive* permet de limiter certaines attaques DoS en limitant l'a
</IfModule>
~~~
Attention, pour certains sites avec de nombreuses ressources statiques sur le même serveur HTTP, il faut souvent désactiver *mod_evasive* pour éviter des faux-positifs et ne l'utiliser qu'en cas d'attaques récurrentes.
Attention, pour certains sites avec de nombreuses ressources statiques sur le même serveur HTTP, il faut souvent désactiver **mod_evasive** pour éviter des faux-positifs et ne l'utiliser qu'en cas d'attaques récurrentes.
### Fail2Ban
@ -406,7 +408,7 @@ Pour une configuration avancée, on ajuste l'utilisation du jeu de règles *mods
## Awstats
SetEnv AWSTATS_FORCE_CONFIG example
`SetEnv AWSTATS_FORCE_CONFIG example`
## Monitoring
@ -452,9 +454,11 @@ ExtendedStatus On
Fichier `/etc/munin/plugin-conf.d/munin-node` :
[apache_*]
env.url http://127.0.0.1:%d/server-status-XXXX?auto
env.port 80
~~~
[apache_*]
env.url http://127.0.0.1:%d/server-status-XXXX?auto
env.port 80
~~~
En parallèle, on s'assure que les plugins pour Apache sont bien activés. Si non, on fera :
@ -477,15 +481,15 @@ Ceci doit vous renvoyer une valeur du type accesses80.value 19372070. Si la comm
### Autorisation DirectoryIndex via .htaccess ?
Ajouter Indexes dans AllowOverride.
Ajouter `Indexes` dans `AllowOverride`.
### Autorisation directives mod_expires ou mod_caches via .htaccess ?
Ajouter Indexes dans AllowOverride.
Ajouter `Indexes` dans `AllowOverride`.
### Autorisation Options via .htaccess ?
Si l'on modifie l'option php_admin_value memory_limit : un reload/graceful suffit pour prendre en compte la modification.
Si l'on modifie l'option `php_admin_value memory_limit` : un _reload_/_graceful_ suffit pour prendre en compte la modification.
Exemple pour le AllowOverride :
@ -495,7 +499,7 @@ AllowOverride Options=All,MultiViews Indexes AuthConfig Limit FileInfo
### Authentification LDAP avec serveur LDAP en local
Quand on utilise l'authentification LDAP avec un serveur en local, il faut démarrer slapd avant de démarrer Apache, sinon celui-ci se plaint qu'il ne peut pas contacter le serveur LDAP, et bloque l'accès aux pages ... (erreur 500).
Quand on utilise l'authentification LDAP avec un serveur en local, il faut démarrer **slapd** avant de démarrer Apache, sinon celui-ci se plaint qu'il ne peut pas contacter le serveur LDAP, et bloque l'accès aux pages (erreur 500).
Pour cela, dans le script d'init d'apache2 ajouter slapd dans la directive `Required-Start:`