Intéressé par des cours d'informatique en ligne ?
Visitez mon nouveau site https://www.yesik.it !

Nous savons tous qu'un serveur Web permet à un client de récupérer (download) des données: texte, image, son, etc.

Mais il est moins connu que le protocole http permet aussi d'utiliser un serveur web pour recevoir des données (upload). Néanmoins, même si Apache est capable de gérer ce type de requête, il est à la fois plus simple et plus souple de mettre en place cette fonctionnalité via le module mod_dav. Celui-ci met en oeuvre le protocole WebDAV, qui est une extension de http, spécifiquement conçu pour permettre la gestion et l'édition collaborative des fichiers sur un serveur web distant.

Nous allons donc voir dans cet article comment configurer le module mod_dav du serveur Apache pour permettre à vos clients d'uploader des fichiers dans un répertoire géré par le serveur web.

Préparation

Je suppose ici que vous avez déjà installé Apache. Sur une installation GNU/Linux Debian ou dérivée, vous pouvez utiliser le gestionnaire de paquet APT:

sh# apt-get install apache2 apache2-mpm-prefork

Une fois que vous aurez votre serveur Apache http fonctionnel, nous allons créer le répertoire auquel les clients auront accès. Ici, j'utiliserai /srv/dav/depot. Mais vous pouvez choisir le nom et l'emplacement de votre choix:

sh# mkdir -p /srv/dav/depot # -p est une extension GNU qui crée les répertoires parents s'ils n'existent pas déjà
sh# chown www-data:www-data /srv/dav/depot/ # Je m'assure aussi qu'Apache ait les permissions en lecture et modification sur le répertoire

Bien sûr, il faut aussi configurer Apache pour qu'il serve le contenu de ce répertoire. Dans l'installation standard de Debian, cela peut se faire en rajoutant un fichier de configuration dans /etc/apache2/sites-available:

sh# cat /etc/apache2/sites-available/depot << EOF
Alias /depot "/srv/dav/depot"
<Directory /srv/dav/depot >
	Options Indexes
	Order Allow,Deny
	Allow from all
</Directory>
EOF
sh#  a2ensite depot
Enabling site depot.
Run '/etc/init.d/apache2 reload' to activate new configuration!

Remarque:

Sur une autre installation, il faudra peut-être modifier directement le fichier apache2.conf.

Une fois la configuration effectuée, il faut penser à redémarrer le serveur Apache pour que les modifications soient prises en compte:

sh# apache2ctl restart

Si tout c'est bien passé, l'URL http://localhost/depot correspondra désormais au dossier /srv/dav/depot du serveur.

Sécuriser l'accès au répertoire

Pour l'instant nous n'avons encore rien fait qui ait à voir avec WebDAV. Et nous n'allons toujours pas toucher à mod_dav dans cette section! Déçus? Envie de sauter directement au vif du sujet? Je vous le déconseille: en effet, ce que nous allons faire maintenant est extrêmement important: il s'agit en effet de configurer la sécurité du dossier depot afin d'éviter que n'importe qui ne puisse uploader des fichiers sur votre serveur.

Apache supporte plusieurs techniques d'authentification. Ici nous allons utiliser l'authentification Digest. Si ce n'est déjà fait, il faut donc tout d'abord activer le module mod_auth_digest:

sh# a2enmod auth_digest
Enabling module auth_digest.
Run '/etc/init.d/apache2 restart' to activate new configuration!

Et avant de redémarrer notre serveur, nous allons également changer la configuration de notre répertoire depot pour exiger une authentification:

sh# cat /etc/apache2/sites-available/depot << EOF
Alias /depot "/srv/dav/depot"
<Directory /srv/dav/depot >
	# Authentification
	AuthType Digest
	AuthName "private depot"
	AuthDigestDomain /depot/
	
	AuthDigestProvider file
	AuthUserFile /srv/dav/digest.pw
	Require valid-user

	Options Indexes
	Order Allow,Deny
	Allow from all
</Directory>
EOF

Enfin, vous voyez dans la configuration que l'authentification se fait par le fichier /srv/dav/digest.pw. Ce fichier contiendra les paires nom d'utilisateur/mot de passe. Et il va de soi que nous allons devoir le créer. Cela se fait via l'utilitaire htdigest distribué avec Apache:

sh# touch /srv/dav/digest.pw # Crée le fichier s'il n'existe pas
sh#  htdigest /srv/dav/digest.pw "private depot" sylvain
Adding user sylvain in realm private depot
New password: 
Re-type new password: 

Note:

L'argument "private depot" de la commande htdigest est le nom de royaume (realm name).

