Protéger une page web
On va voir dans cet article comment protéger l’accès à une page web (phpsysinfo par exemple) par mot de passe, car toutes les interfaces web n’ont pas toujours de fonction native pour protéger l’accès.
Création du fichier Digest
On va utiliser une authentification Digest qui permettra de sécuriser la connexion le temps de l’échange de l'identifiant et du mot de passe, contrairement à l’authentification Basic qui laisse passer le mot de passe en clair.
Tout d’abord, il faut activer le module Digest d’Apache si ce n’est déjà fait. Pour l’activer, tapez la commande
a2enmod auth_digest
Maintent que le module est activé, on va créer un fichier Digest dans /etc/apache2 à l’aide de la commande htdigest (j’ai mis le fichier dans /etc/apache2 mais vous pouvez le mettre dans n’importe quel répertoire lisible par Apache).
La commande pour créer le fichier Digest est la suivante :
htdigest -c /etc/apache2/passwords Realm Username
- Realm sera affiché à l’utilisateur lors de la connexion pour qu’il sache quel nom et mot de passe il peut utiliser. Vous pouvez mettre ce que vous voulez mais mettez de préférence quelque chose en rapport avec le répertoire protégé (Zone administration, Phpsysinfo,…).
- Username correspond à l’utilisateur qui aura les droits pour accéder à votre interface.
/!\Si dans le futur vous avez besoin de créer d’autres utilisateurs, il suffira de taper la même commande mais sans le “-c”. Ca rajoutera le nouvel utilisateur à la suite dans le fichier. Si vous laissez le “-c”, la commande va écrire un nouveau fichier.
Après avoir tapé la commande, un mot de passe vous sera demandé.
Maintenant que notre fichier htdigest est créé, il faut dire à Apache de l’utiliser.
Configuration d’Apache
Allez dans le répertoire /etc/apache2/sites-enabled/ et ouvrez votre fichier de configuration Apache. (/var/www/phpsysinfo par exemple)
Petite parenthèse. Si le répertoire que vous voulez protéger ne se trouve pas dans le DocumentRoot indiqué dans le fichierde config, il faudra utiliser un Alias. Il vous suffit de rajouter la ligne
Alias /nomdel'alias répertoiredel'alias
Ca donnerait par exemple
Alias /phpsysinfo /var/www/phpsysinfo
. Il faut que l'utilisateur Apache ait accès à ce répertoire également. Fin de la parenthèse.
Ajoutez les lignes suivantes dans votre virtualhost pour protéger l'accès à tout le site :
<Location /> AuthType Digest AuthName "Realm" AuthDigestDomain /var/www/ https://www.exemple.fr AuthDigestProvider file AuthUserFile /etc/apache2/passwords Require valid-user </Location>
Si vous souhaitez protéger que l'accès à une page en particulier, rajoutez le chemin dans “Location” comme suit
<Location /phpsysinfo> AuthType Digest AuthName "Realm" AuthDigestDomain /var/www/phpsysinfo/ https://www.exmple.fr/phpsysinfo AuthDigestProvider file AuthUserFile /etc/apache2/passwords Require valid-user </Location>
Quelques infos sur ce bloc :
- Location indique le répertoire concerné
- AuthType indique le type d’authentification.
- AuthName doit correspondre au Realm que vous avez choisi lors de la création de l’utilisateur avec la commande htdigest. Ca permettra à Apache de savoir quel utilisateur choisir dans le fichier passwords.
- AuthDigestDomain doit avoir le chemin complet du répertoire à protéger suivi de l’url de l’interface web (ou du répertoire dans ce cas où vous voulez protéger un répertoire).
- AuthUserFile doit être renseigné avec le chemin du fichier contenant l’utilisateur et le mot de passe.
Il vous reste plus qu’à sauvegarder et à redémarrer Apache.
Maintenant quand vous allez rentrer l’adresse de l’interface web ou du répertoire à protéger, une fenêtre de connexion apparaîtra.
Si tout a fonctionné, en rentrant l’utilisateur et le mot de passe configuré plus haut, vous aurez accès au contenu.
Pensez à rediriger les connexions http vers https
Dans mon cas, toutes les connexions http sont redirigées vers le https, donc je n’ajoute la protection que dans le vhost du port 443. Si vous ne redirigez pas les connexions http vers https l’interface sera sans aucune protection quand on y accède en http.