Sommaire

1. Description
2. Installation
3. Configuration
   3.1 Sauvegarder les fichiers de configuration
   3.2 Créer la base de donnée des utilisateurs virtuels
   3.3 Créer les utilisateurs virtuels
   3.4 Vsftpd.conf
   3.5 Configurer les utilisateurs virtuels
   3.6 Créer les home directories des utilisateurs virtuels
   3.7 Mots de passe cryptés
   3.8 Utilisation de TLS/SSL
4. Remarques
5. Liens et ressources

1   Description

L'installation suivante permet de mettre en place un serveur FTP utilisant des utilisateurs virtuels dont l'authentification est fondée sur les données présentes dans une base Berkeley.

2   Installation

Il faut dans un premier temps installer le paquet principal vsftpd :
# apt-get install vsftpd
Si vous avez l'intention de mettre en place des utilisateurs virtuels, il sera nécessaire d'utiliser l'authentification Pam. Pour ce faire, il faut installer en plus le package db4.5-util :
# apt-get install db4.5-util

3   Configuration

3.1 Sauvegarder les fichiers de configuration

Les fichiers de configurations de vsftpd sont placés de base dans /etc/. Pour, gérer notre nouvelle configuration, plus évoluée, nous allons tout d'abord créer un nouveau répertoire qui contiendra tous nos fichiers.
# mkdir /etc/vsftpd
On sauvegarde les anciens fichiers de configuration :
# cp /etc/vsftpd.conf /etc/vsftpd.conf.default.old
# cp /etc/pam.d/vsftpd /etc/pam.d/vsftpd.default.old

3.2 Créer la base de donnée des utilisateurs virtuels

Cette base de données contient les logins et mots de passe des utilisateurs virtuels. On crée le fichier des logins de la manière suivante :
fritz
fritz_pass
esver
esver_pass
Remarque : soyez sûr de terminer le fichier par un retour chariot. On a ainsi deux utilisateurs, fritz et esver, ayant respectivement comme password fritz_pass et esver_pass. Il faut maintenant convertir le fichier en une base de données :
# db4.5_load -T -t hash -f logins /etc/vsftpd/login.db
# chmod 600 /etc/vsftpd/login.db
# rm logins
et modifier la configuration pam pour utiliser notre base login.db comme source d'authentification de vsftpd. Créer le fichier /etc/vsftpd/vsftpd.pam et ajoutez y les lignes suivantes :
auth required /lib/security/pam_userdb.so db=/etc/vsftpd/login
account required /lib/security/pam_userdb.so db=/etc/vsftpd/login
Ensuite, copiez ce fichier dans le dossier de configuration PAM :
# cp vsftpd.pam /etc/pam.d/vsftpd
Et voilà, la configuration PAM est terminée.

3.3 Créer les utilisateurs virtuels

L'utilisateur virtual est l'utilisateur de gestion de vsftpd. Les utilisateurs créés précédemment, quant à eux, sont représentés par virtual car ils n'existent pas sur le système. On crée donc le nouvel utilisateur virtual, dont le groupe est vsftp, et le home directory /home/vsftpd/virtual dans lequel les utilisateurs virtuels seront loggés et ne pourront pas sortir.
# groupadd vsftp
# useradd -g vsftp -d /home/vsftp/virtual/ virtual
Ensuite, on crée physiquement les répertoires et les permission adéquates :
# mkdir -p /home/vsftp/virtual     # Création du home directory
# chown root:vsftp ~virtual/       # Le home directory n'appartient pas à l'utilisateur virtual mais a root
# chmod 2750 ~virtual/             # Tout répertoire créé sera affecté au groupe vsftp (via le setgid)

3.4 Vsftpd.conf

# Ceci configure vsFTPd en mode "standalone"
listen=YES

# Masquer la bannière vsftp par défaut
ftpd_banner="FTP Server"
#
# On désactive les connexions anonymes
# et on active les non-anonymes(c'est le cas des utilisateurs virtuels):
anonymous_enable=NO
local_enable=YES

