Sécuriser un répertoire par authentification HTTP
Le tutoriel qui va suivre et une initiation à la sécurisation d'un dossier sur un serveur Web de type Apache. Il vous apprendra à définir des règles de proctection dans un fichier .htaccess et des couples logins / mots de passe autorisés à accéder au dossier.
Introduction
Lorsque l'on développe une application web, on en vient rapidement à se poser la question de la sécurité de certaines parties de cette dernière. En effet, certaines zones de l'application peuvent renfermer des données plus ou moins sensibles auxquelles nous ne souhaitons pas permettre la lecture (et encore moins l'écriture) à l'utilisateur lambda. Ces parties restreintes sont par exemple les portails d'administration, les fichiers de données utilisateurs, la version en bêta test...
Nous allons étudier dans ce tutoriel, une méthode simple et efficace qui permet de sécuriser tout un répertoire présent sur un serveur Web Apache au moyen d'une authentification HTTP. Cette identification sera assurée par couple un login / password.
Afin de rendre ce cours plus pratique et concret, nous simulerons la sécurisation du répertoire contenant les scripts d'administration du site.
Commençons donc par définir les ressources qui seront nécessaires à l'élaboration de cette protection.
Détermination des ressouces nécessaires
Comme nous venons de l'indiquer plus haut, nous allons nous intéresser à la sécurisation du répertoire d'administation. C'est donc le premier élément dont nous avons besoin.
Nous verrons par la suite que nous devrons écrire deux fichiers de configuration qui définissent les règles de protection ainsi que les couples login / password des utilisateurs autorisés à pénétrer dans le répertoire. Le premier sera donc le fichier .htaccess et le second le fichier .htpasswd.
Le fichier .htaccess
Le fichier .htaccess est un simple fichier texte qui permet de surcharger la configuration originale du serveur Apache sur lequel le site est hébergé.
Comme nous pouvons le constater, il ne porte pas d'extension et commence par un point. C'est significatif d'un fichier caché. En revanche nous prendrons la précautions d'enregistrer ces fichiers avec l'extension .txt en local puis nous les renommerons correctement au moment de l'upload sur le serveur web.
Le code ci-dessous présente le contenu du fichier .htaccess qui permet de sécuriser notre répertoire.
Listing du fichier .htaccessAuthUserFile /Users/Emacs/Sites/ApprendrePHP/administration/.htpasswdAuthGroupFile /dev/nullAuthName AdministrationAuthType Basicrequire user toto kiki rene monique
Etudions une à une les lignes de ce fichier :
Ligne 1 : Elle indique le chemin canonique absolu menant au fichier .htpasswd qui contient les couples logins / passwords autorisés à entrer dans le répertoire.
Ligne 2 : Cette ligne précise que nous
n'utilisons pas de fichier de groupe pour simplifier l'exemple.
Ligne 3 : Ce code intitule la boîte
d'identification. Dans notre exemple, nous avons marqué
"Administration" mais nous aurions pu écrire "Accès restreint" ou bien "Mon espace privé"...
Ligne 4 : Le type "Basic" indique quant à lui la méthode qui sera utilisée pour l'authentification.
Ligne 6 : Cette dernière ligne permet de définir les requêtes HTTP autorisées (ici GET et POST) ainsi que les utilisateurs (séparés par un espace) ayant le droit d'accéder au répertoire après identification.
Le chemin canonique du fichier .htpassword
Qu'est-ce que le chemin canonique d'un fichier ?
Le chemin canonique correspond à l'emplacement réel et physique d'un fichier sur une machine depuis la racine.
Comment l'obtenir ?
Il existe une méthode rapide et efficace avec PHP pour connaître ce chemin. Pour pouvoir l'utiliser, il faut bien entendu que votre serveur web intégre le module PHP.
Le langage PHP possède nativement la fonction realpath() qui retourne le chemin canonique d'un fichier placé en paramètre. Pour connaître ce fameux chemin absolu, allons placer dans le repertoire d'administration un fichier realpath.php qui contient le code suivant :
Listing du fichier realpath.php<?php?>
Après exécution du fichier, nous obtenons à l'écran le chemin absolu du fichier sur la machine. Ce qui donne un résultat de ce type. Celui présenté ci-dessous correspond au chemin absolu du fichier realpath.php sur ma machine ( MacBook équipé de MAMP ).
Chemin canonique du fichier realpath.php/Users/Emacs/Sites/ApprendrePHP/administration/realpath.php
Note : le répertoire d'administation du site Apprendre-PHP n'est pas celui-ci dans la réalité. Ce n'est donc pas la peine d'essayer à l'atteindre car vous serez redirigé automatiquement vers une erreur 404.
Nous avons à présent le chemin absolu menant au répertoire d'administration. Nous pouvons donc le placer dans la première ligne du fichier .htaccess vu précédemment et remplacer realpath.php par .htpasswd. Enfin nous supprimons le fichier realpath.php du serveur car il ne nous servira plus.
Nous avons maintenant un fichier .htaccess qui définit quel est le répertoire à sécuriser et quels sont les utilisateurs autorisés à y accéder : toto, kiki, rene et monique.
Mais il nous manque toujours un élément important. Il s'agit du fichier .htpasswd qui contient les couples login et password. C'est de lui dont nous allons parler à présent.
Le fichier .htpasswd
Ce fichier est extrêmement sommaire. Il contient uniquement les couples logins / mots de passe des utilisateurs autorisés.
Dans notre exemple, nous plaçons le fichier .htpasswd à la racine du répertoire /administration aux côtés du fichier .htaccess. Nous aurions pu le placer ailleurs. L'important c'est de spécifier son chemin absolu sur le serveur dans la première ligne de notre fichier .htaccess.
D'un point de vue syntaxe, chaque ligne du fichier .htpasswd doit ressembler à cela :
Syntaxe d'un fichier .htpasswdlogin1:motdepasse1_chiffrelogin2:motdepasse2_chiffrelogin3:motdepasse3_chiffreetc...
Reprenons nos quatre utilisateurs. Pour chacun d'eux, nous devons associer un mot de passe chiffré. Nous choisissons respectivement les passwords toto, titi, tata et tutu.
Il y'a différents algorithmes de chiffrement possibles pour les mots de passe du fichier .htpasswd. Nous pouvons par exemple nous contenter de la fonction crypt() de PHP ou bien utiliser un service en ligne comme celui-ci : hasheurs de mots de passe
Les passwords étant à présent chiffrés, nous pouvons les restituer dans le fichier .htpasswd. Ce dernier prend alors la forme suivante :
Listing du fichier .htpasswdtoto:$1$78lgLQws$jYXYdhh24woPFyrXrrX9E0kiki:$1$rrNpXH3q$7MQNILM0vUFMRpnODzY1u1rene:$1$.2VnnvU5$bLxRgZMuqeUvb4Ittto0U.monique:$1$dA63Fvvq$ZLg8BFAtLvBn2mumWb0FW1
Notre fichier est à présent terminé. Nous entrons dans la phase terminale de la sécurisation.
Upload et renommage des fichiers sur le serveur Web
Pour finaliser le tout, il faut uploader avec un client FTP (FileZilla, FTP Commander, WSFtp ou même par des commandes systèmes) nos deux fichiers textes dans le répertoire /administration du site.
Ceci étant fait, il faut les renommer avec les noms suivants : .htaccess et .htpasswd.
Il est fort possible que ces fichiers disparaissent de la fenêtre de votre client FTP au
rafraichissement. C'est normal car, comme il l'a été évoqué au tout début de tutoriel,
ce sont des fichiers cachés.
Enfin, il ne nous reste plus qu'à tester le tout en nous rendant à l'adresse menant au répertoire d'administration. Une fenêtre similaire (suivant le navigateur utilisé) apparaît et réclame l'identification.
Nous entrons l'un des couples précédemment défini. Par exemple : rene et tutu. Si les identifiants sont correctement entrés, nous devrions être automatiquement redirigés à l'index du répertoire. Si tel n'est pas le cas c'est qu' une erreur s'est produite à l'un de ces niveaux :
- Le couple login / mot de passe tapé est incorrect
- Le mot de passe chiffré est incorrect
- Le fichier .htpasswd est inexistant sur le serveur ou mal orthographié
- Le fichier .htpasswd n'est pas situé dans le bon répertoire
- Le chemin du fichier .htpasswd dans le fichier .htaccess est incorrect
Il faut alors vérifier une à une ses solutions potentielles jusqu'à ce que tout fonctionne. Si aucune ne marche alors la meilleure solution est de demander conseil auprès de l'hébergeur car certains fixent des restrictions ou bien imposent un système différent pour sécuriser les répertoires.
Conclusion et compléments d'information
Ce tutoriel s'achève ici. Nous avons étudié une manière simple et efficace pour sécuriser rapidement un répertoire d'un site. Cette méthode fonctionne parfaitement mais n'est pas exhaustive. Pour un complément d'information, nous vous invitons à consulter les liens ci-desssous.
Les commentaires
2. Par Emacs le 08/11/2007 23:26
Merci beaucoup pour l'intérêt que tu as porté à ce tutoriel
Apache permet beaucoup de choses en terme de sécurisation des répertoires. Cela va de la restriction totale à tout le monde avec un .htaccess contenant "deny from all", ou bien la protection du répertoire à qu'à certaines IP ou domaines référents bien précis... Il y'a également l'application d'une politique de droits sur le fichier. C'est à dire appliquer uniquement des droits en lecture et refuser l'écriture pour empêcher le dépôt de fichiers dans le dossier. Puis enfin, on peut sécuriser un répertoire avec PHP en filtrant les personnes autorisées à y pénétrer, déposer des documents, lire des documents...
La méthode présentée ici est sans doute la plus efficace pour protéger l'accès au répertoire pour un utilisateur ou bien un groupe d'utilisateurs. Mais après, la politique de sécurité se décide en fonction du contexte et des besoins de l'application.
A bientôt.
Hugo.
3. Par jeremail le 17/12/2007 08:20
Ce tutoriel est très bien fait, clair et concis.
Merci
4. Par Emacs le 17/12/2007 08:41
Merci pour ton feedback
5. Par SiM07 le 26/04/2008 23:48
On crypte un signal, on chiffre un mot de passe. Sinon les explications sont sympa.
6. Par Emacs le 27/04/2008 11:33
C'est corrigé
7. Par zorba le 22/05/2008 19:47
Merci pour ce site, qui fourmille d'infos intéressantes. J'utilise un htaccess pour restreindre l'accès à un répertoire, mais horreur si on clique 4 fois sur annuler on accède au dit répertoire! Quelle pourrait être mon erreur?
D'autre part j'ai lu de nombreux commentaires considérant que les htaccess offrent une sécurité très limitée. Qu'en penses-tu? Merci
8. Par zorba le 26/05/2008 15:21
Mille excuses. Mon erreur venait d'un # égaré: la fenêtre d'authentification apparaissait quand même, mais se comportait mal.
Quid du degré de sécurité offert par un htaccess? Merci
9. Par Enaco le 23/04/2009 17:57
Ce tuto est très clair et facile à comprendre, je suis tombé dessus par une recherche Google et il correspond tout à fait à ce que je cherchais. Merci beaucoup pour ce travail.
10. Par joceT le 13/08/2009 12:07
Merci beaucoup pour tous ces tutos clairs et précis. Simples à comprendre et à mettre en place même pour la néophythe (agée) que je suis.
11. Par Julien le 04/09/2009 19:33
Merci pour le tuto ça risque de bien m'aider pour protéger mon futur site
1. Par ludo le 08/11/2007 23:01