![]() |
|
Sauf indication contraire les pages d'un serveur Web sont accessibles depuis tout l'Internet. Il est cependant tout à fait possible de restreindre l'accès à une page ou à un ensemble de pages, d'un serveur. Ces restrictions peuvent être gérées selon différents critères :
La description des méthodes que nous allons faire s'applique à un démon HTTPD de type NCSA installé sur une machine Unix.
Avant toute chose, il est indispensable que le serveur que vous utilisez permette ce type de mécanisme.
Cette permission est en général précisée dans l'un de ses fichiers de configuration.
Pour un serveur apache, ce qui est le plus courant, les fichiers de configuration sont: access.conf, srm.conf, httpd.conf ou encore httpd.conf.default.
Ils définissent entre autres le nom du fichier qui sera reconnu comme étant un fichier de restriction d'accès. Par défaut, c'est .htaccess grâce à la directive : .
AccessFileName .htaccess
|
De plus, ils précisent si il est possible de redéfinir localement les droits d'accès à des fichiers, ce qui est le but de cette page. Pour cela, la directive AlloOverride doit être mise correctement, faute de quoi la présence d'un fichier .htaccess sera inopérante.
Par défaut, pour un serveur Apache, vous trouverez la directive :
AllowOverride None
|
Pour changer, vous devrez mettre (ou vérifier auprès de votre prestataire de services que c'est le cas):
AllowOverride AuthConfig
|
AllowOverride All
|
Le système d'authentification est déclenché lorsque le serveur détecte dans le répertoire contenant le document à transmettre la présence d'un fichier dont la lecture lui indiquera quel est le type de protection en service dans ce répertoire.
Le nom spécifique de ce fichier est en réalité totalement défini dans l'un des fichiers de configuration du serveur lui-même. Comme précisé plus haut, dans la plupart des environnements ce fichier se nommera .htaccess .
Ce système d'authentification est très souple puisqu'il va permettre de gérer différents répertoires ou fichiers selon des critères d'accès différents.
Dans cette méthode on va autoriser ou interdire l'accès à un groupe d'utilisateurs appartenant à un même domaine. Dans les exemples suivants on offrira d'abord l'accès aux pages HTML exclusivement aux utilisateurs venant du domaine .ch et du domaine .enst.fr puis on interdira l'accès uniquement aux utilisateurs de la machine ulysse.enst.fr.
Ici, seule la présence d'un fichier .htaccess est nécessaire. Son contenu sera bien sûr différent du cas de l'authentification par nom et mot de passe.
Deux possibilités sont offertes :
* On refuse tous les accès sauf ceux qui sont précisés
AuthUserFile /dev/null |
* On accepte tous les accès sauf ceux qui sont précisés
|
Pour ce faire, la première étape va constituer en la création de la base de données qui est un fichier de nom .htpasswd et qui va contenir les caractéristiques des personnes autorisées à accéder aux documents.
Dans un serveur de type NCSA un utilitaire est fourni pour créer et gérer cette base de données. Il s'agit du programme htpasswd accessible directement sous Unix.
Remarque : de manière générale, le fichier .htpasswd peut se trouver n'importe où sur le site, c'est à dire dans l'arborescence qui commence à public_html sur la plupart des sites http. Bien évidemment, ce "n'importe où" exclut le répertoire que vous voulez protéger, faute de quoi, le serveur ne pourra pas aller le lire (puisqu'il est protégé en lecture!).Il est cependant conseillé de créer d'abord un répertoire (basedenoms par exemple) qui contiendra la base de données et on donne les droits de traversée du répertoire pour tout le monde. Notez donc que ce répertoire peut se situer n'importe où dans l'arborescence du site.
% mkdir basedenoms |
Après s'y être déplacé (cd basedenoms), on crée ensuite simultanément (option -c) la base de données .htpasswd et le premier utilisateur avec son mot de passe
% htpasswd -c .htpasswd david |
Remarquez que dans cet exemple le fichier .htpasswd se trouvera donc précisément dans le répertoire basedenoms.
Remarque : sous windows, la commande htpasswd n'est pas livrée en standard avec le système.
Vous pouvez vous la procurer ici et la placer à un endroit adéquat (par exemple dans le répertoire où sont toutes les commandes du système).
À défaut, vous pouvez aller sur le site http://home.golden.net/generator/ pour créer au coup par coup le cryptage des mots de passe afin de constituer le fichier dans la structure adéquate que vous pouvez voir plus bas.
On peut ensuite ajouter d'autres utilisateurs (cette fois-ci sans l'option de création -c)
|
Pour contrôle, vous pouvez visualiser le contenu de la base (sa structure login:motdepasse est très simple) :
% cat .htpasswd |
Si vous désirez retirer un utilisateur, il suffit d'éditer le fichier .htpasswd et de supprimer la ligne correspondant à cet utilisateur.
Remarque : La création et la mise à jour du fichier .htpasswd peuvent également être effectués par des scripts
ou des programmes CGI, la seule difficulté résidant dans le codage du mot de passe
pour qu'il puisse être reconnu par le serveur.
Pour cela, les langages de script ou d'écriture de programmes CGI offrent
en général une fonction qui permettra de le faire.
Par exemple, dans un script php,
vous pouvez utiliser la fonction crypt(chaine).
Une fonction analogue existe également en C.
On se positionne ensuite dans le répertoire contenant les fichiers HTML à protéger. (dans notre exemple ces fichiers ne seront pour le moment éventuellement accessibles qu'aux utilisateurs david et stef).
On crée dans ce répertoire le fichier .htaccess qui devra contenir les lignes suivantes :
AuthName message |
Le texte situé derrière le nom AuthName correspond au message que vous désirez voir afficher dans la boîte de dialogue lors de la demande d'authentification.
Pour la ligne AuthUserFile vous devez donner le chemin complet du fichier, incluant le chemin jusqu'à votre répertoire racine (obtenu avec la commande pwd).
La ligne suivante (require) signifie qu'aucune distinction n'est faite parmi les membres de la liste.
Si vous vouliez choisir, parmi les membres de la liste figurant dans .htpasswd, ceux auxquels vous voulez donner les droits d'accès, il faudrait les citer nommément :
AuthName message |
C'est également grâce à la directive require qu'il est aussi possible de gérer des groupes d'utilisateurs. Pour ce faire il suffit par ailleurs de créer un fichier .htgroup (toujours placé en suivant les mêmes règles que pour le fichier .htpasswd). Ce fichier sera structuré comme dans l'exemple suivant qui définit trois groupes (non forcément disjoints) :
admin-grp: dubois etienne laurent |
Chaque répertoire pourra être ensuite ouvert au(x) groupe(s) concerné(s) comme l'indique par exemple le fichier .htaccess de l'exemple suivant autorisant les groupes admin-grp et systm-grp à accéder aux fichier HTML contenus dans le même répertoire :
|
<limit> est un bloc contenant des sous-directives permettant de définir les droits d'accès associés à une ou plusieurs méthodes d'accès (GET, PUT, POST).
La directive require est utilisée dans le cas d'accès par utilisateur et mot de passe et spécifie quels sont les utilisateurs ou groupes ayant accès aux pages du répertoire où se trouve le fichier .htaccess.
Elle peut avoir les formes suivantes :
Remarque : Si vous souhaitez établir une hérarchie de répertoires pour lesquels les droits se restreignent au fur et à mesure que l'on descend dans la hiérarchie, il suffit que les répertoires attenant à chacun des répertoires concernés fasse référence au même fichier des mots de passe (.htppaswd). Dans ce cas, pourvu qu'un utilisateur n'aille que dans les lieux qui lui sont permis, son mot de passe ne lui sera demandé qu'une unique fois !
Partant de là, il devient aisé de lire ce fichier en donnant son adresse http, et donc de connaître le nom (bien souvent .htpasswd) et l'adresse du fichier des mots de passe ...
De plus, il existe un moyen simple avec google (rechercher : "allinurl: .htpasswd") pour lire des fichiers de mots de passe....
Bien entendu, si un indélicat lit ce fichier de mots de passe, il ne lui faudra en général pas beaucoup de temps, avec l'aide d'un programme comme "John the Ripper" par exemple, pour les décrypter et donc accéder aux répertoires protégés....
Il devient alors important d'interdire l'accès en lecture à ce fichier.
La méthode la plus simple consiste à toujours placer les fichier des mots de passe dans un répertoire, comme c'était suggéré précédemment, situé en dehors de l'espace vu par le serveur.
Cependant, si vous n'avez pas accès à cet espace, vous pouvez interdire l'accès au répertoire à toute visite avec un nouveau fichier .htaccess placé dans ce même répertoire.
Un fichier .htaccess réalisant cette interdiction pourra s'écrire comme suit :
AuthGroupFile /dev/null |
Lorsqu'on exécute htpasswd pour générer un mot de passe crypté, fait le résultat retourné contient en deux choses :
Le mécanisme de contrôle d'identité fait que lorsqu'un utilisateur arrive et donne son login et son mot de passe, l'authentification va chercher la chaîne "graine + mot de passe crypté" correspondant au login dans le fichier des mots de passe.
Il crypte avec cette graine le mot de passe non crypté transmis et regarde si le résultat concorde avec ce qu'il a dans le fichier.
Il est possible de combiner accès par mot de passe et accès par sous-domaine.
Dans ce cas, la présence des deux fichiers .htpasswd et .htaccess est nécessaire. Le contenu de ce dernier est bien sûr différent de celui des cas précédents.
Deux possibilités sont offertes :
* On autorise les accès depuis un certain sous-domaine plus des mots de passe ailleurs
AuthUserFile /usr/local/bin/www/httpd_1.3/basedenoms/.htpasswd |
* On autorise les accès depuis un certain sous-domaine en faisant de plus intervenir des mots de passe
AuthUserFile /usr/local/bin/www/httpd_1.3/basedenoms/.htpasswd |
Lorsque l'on protège un répertoire tous les sous-répertoires sont automatiquement protégés.
En dehors de toute spécification particulière, la protection d'accès s'applique à tous les fichiers se trouvant dans le répertoire où il se trouve.
Pour restreindre cette protection à un ou quelques fichiers figurant dans ce répertoire, il est possible de le préciser en encadrant, dans le fichier .htaccess, la protection concernée avec la directive <Files>. Si c'est la seule protection évoquée par le fichier .htaccess, on peut encadrer l'ensemble du fichier, comme dans l'exemple suivant :
<Files fichier.html fichier2.html> |
mkdir /infres/emma/infgl/danzart/basedenoms |
htpasswd /infres/emma/infgl/danzart/basedenoms/.htpasswd -c utilisateur1 |
htpasswd /infres/emma/infgl/danzart/basedenoms/.htpasswd utilisateur2 |
Si les fichiers de password ou .htaccess ne sont pas autorisés en lecture pour tout le monde (o+r), le serveur n'y aura pas accès et votre protection sera inefficace.
Vous pouvez personnaliser le message d'erreur qui apparaîtra à l'utilisateur non autorisé lors d'une tentative d'accès à une page protégée en précisant une page html à afficher dans ce cas. Ceci est également valable pour d'autres messages d'erreur (fichier non trouvé, requête annulée).
Pour cela, nous vous conseillons de créer un répertoire dédié au stockage des pages d'erreur, celui-ci devant évidemment être accessible à tous.
Puis, toujours dans le fichier .htaccess, vous indiquez la directive qui précise le nom et l'emplacement du fichier erreur.
Voici un exemple illustratif d'un fichier .htaccess qui restreint l'accès au site de l'enst et qui déroute les messages d'erreur vers des pages appropriées:
AuthName AccesRestreint |
Remarques :
- les lignes commençant par un dièse sont des commentaires
- les fichiers sont référés sans "public_html" bien que le répertoire erreurs y soit inclus
- les numéros d'erreur doivent être rigoureusement respectés
- le dernier exemple illustre comment donner simplement un message d'erreur, sans passer par un fichier
Une utilisation intéressante de ces fichiers peut être de dérouter les accès non permis vers des pages autorisées, au lieu de la simple indication de cette restriction.
Pour aller vite, voici une marche à suivre :
Voici des liens où vous pouvez tester l'accessibilité de pages :
Annie Danzart - mars 2009 -
Je remercie tous ceux qui, par leurs remarques et leurs conseils, contribuent à l'amélioration continuelle de cette page.