# Pour des raisons de sécurité on interdit toute action d'écriture:
write_enable=NO
anon_upload_enable=NO
anon_mkdir_write_enable=NO
anon_other_write_enable=NO
hide_ids=YES

# 'guest_enable' est très important: cela active les utilisateurs virtuels!
# 'guest_username' fait correspondre tous les utilisateurs virtuels à
# l'utilisateur 'virtual' que nous avons défini plus haut, et au home
# correspondant: '~virtual/'.
guest_enable=YES
guest_username=virtual

# On veut que les utilisateurs virtuels restent chez eux: '~virtual/'
# (attends, on leur a fait un toît, c'est pas pour rien!)
chroot_local_user=YES

pasv_enable=YES
pasv_max_port=2020
pasv_min_port=2000
#pasv_address=127.0.0.1
#pasv_address=86.214.21.209

# On défini le nombre maximum de sessions à 200(les nouveaux clients recevront
# un message du genre: "erreur: serveur occupé").
# On défini le nombre maximum de sessions par IP à 1
max_clients=10
max_per_ip=10

# Enregistrer les actions des utilisateurs
xferlog_enable=YES
xferlog_file=/var/log/vsftpd.log
log_ftp_protocol=YES

# SSL options
ssl_enable=YES
#ssl_tlsv1=YES
#ssl_sslv2=NO
#ssl_sslv3=NO
#allow_anon_ssl=NO
#force_local_data_ssl=YES
#force_local_logins_ssl=YES

####################################
# Debian customization             #
# (ou adoptons la debian attitude) #
####################################
# Some of vsftpd's settings don't fit the Debian filesystem layout by
# default.  These settings are more Debian-friendly.
#
# This option should be the name of a directory which is empty.  Also, the
# directory should not be writable by the ftp user. This directory is used
# as a secure chroot() jail at times vsftpd does not require filesystem
# access.
secure_chroot_dir=/var/run/vsftpd
#
# This string is the name of the PAM service vsftpd will use.
pam_service_name=vsftpd
#
# This option specifies the location of the RSA certificate to use for SSL
# encrypted connections.
rsa_private_key_file=/etc/ssl/certs/vsftpd.pem
rsa_cert_file=/etc/ssl/certs/vsftpd.pem
#
# Chaque utilisateur à une configuration propre présente dans le répertoire
# vsftpd_user_conf
user_config_dir=/etc/vsftpd/vsftpd_user_conf

3.5 Configurer les utilisateurs virtuels

On crée le dossier /etc/vsftpd/vsftpd_user_conf que l'on a mentionné dans le fichier ci-dessus pour contenir la confiuration des utilisateurs virtuels
# mkdir /etc/vsftpd/vsftpd_user_conf/
Caque fichier de configuration est désigné par le nom de l'utilisateur virtuel auquel il est associé. Soit pour, notre utilisateur fritz, on va accorder tous les droits. On créé le fichier /etc/vsftpd/vsftpd_user_conf/fritz et on y met les lignes :
anon_world_readable_only=NO
anon_upload_enable=YES
write_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=Yes
local_root=fritz
Quant à l'utilisateur esver il aura les même droits que fritz hormis le droit à la création des dossiers et de suppression des fichiers. On créé le fichier /etc/vsftpd/vsftpd_user_conf/esver :
anon_world_readable_only=NO
anon_upload_enable=YES
write_enable=YES
anon_upload_enable=YES
local_root=esver

3.6 Créer les home directories des utilisateurs virtuels

