Protection des pages Web par htaccess


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  :

La description des méthodes que nous allons faire s'applique à un démon HTTPD de type NCSA installé sur une machine Unix.

A propos de la configuration du serveur

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

que vous pouvez bien sûr modifier si vous administrez votre propre serveur.

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

Ce qui signifie que vous ne pouvez pas (None) redéfinir les droits d'accès ....

Pour changer, vous devrez mettre (ou vérifier auprès de votre prestataire de services que c'est le cas):

AllowOverride AuthConfig

ou mieux :

AllowOverride All

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 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.

Authentification par le réseau

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 .telecom-paristech.fr puis on interdira l'accès uniquement aux utilisateurs de la machine ulysse.telecom-paristech.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
AuthGroupFile /dev/null
AuthName AccesRestreint
AuthType Basic

order deny,allow
deny from all
allow from .ch
allow from .telecom-paristech.fr

* On accepte tous les accès sauf ceux qui sont précisés

AuthUserFile /dev/null
AuthGroupFile /dev/null
AuthName InterditPartiel
AuthType Basic


order allow,deny
allow from all
deny from ulysse.telecom-paristech.fr


Authentification par mot de passe

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
% chmod 711 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
Adding password for david.
New password:
Re-type new password:
%

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)

% htpasswd .htpasswd stef
Adding user stef
New password:
Re-type new password:
%

Pour contrôle, vous pouvez visualiser le contenu de la base (sa structure login:motdepasse est très simple) :

% cat .htpasswd
david:bp3rCaQn8cISw
stef:D1.766HO012hA
%

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" 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é. Par ailleurs, exécuter une seconde fois cette commande pour un méme utilisateur ne fera que changer son mot de passe.

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
AuthUserFile /usr/local/bin/www/httpd_1.3/basedenoms/.htpasswd
AuthGroupFile /dev/null
AuthType Basic


require valid-user

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
AuthUserFile /usr/local/bin/www/httpd_1.3/basedenoms/.htpasswd
AuthGroupFile /dev/null
AuthType Basic

require user durand dupont dupond

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 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
systm-grp: perrot dumas etienne
visit-grp: 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 admin-grp et systm-grp à accéder aux fichier HTML contenus dans le même répertoire :

AuthName message
AuthUserFile /usr/local/bin/www/httpd_1.3/basedenoms/.htpasswd
AuthGroupFile /usr/local/bin/www/httpd_1.3/basedenoms/.htgroup
AuthType Basic


require group admin-grp
require group systm.grp

<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 !

Protéger un fichier de mots de passe

Vous avez bien compris que le nom du fichier de protection est totalement dépendant du serveur. De plus, dans la configuration standard des serveurs http, ce fichier s'appelle, comme il est supposé dans tout ce document: .htaccess.

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
AuthName "Acces restreint"
AuthType Basic

deny from all

Le mécanisme d'encryptage des mots de passe

La génération d'un mot de passe avec la commande htpasswd est assez simple :
Elle utilise une graine (seed) qui amorce une fonction aléatoire pour crypter les caractères du mot de passe. Le cryptage à proprement parler dépendra du mode de cryptage utilisé.

Lorsqu'on exécute htpasswd pour générer un mot de passe crypté, fait le résultat retourné contient en deux choses :

Bien souvent, la graine utilisée est basée sur l'heure courante, ce qui fait que deux exécutions successives donnent lieu à deux cryptages différents pour le même mot de passe.

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.


Combinaison des deux méthodes de protection

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
AuthGroupFile /dev/null
AuthName AccesRestreint
AuthType Basic


order deny,allow
deny from all
allow from .telecom-paristech.fr
require user martin
satisfy any

