Comment coupler Vsftpd avec Apache ?
Ce tutoriel décrit comment donner un accès Ftp aux sites web d'un serveur mutualisé, afin que ceux ci soient directement accessibles par le serveur apache, sans problème de droits.
Pour cela, nous allons mettre en œuvre un serveur Vsftpd, en utilisant des utilisateurs virtuels.
Pré-requis
- Disposer des droits d'administration sur le serveur.
- Ce tutoriel fonctionne sur un serveur 10.4.1
Installation
Nous allons installer le serveur apache, le serveur vsftpd, et un outil qui nous permettra la création d'une base de données des utilisateurs.
sudo aptitude install apache2 vsftpd db4.8-util
Création des répertoires
Les données des sites seront stockées sous /data/sites-web. Il faut donner les droits à l'utilisateur et au groupe www-data. Les données de configuration de vsftpd seront stockées sous /etc/vsftpd. Ce répertoire n'est pas créé à l'installation. Les fichiers de configurations de chaque utilisateur seront stockés dans le répertoire /etc/vsftpd/users.conf/
sudo mkdir -p /data/sites-web/site1 sudo chown -R www-data:www-data /data sudo mkdir -p /etc/vsftpd/users.conf/
Création de la base d'utilisateurs
Pour rester concis, nous utiliserons une base de données la plus simple possible. Dans le cadre d'un déploiement plus important, il est très facile d'utiliser une base mysql à la place. Pour cela voir VsftpD et authentification via pam_mysql sur base de données SQL
Nous allons créer un simple fichier texte, qui contiendra les couples login/mot-de-passe. A l'aide de db4.8-util, nous transformerons ce fichier en base de données.
sudo touch /etc/vsftpd/users.txt sudo chmod 600 /etc/vsftpd/users.txt
Nous pouvons remplir ce fichier texte avec deux exemples :
user1 password1 user2 password2
Compilons ce fichier texte et changeons les droits de la base de données :
sudo db4.8_load -T -t hash -f /etc/vsftpd/users.txt /etc/vsftpd/users.db sudo chmod 600 /etc/vsftpd/users.db
Configuration de PAM
Vsftpd utilise PAM pour l'authentification.
Remplacez le contenu du fichier /etc/pam.d/vsftpd par :
auth required pam_userdb.so db=/etc/vsftpd/users account required pam_userdb.so db=/etc/vsftpd/users
Configuration de VSFTPD
Il ne reste plus que Vsftpd lui même à configurer.
Toute l'astuce ici réside dans la ligne guest-username. On utilise l'utilisateur www-data. Ceci permet à apache de pouvoir lire les fichiers écrits par vsftpd.
Editons le fichier /etc/vsftpd.conf :
# Pas d'accès anonyme, que des utilisateurs locaux anonymous_enable=NO local_enable=YES # Active les utilisateurs virtuels # Vsftpd utilise en fait l'utilisateur www-data guest_enable=YES guest_username=www-data nopriv_user=www-data write_enable=YES # On restreint l'utilisateur à son dossier de connexion chroot_local_user=YES # Utilisation de PAM pour l'authentification pam_service_name=vsftpd # Configuration par utilisateur user_config_dir=/etc/vsftpd/users.conf
La dernière ligne du fichier de configuration permet d'inclure les fichiers de configuration par utilisateur. Ceux ci se situent dans le répertoire /etc/vsftpd/users.conf.
Configuration par utilisateur
Nous disposons, via le fichier users.db, d'un compte utilisateur et d'un mot de passe. Pour chaque utilisateur, il faut maintenant créer un fichier contenant ses informations, dans le répertoire /etc/vsftpd/users.conf.
Exemple pour l'utilisateur user1 :
vim /etc/vsftpd/users.conf/user1 anon_world_readable_only=NO local_root=/data/sites-web/site1 write_enable=YES anon_upload_enable=YES anon_mkdir_write_enable=YES anon_other_write_enable=YES
Test du système
Nous pouvons relancer le service SFTPD :
sudo service vsftpd restart
et tenter une connexion ftp :
$ ftp ftp> open 192.168.1.102 Connected to 192.168.1.102. 220 Welcome to blah FTP service. Name (192.168.1.102:server): user1 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp>
Copiez un fichier via ftp, et vérifier ses droits sur le serveur.
ls -l /data/sites-web/site1/
Le fichier doit appartenir à l'utilisateur www-data.
Configuration apache
Encore pour des raisons de concisions, nous allons paramétrer un alias dans apache. Bien entendu, il est possible de créer des vhosts.
Modifions le fichier /etc/apache2/sites-available/default
sudo vim /etc/apache2/sites-available/default
ajoutons un simple alias :
Alias /site1/ "/data/sites-web/site1/" <Directory "/data/sites-web/site1/"> Options Indexes MultiViews FollowSymLinks AllowOverride None Order allow,deny Allow from all </Directory>
Relançons apache :
sudo service apache2 restart
et accèdons à notre site pour vérifier la présence du fichier téléchargé en FTP précédemment.
Conclusion
Nous avons rapidement mis en oeuvre une solution pour créer des sites web sur un serveur mutualisé qui peuvent être mis à jour par FTP. Cette solution ouvre de nombreuses portes vers des solutions plus élaborées : stockage des comptes dans une base mysql, cryptage des mots de passe, etc.
Un excellent tutoriel (voir rubrique Voir aussi) du site developpez.com va beaucoup plus loin dans la démarche. Sa lecture est vivement conseillée.