Date de dernière mise à jour : le 28 avril 2017 à 13 h 43 min

Protéger une interface web par mot de passe sur Debian 8

On va voir dans cet article comment protéger l’accès à une interface 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 du login 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 de 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 (à taper en root) :
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 de l’ancien dans le fichier.
Si vous laissez le « -c », la commande va écrire le nouvel utilisateur à la place de l’ancien.

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 de Apache

Aller dans le répertoire /etc/apache2/sites-enabled/ et ouvrir le fichier 000-default-ssl.conf (ou  000-default.conf si vous n’utilisez pas le https). Si vous accédez à votre interface via un nom de domaine (http://exemple.org/phpsysinfo par exemple), il faudra modifier le fichier de configuration Apache de ce nom de domaine.

On va garder l’exemple de phpsysinfo, qui est situé dans /var/www/phpsysinfo.
Voici à quoi ressemble mon fichier 000-default-ssl.conf sous Debian 8 :

<IfModule mod_ssl.c>
        <VirtualHost _default_:443>
                ServerAdmin webmaster@localhost

                DocumentRoot /var/www

                <Directory />
                Options FollowSymLinks
                AllowOverride None
                </Directory>
                <Directory /var/www/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride None
                Order allow,deny
                allow from all
                </Directory>

                # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
                # error, crit, alert, emerg.
                # It is also possible to configure the loglevel for particular
                # modules, e.g.
                LogLevel warn

                ErrorLog ${APACHE_LOG_DIR}/error.log
                CustomLog ${APACHE_LOG_DIR}/access.log combined

                SSLEngine on

                SSLCertificateFile    /etc/letsencrypt/live/www.memodugeek.info/fullchain.pem
                SSLCertificateKeyFile /etc/letsencrypt/live/www.memodugeek.info/privkey.pem

                <FilesMatch "\.(cgi|shtml|phtml|php)$">
                                SSLOptions +StdEnvVars
                </FilesMatch>
                <Directory /usr/lib/cgi-bin>
                                SSLOptions +StdEnvVars
                </Directory>

                BrowserMatch "MSIE [2-6]" \
                                nokeepalive ssl-unclean-shutdown \
                                downgrade-1.0 force-response-1.0
                # MSIE 7 and newer should be able to use keepalive
                BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
				 </VirtualHost>
</IfModule>
000-default-ssl.conf

Le répertoire racine pour ce fichier est indiqué par « DocumentRoot /var/www » et est donc /var/www.
Il faut donc que le répertoire que vous souhaitez protéger par mot de passe se trouve dans /var/www.

Petite parenthèse. Si votre répertoire ne se trouve pas dans /var/www il faudra utiliser un Alias. Il vous suffit de rajouter la ligne Alias /nomdel'alias répertoiredel'alias
Ca donnerai par exemple « Alias /Roundcube /opt/roundcube ». Fin de la parenthèse.

On va rajouter les lignes suivantes après la dernière balise </Directory>

<Location /phpsysinfo>
 AuthType Digest
 AuthName "Phpsysinfo"
 AuthDigestDomain /var/www/phpsysinfo/ https://www.exmple.fr/phpsysinfo
 AuthDigestProvider file
 AuthUserFile /etc/apache2/passwords
 Require valid-user
 SetEnv R_ENV "/var/www/phpsysinfo"
 </Location>
Phpsysinfo

Quelques info sur ce bloc :

  • Location indique le répertoire concerné dans le répertoire racine (ou l’alias si le répertoire n’est pas dans le répertoire racine)
  • 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.
  • SetEnv R_ENV doit lui aussi être renseigné avec le chemin complet du répertoire à protéger.

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 à protéger l’accès http et https

Dans mon cas, toutes les connexions http sont redirigées vers le https (voir ici comment faire), donc je n’ai besoin que de modifier le fichier de configuration SSL. Si ce n’est pas votre cas, il vous faudra faire la même modification sur le fichier 000-default.conf, sinon l’interface sera protégée quand on y accède en https mais sera sans aucune protection quand on y accède en http.
Idem si vous accéder à votre interface via un nom de domaine. Si vous n’avez pas de redirection https pensez bien à rajouter cette modif dans le vhost du port 80 ET dans le vhost du port 443.

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.