Authentification des accès aux pages Web |
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 d'accès peut être réservé à des utilisateurs référencés en possession d'un mot de passe.
NOTE1 : cette notion de username/password est complètement indépendante des comptes unix ouverts au niveau du serveur (/etc/passwd). Il faudra donc gérer une base de données (fichier .htpasswd) spécifique aux accès http pour utiliser cette méthode.
NOTE2 : si le nom de ces fichiers commence par un point, c'est parceque ces fichers sont des fichiers "cachés" sur unix.
La description des méthodes que je vous présente ici est applicable seulement sur les erveurs de type NCSA sur unix (apache...)
Principe de l'authentification |
Le système d'authentification est déclenché lorsque le serveur détecte dans le répertoire contenant le document à transmettre la présence du fichier .htaccess dont la lecture lui indiquera quel est le type de protection en service dans ce répertoire.
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.
Authentification par mot de passe |
première étape : créer la base de donnée qui contient les données concernant les utilisateurs (login/mot de passe). Les serveurs de type NCSA sont fournis avec un utilitaire permettant de créer ce type de fichier. Il est accessible directement à partir de la ligne de commande. Il s'appelle en général tout simplement ".htpasswd".
Note : on peut très bien lui donner le nom qu'on veut, du moment que ce nom soit bien référencé dans les fichiers .htaccess
Pour créer le fichier, on se place dans le répertoire correspondant, puis on créé (option -c) la base de données .htpasswd et le premier utilisateur avec son mot de passe
|
htpasswd -c .htpasswd gorun Adding password for gorun. New password: Re-type new password: |
Remarquez que dans cet exemple le fichier .htpasswd se trouvera donc précisément dans le répertoire où vous etes.
Remarque : sur pc, la commande htpasswd n'est pas livrée en standard avec le système. Il existe un petit programme écrit en C "htpasswd.exe".
Vous devez vous la procurer et la placer à un endroit adéquat (par exemple dans le répertoire où sont toutes les commandes du système).
NOTE : avant il était dans la bibliothèque de script du forum amen.
On peut ensuite ajouter d'autres utilisateurs (cette fois-ci sans l'option de création -c, sinon on écrase le fichier)
|
htpasswd .htpasswd toto Adding user toto New password: Re-type new password: |
NOTE : exécuter une seconde fois cette commande pour un méme utilisateur ne fera que changer son mot de passe.
Pour contrôle, vous pouvez visualiser le contenu de la base :
|
cat .htpasswd gorun:bp3rCaQn8cISw toto:D1.766HO012hA |
NOTE : sur PC, utilisez n'importe quel éditeur de texte : exemple notepad.exe
Vous pouvez constater que ce fichier contient simplement les noms des utilisateurs suivis de leur mot de passe crypté. Il est à remarquer qu'afin de "diminuer" encore plus leur lisibilité au moment du passage sur le réseau, les mots de passe sont uuencodés. Mais il ne s'agit en aucun cas d'un encryptage sécurisé.
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(string string); Une fonction analogue existe également en C.
Deuxième étape :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 gorun et toto).
On crée dans ce répertoire le fichier .htaccess qui devra contenir les lignes suivantes :
|
AuthName message AuthUserFile /var/www/httpd_1.3.19/public_html/.htpasswd AuthGroupFile /dev/null AuthType Basic AuthPAMEnabled off #pour serveurs cobalt seulement <limit GET> require valid-user </Limit> |
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). Pour connaitre ce chemin complet si votre site est hébergé sur un serveur distant, demandez à votre hébergeur, ou executez par exemple les commande suivante dans une page php:
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 AuthUserFile /var/www/httpd_1.3.19/public_html/.htpasswd AuthGroupFile /dev/null AuthPAMEnabled off AuthType Basic <limit GET> require user durand dupont dupond </Limit> |
Dans cet exemple, seuls durand, dupont et dupond pourront passer la barrière !
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 dans un répertoire de son choix). Ce fichier sera structuré comme dans l'exemple suivant qui définit trois groupes (non forcément disjoints) :
administrateurs: dupont toto
utilisateur: gorun
client: dufour
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 administrateurs et utilisateur à accéder aux fichier HTML contenus dans le même répertoire :
|
AuthName message AuthUserFile /var/www/httpd_1.3.19/public_html/.htpasswd AuthGroupFile /var/www/httpd_1.3.19/public_html.htgroup AuthType Basic <limit GET> require group administrateurs require group utilisateur </Limit> |
<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).
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 :
NOTE : 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 !
Authentification par le réseau |
peu utilisé sur un site web distant, mais je vous explique tout ça quand même :-)
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 .fr et du domaine .gorun.fr
puis on interdira l'accès uniquement aux utilisateurs de la machine toto.gorun.fr
Ici, seule la présence du fichier .htaccess est nécessaire. Son contenu est bien sûr différent du cas de l'authentification par nom et mot de passe.
Deux possibilités sont donc offertes :
|
On refuse tous les accès sauf ceux qui sont précisés AuthUserFile /dev/null AuthGroupFile /dev/null AuthName AccesRestreint AuthType Basic <limit GET> order deny,allow deny from all allow from .fr allow from .gorun.fr </Limit> |
|
On accepte tous les accès sauf ceux qui sont précisés AuthUserFile /dev/null AuthGroupFile /dev/null AuthName InterditPartiel AuthType Basic <limit GET> order allow,deny allow from all deny from toto.gorun.fr </Limit> |
Combinaison des deux méthodes
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 /var/www/httpd_1.3.19/public_html.htpasswd AuthGroupFile /dev/null AuthName AccesRestreint AuthType Basic <limit GET> order deny,allow deny from all allow from .gorun.fr require user gorun satisfy any </Limit> |
Dans cet exemple, sont autorisées les personnes connectées depuis le sous-domaine .gorun.fr ainsi que la personne de nom gorun (citée dans le fichier .htpasswd) qui peut se connecter d'un tout autre endroit. C'est la clause satisfy any qui permet l'une ou l'autre des deux autorisations.
|
On autorise les accès depuis un certain sous-domaine en faisant de plus intervenir des mots de passe AuthUserFile /var/www/httpd_1.3.19/public_html.htpasswd AuthGroupFile /var/www/httpd_1.3.19/public_html.htgroup AuthName AccesRestreint AuthType Basic <limit GET> order deny,allow deny from all allow from .gorun.fr require group intranet satisfy all </Limit> |
Dans cet exemple, sont autorisés les personnes connectées depuis le sous-domaine .gorun.fr à condition de faire partie du groupe intranet (défini dans .htgroup). C'est la clause satisfy all qui permet la combinaison des deux conditions.
Cette possibilité est particulièrement utile dans le cas où on a défini deux groupes non forcément disjoints et qu'on souhaite ne donner l'accès qu'à l'intersection des deux groupes, sans remettre en cause la constitution propre de chaque groupe.
Type d'accès avancés |
on peut définir des protections différentes pour certains répertoires, ou certains fichiers.
|
AuthUserFile /var/www/httpd_1.3.19/public_html.htpasswd AuthGroupFile /var/www/httpd_1.3.19/public_html.htgroup AuthName AccesRestreint AuthType Basic <Files motdepassemysql.php> Order Deny,Allow Deny From All </Files> <FilesMatch "./.(gif|jpe?g|png)$"> require valid-user </FilesMatch> <Directory /var/www/httpd_1.3.19/public_html/stats> Options -Indexes AllowOverride FileInfo require group administrateurs </Directory> <DirectoryMatch "^public_html/.*[0-9](3)"> AllowOverride None </DirectoryMatch> |
EXPLICATIONS :
Propagation de la protection |
Lorsque l'on protège un répertoire tous les sous-répertoires sont automatiquement protégés.
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:
il faut un CHMOD 644
Personnalisation des messages d'erreur |
Vous pouvez personnaliser tous les messages d'erreur qui apparaîtront sur l'écran de vos visiteurs.
Pour cela, je vous conseille 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.
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.
Voici un exemple illustratif d'un fichier .htaccess qui restreint l'accès au site de gorun.fr et qui route les messages d'erreur vers des pages appropriées:
|
AuthName AccesRestreint # 401 et 405 : permission refusée ErrorDocument 401 /~gorun/erreurs/Interdit.html ErrorDocument 405 /~gorun/erreurs/Interdit.html # 404 : fichier non trouvé ErrorDocument 404 /~gorun/erreurs/FichierAbsentIntranet.shtml # 500 : erreur interne du serveur ErrorDocument 500 /~gorun/erreurs/InternalError.html # 400 : Mauvaise requete ErrorDocument 400 /~gorun/erreurs/MauvaiseRequete.html <limit GET> order deny,allow deny from all allow from .gorun.fr </Limit> |
Remarques :
|
ErrorDocument 401 "désolé, cette page existe sur le serveur, mais vous n'y avez pas accès" ErrorDocument 404 http://radiomp3.intranet.gorun.fr |
NOTE : si vous utilisez des liens externes (http://), le serveur ne renvoie pas de code d'erreur mais simplement une url de redirection. Ca perturbe alors les moteurs de recherche qui veulent savoir si les urls sont toujours valides.
liste des codes http (d'après les spécifications du W3C en 1994) - bruts
|
Interdire ou autoriser le listage des fichiers. |
Si un répertoire ne contient pas de DirectoryIndex (index.html, index.php...), en principe le serveur renvoie une liste formatée des fichiers.
Pour interdire le listage des répertoires, ajoutez la ligne suivante dans votre fichier .htaccess :
| Options -Indexes |
pour l'autoriser :
| Options +Indexes |
NOTE : on peut aussi personnaliser le formatage de la liste des fichiers, mais ces fonctions sont peu utilisées : redéfinir les icones, changer l'ordre des fichiers, les commentaires, mettre les titres des pages html à la place du nom de fichier............
Les erreurs fréquentes au sujet des fichiers .htaccess/.htpasswd. |
Complèments |
Je pense déjà vous en avoir dit pas mal au sujet des fichiers .htaccess et .htpasswd Les fonctions énumérées ci-dessus conviennent à mon avis à 99% des situations.
Je vais m'arreter là histoire de pas trop vous embrouiller.
Si vous souhaitez encore plus d'info, le plus simple est de se taper la lecture de la doc Apache : http://localhost/manual ou sinon, pour ceux qui ont un pc : http://www.apache.org
Gorun RENAULT 06/2001