Serveur Apache HTTP Version 2.4
Contrôle d'accès
Le contrôle d'accès fait référence à tout concept de contrôle d'accès à une ressource quelconque. Il est distinct du processus d'authentification et d'autorisation.
Modules et directives concernés
Plusieurs modules peuvent intervenir dans le contrôle d'accès.
Les plus importants sont mod_authz_core
et
mod_authz_host
. Ce document illustre aussi comment
utiliser mod_rewrite
pour le contrôle
d'accès.
Contrôle d'accès en fonction de l'hôte du client
Si vous souhaitez restreindre l'accès à certaines parties de votre
site web en fonction de l'addresse de l'hôte de vos visiteurs, le
plus simple pour y parvenir consiste à utiliser le module
mod_authz_host
.
La directive Require
permet d'accorder ou
d'interdire l'accès à certaines ressources de différentes manières.
Ces critères d'accès, en conjonction avec les directives RequireAll
, RequireAny
, et RequireNone
, peuvent être
combinés d'une manière suffisamment complexe pour
satisfaire votre politique de contrôle d'accès.
Les directives Allow
, Deny
, et Order
fournies par le module
mod_access_compat
sont obsolètes, et sont appelées à
disparaître dans les versions futures. Il est donc déconseillé de
les utiliser, et de se fier aux tutoriels qui recommandent leur
utilisation.
Les directives Require s'utilisent comme suit :
Require host address Require ip ip.address
Dans la première forme, nom-hôte est un nom de domaine pleinement qualifié (fqdn), ou un nom de domaine partiel ; vous pouvez spécifier plusieurs noms de domaines, si vous le désirez.
Dans la seconde forme, adresse-ip est une adresse IP complète, une adresse IP partielle, une paire réseau/masque de sous-réseau ou une spécification CIDR de la forme réseau/nnn. Il est possible de spécifier des adresses IPv4 ou IPv6.
Voir la documentation de mod_authz_host pour d'autres exemples de cette syntaxe.
Vous pouvez insérer le mot-clé not
pour inverser un
critère particulier. Notez que le mot not
étant la
négation d'une valeur, il ne peut pas être utilisé pour autoriser
ou interdire une requête, car non vrai ne
sera pas interpreté par httpd comme faux. Ainsi, pour interdire la
visite d'une page à l'aide d'une négation, le bloc doit contenir un
élément évalué à vrai ou faux.
Par exemple, si quelqu'un est en train d'inonder
votre forum de messages indésirables, vous pouvez ajouter cette ligne pour lui refuser
l'accès :
<RequireAll> Require all granted Require not ip 10.252.46.165 </RequireAll>
Les visiteurs possédant cette adresse (10.252.46.165
) ne pourront pas voir le
contenu concerné par cette directive. Si vous voulez interdire
l'accès à une machine en fonction de son nom, vous pouvez ajouter
ceci :
Require not host host.example.com
Et si vous voulez interdire l'accès à un domaine particulier, vous pouvez spécifier des adresses IP partielles ou des noms de domaine, comme ceci :
Require not ip 192.168.205 Require not host phishers.example.com moreidiots.example Require not host gov
Les directives RequireAll
, RequireAny
, et RequireNone
permettent également de préciser des
critères d'accès plus complexes.
Contrôle d'accès en fonction de variables arbitraires
Vous pouvez accorder ou refuser l'accès en fonction de variables
d'environnement arbitraires ou de valeurs d'en-têtes de la requête
en utilisant la directive <If>
. Par exemple, pour interdire l'accès en
fonction du user-agent (le type de navigateur), vous pouvez
spécifier ceci :
<If "%{HTTP_USER_AGENT} == 'BadBot'"> Require all denied </If>
La syntaxe expr
de la directive Require
permet de réécrire
l'exemple précédent de la manière suivante :
Require expr %{HTTP_USER_AGENT} != 'BadBot'
Avertissement :
Contrôler l'accès en fonction de l'en-tête
User-Agent
n'est pas une technique fiable, car cet
en-tête peut être défini à une valeur quelconque, selon le bon
vouloir de l'utilisateur.
Voir le document à propos des expressions pour une description plus approfondie des syntaxes d'expressions et des variables disponibles.
Utilisation de mod_rewrite pour le contrôle d'accès
Le drapeau [F]
de la directive RewriteRule
permet d'envoyer une
réponse de type 403 Forbidden. Il vous permet donc d'interdire
l'accès à une ressource en fonction d'un critère arbitraire.
Par exemple, pour bloquer l'accès à une ressources entre 20h et
7h du matin, vous pouvez utiliser mod_rewrite
:
RewriteEngine On RewriteCond "%{TIME_HOUR}" ">=20" [OR] RewriteCond "%{TIME_HOUR}" "<07" RewriteRule "^/fridge" "-" [F]
Toute requête arrivant après 20h ou avant 7h du matin provoquera l'envoi d'une réponse de type 403 Forbidden. Vous pouvez utiliser cette technique pour vérifier toutes sortes de critères. En outre, si vous le préférez, vous pouvez rediriger ou réécrire la requête.
Notez que la directive <If>
, introduite à partir de la version 2.4,
permet de remplacer le module mod_rewrite
dans de
nombreuses situations où il était traditionnellement utilisé, et
il sera probablement préférable pour vous de tenter de l'utiliser
avant de vous tourner vers mod_rewrite.
Informations complémentaires
Le moteur d'expressions vous fournit une grande puissance d'action en fonction de variables du serveur arbitraires, et il vous est conseillé de consulter le document correspondant pour plus de détails.
De même, vous devez lire la documentation du module
mod_authz_core
pour des exemples de combinaison de
critères d'accès multiples, et en particulier la manière dont ces
derniers interagissent.
Voir aussi le How-To Authentification and autorisation.