# cd ~virtual/
# mkdir fritz fritz/upload esver esver/upload
# chmod 2750 fritz/ esver/
# chmod 770 fritz/upload esver/upload
Actuellement, un répertoire spécifique pour l'upload est disponible pour chaque utilisateur, cependant, ils n'ont àccès à aucune donnée ; ils sont cantonnés à leur répertoire personnel. On va maintenant leur allouéer une ressource du serveur en lecture seule. Pour ce faire, on utilise la commande bind présente pour le montage des fichiers. Voici une partie de fichier /etc/fstab utilisant un bind pour permettre le partage des ressources :
# Gestion des utilisateurs virtuels - vsftpd
/mnt/rack200    /home/vsftp/virtual/fritz/partage1 none bind    0 0
Autrement dit, la ressource /mnt/rack200 sera présente dans le home directory de fritz sous le répertoire partage1 qui aura été préalablement créé. L'utilisateur fritz étant un utilisateur virtuel associé à l'utilisateur système virtual, il n'a aucun droit de propriétaire ou de groupe sur cette ressource, par suite, il est impératif que /mnt/rack200 est des droits en lecture exécution pour n'importe quel utilisateur.

3.7 Mots de passe cryptés

Dans l'exemple ci-dessus, les mots de passe sont stockés en clairs dans la base de données Berkeley, il reste donc accessibles dirons-nous. Alors pour améliorer tout cela, quelques modifications s'imposent. Pour obtenir un mot de passe crypté :
$ openssl passwd -1
$ Password: 
$ Verifying - Password: 
$ $1$7aNkRzvS$E7FkWo2/JBcUOO/K3kWqg1
et pour modifier le comportement de pam, il faut mettre à jour le fichier /etc/pam.d/vsftp :
auth required /lib/security/pam_userdb.so db=/etc/vsftpd/login crypt=crypt
account required /lib/security/pam_userdb.so db=/etc/vsftpd/login crypt=crypt
Pour plus d'information sur le module pam_userdb, vous pouvez consulter sa man page :p!

3.8 Utilisation de TLS/SSL

Pour utiliser TLS/SSL, il faut tout d'abord créer notre propre certificat vsftpd.pem (type x509 valide pendant un an)
# openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/certs/vsftpd.pem -out /etc/ssl/certs/vsftpd.pem
  [...]

# chmod 600 /etc/ssl/certs/vsftpd.pem
Il suffit ensuite d'ajouter quelques lignes au fichier /etc/vsftpd.conf, afin de prendre en compte le certificat et d'autoriser TLS/SSL :
# SSL options
ssl_enable=YES
#ssl_tlsv1=YES
#ssl_sslv2=NO
#ssl_sslv3=NO
#allow_anon_ssl=NO
#force_local_data_ssl=YES
#force_local_logins_ssl=YES

# This option specifies the location of the RSA certificate to use for SSL
# encrypted connections.
rsa_private_key_file=/etc/ssl/certs/vsftpd.pem
rsa_cert_file=/etc/ssl/certs/vsftpd.pem
Les options en commentaires sont présentes uniquement à titre indicatif puisqu'elles sont définies de cette manière par défaut.

Remarque : Le cryptage des données, n'est pas sans poser quelques soucis au niveau de Netfilter, puisque le suivi de connexion ftp n'est alors plus capable de distinguer les connexions sur le data channel créer à la suite d'une connexion sur le control channel. De ce fait, la connexion du client vers le serveur pour établir le data channel n'est plus reconnu comme étant dans l'état RELATED mais NEW.

4  Remarques

L'utilisation d'une base Berkeley est utile si l'on ne veut pas installer de base de données comme mysql et que le nombre d'utilisateurs reste limité.
Si vous vouler mettre en place une base Mysql pour faciliter l'administration de votre service FTP, la configuration ne change pas fondamentalement. En effet, seules quelques modifications dans la configuration PAM associée au service vsftp sont nécessaires en supposant que vous ayez déjà une base mysql de créée.

Le module PAM à utiliser n'est plus pam-userdb [1] mais pam-mysql [2].Un HowTo existe déjà sur ce sujet. [3]
Cependant, il y a encore mieux, l'utilisation de Vsftpd/LDAP (à venir).

5  Liens et Ressources