Dans cet exemple, sont autorisées les personnes connectées depuis le sous-domaine .telecom-paristech.fr ainsi que la personne de nom martin (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 /usr/local/bin/www/httpd_1.3/basedenoms/.htpasswd
AuthGroupFile /usr/local/bin/www/httpd_1.3/basedenoms/.htgroup
AuthName AccesRestreint
AuthType Basic

order deny,allow
deny from all
allow from .telecom-paristech.fr
require group intranet
satisfy all

Dans cet exemple, sont autorisés les personnes connectées depuis le sous-domaine .telecom-paristech.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.

Propagation de la protection

Lorsque l'on protège un répertoire tous les sous-répertoires sont automatiquement protégés.

Restreindre un répertoire ou des fichiers spécifiques ?

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>
 
AuthUserFile /usr/local/bin/www/httpd_1.3/basedenoms/.htpasswd
AuthGroupFile /usr/local/bin/www/httpd_1.3/basedenoms/.htgroup
AuthName AccesRestreint
AuthType Basic

order deny,allow
deny from all
allow from .telecom-paristech.fr
require group intranet
satisfy all


 
</Files>

Dans cet exemple, seuls les fichiers de noms fichier.html et fichier2.html bénéficieront de la restriction d'accès spécifiée.

Exemple d'utilisation sur Emma

Création de la directory contenant les mots de passe :

mkdir /infres/emma/infgl/danzart/basedenoms

Création de la base et du premier utilisateur :

htpasswd /infres/emma/infgl/danzart/basedenoms/.htpasswd -c utilisateur1

Création ou modification d'un utilisateur :

htpasswd /infres/emma/infgl/danzart/basedenoms/.htpasswd utilisateur2

Protéger ensuite un répertoire :
Cas d'erreur fréquent !

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.

Personnalisation des messages d'erreur

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.

ici un exemple illustratif d'un fichier .htaccess qui restreint l'accès au site de Telecom-ParisTech et qui déroute les messages d'erreur vers des pages appropriées:

AuthName AccesRestreint

# 401 et 405 : permission refusée
ErrorDocument 401 /~nomlogin/erreurs/PasDroits.html
ErrorDocument 405 /~nomlogin/erreurs/PasDroits.html
# 404 : fichier non trouvé
ErrorDocument 404 /~nomlogin/erreurs/FichierAbsent.html
# 500 : erreur interne du serveur
ErrorDocument 500 /~nomlogin/erreurs/InternalError.html
# 400 : Mauvaise requete
ErrorDocument 400 /~nomlogin/erreurs/MauvaiseRequete.html

ErrorDocument 400 "Erreur de requete"

order deny,allow
deny from all
allow from .telecom-paristech.fr

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.

En pratique : restreindre l'accès à un répertoire à Telecom-ParisTech

Pour aller vite, voici une marche à suivre :

  1. Récupérer le fichier htaccess.txt ici présent (en utilisant le bouton de droite de votre souris) et le placer dans le répertoire à protéger
  2. Renommer ce fichier : mv htaccess.txt .htaccess
  3. Donner les bons droits à ce fichier : chmod 644 .htaccess
  4. Remplacer textuellement le login danzart qui y est utilisé par votre propre login
  5. Créer un répertoire erreurs à la racine de votre homedirectory
  6. Donner les bons droits à ce répertoire : chmod 711 erreurs
  7. Récupérer le fichier ErreurAcces.html ici présent (bouton de droite de la souris) et le placer dans le répertoire erreurs
  8. Donner les bons droits à ce fichier : chmod 644 ErreurAcces.html
  9. Vous pouvez personnaliser ce fichier.
Après cela, les fichiers qui se trouvent dans le répertoire protégé ne seront accessibles qu'au domaine de Telecom-ParisTech.
Si une personne non autorisée tente d'y accéder, elle verra s'afficher la page ErreurAcces.html sur son navigateur.

Un exemple

Voici des liens où vous pouvez tester l'accessibilité de pages :

Après cela, les fichiers qui se trouvent dans le répertoire protégé ne seront accessibles qu'au domaine de Telecom-ParisTech.
Si une personne non autorisée tente d'y accéder, elle verra s'afficher la page ErreurAcces.html sur son navigateur.

Annie Danzart - mars 2010 -
Je remercie tous ceux qui, par leurs remarques et leurs conseils, contribuent à l'amélioration continuelle de cette page.