Non seulement il sera présenté à l'utilisateur lors de la demande d'authentification, mais surtout, il doit être parfaitement identique à la valeur donnée par la directive AuthName dans le fichier de configuration.

Voilà, maintenant tentez de recharger la page http://localhost/depot. Le serveur devrait vous réclamer un nom d'utilisateur et un mot de passe avant de vous laisser y accéder.

Où mod_dav entre (enfin) en jeu

Jusqu'à présent nous n'avons fait que de la configuration Apache classique. Enfin voici la partie spécifique à WebDAV. Et comme souvent quand on rajoute des fonctionnalités à Apache, l'opération se déroule en trois étapes:

  1. activer le module,
  2. modifier la configuration
  3. et redémarrer le serveur.

Activer le module

C'est vraiment pour le plaisir de détailler. A ceci près que j'attire votre attention sur le fait qu'il faut activer non pas un, mais deux modules: mod_dav et mod_dav_fs:

sh# a2enmod dav dav_fs
Enabling module dav.
Considering dependency dav for dav_fs:
Module dav already enabled
Enabling module dav_fs.
Run '/etc/init.d/apache2 restart' to activate new configuration!

Modifier la configuration

A nouveau, la modification prend place dans le fichier de configuration /etc/apache2/sites-available/depot. Ici pour ajouter deux directives: DavLockDB et Dav:

Alias /depot/ "/srv/dav/depot/"
DavLockDB /var/lock/apache2/DavLockDB
<Directory /srv/dav/depot >
	Dav On

	# Authentification
	AuthType Digest
	AuthName "private depot"
	AuthDigestDomain /depot/
	
	AuthDigestProvider file
	AuthUserFile /srv/dav/digest.pw
	Require valid-user

	Options Indexes
	Order Allow,Deny
	Allow from all
</Directory>

N'oubliez pas de redémarrer Apache:

sh#  apache2ctl restart

Tester

Et voilà: dès maintenant, votre serveur Web est prêt à recevoir des fichiers à stocker dans le dossier depot. En guise de test, je vais utiliser curl pour accéder au serveur à partir de la ligne de commande:

sh$ echo "Hello WebDAV" > hello.txt
sh$ curl -T hello.txt http://localhost/depot/ --digest --user sylvain:sylvain-pw
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>201 Created</title>
</head><body>
<h1>Created</h1>
<p>Resource /depot/hello.txt has been created.</p>
<hr />
<address>Apache/2.2.9 (Debian) DAV/2 PHP/5.2.6-1+lenny3 with Suhosin-Patch Server at localhost Port 80</address>
</body></html>

Vous pouvez aussi vérifier que vous pouvez relire le fichier uploadé:

sh$ curl http://localhost/depot/hello.txt --digest --user sylvain:sylvain-pw
Hello WebDAV

Remarque:

Si vous êtes allergiques à la ligne de commande, il y a aussi moyen d'accéder à votre serveur via l'explorateur de fichier de votre interface graphique préférée (pour peu qu'elle soit raisonnablement récente). Sous Gnome, par exemple, c'est possible par l'intermédiaire du menu "Se connecter à un serveur...".


Quant aux informations à saisir pour se connecter, elles parlent d'elles-mêmes:

Pour un brin de configuration en plus

Juste pour terminer, nous allons modifier une dernière fois notre configuration. L'idée ici serait de permettre un accès libre en consultation (download) au répertoire depot. Mais de n'autoriser que les utilisateurs authentifiés à charger (upload) des fichiers.

Cette possibilité est offerte par Apache via la directive LimitExcept. Celle-ci permet de limiter l'accès à une ressource à toutes les requêtes http sauf celles indiquées.

Dans le fichier de configuration /etc/apache2/sites-available/depot remplacez la ligne Require valid-user par:

	<LimitExcept GET OPTIONS>
		Require valid-user
	</LimitExcept>

Avec cette configuration, Apache demandera une authentification pour toutes les requêtes sur /depot sauf pour les requêtes GET et OPTIONS.

Ce que nous pouvons verifiez avec curl:

sh$ curl http://localhost/depot/hello.txt # Consultation sans authentification
Hello WebDAV

Par contre, l'authentification reste requise pour l'envoi de documents:

sh$ curl -T hello.txt http://localhost/depot/
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>401 Authorization Required</title>
</head><body>
<h1>Authorization Required</h1>
<p>This server could not verify that you
are authorized to access the document
requested.  Either you supplied the wrong
credentials (e.g., bad password), or your
browser doesn't understand how to supply
the credentials required.</p>
<hr>
<address>Apache/2.2.9 (Debian) DAV/2 PHP/5.2.6-1+lenny3 with Suhosin-Patch Server at localhost Port 80</address>
</body></html>

Références