Jail VsFTPd

La première chose à faire est de créer le répertoire sur lequel seront montées les données des sites et d’éditer /etc/fstab.ftp pour que ce soit le cas.

mkdir -p /home/jails/ftp/home/http echo “/home/http /home/jails/ftp/home/http nullfs rw 1 1” » /etc/fstab.ftp

Il suffira alors de redémarrer ezjail pour prendre ces changements en compte ou de monter le répertoire à la main en attendant :

mount_nullfs /home/http /home/jails/ftp/home/http

Pour éviter une erreur du type 500 OOPS: vsftpd: not found: directory given in 'secure_chroot_dir':/usr/share/empty, on crée le répertoire /usr/share/empty.

mkdir -p /home/jails/basejail/usr/share/empty

Une fois l’environnement créé, on peut se rendre dans la jail et commencer l’installation.

jexec ftp csh

Commençons par installer VsFTPd, personnellement j’ai sélectionnée l’option VSFTPD_SSL.

cd /usr/ports/ftp/vsftpd make install clean

On crée le fichier de démarrage /etc/rc.conf afin d’y ajouter le démarrage de VsFTPd.

echo ‘vsftpd_enable=“YES”’ > /etc/rc.conf

On crée le certificat SSL.

openssl req -new -x509 -days 3650 -nodes -out /usr/local/etc/vsftpd.pem -keyout /usr/local/etc/vsftpd.pem

On passe ensuite à la configuration de VsFTPd.

listen=YES background=YES

anonymous_enable=NO local_enable=YES guest_enable=YES guest_username=www

user_config_dir=/usr/local/etc/vsftpd local_root=/home/http/$USER user_sub_token=$USER chroot_local_user=YES hide_ids=YES

write_enable=YES allow_writeable_chroot=YES virtual_use_local_privs=YES

ssl_enable=YES rsa_cert_file=/usr/local/etc/vsftpd.pem force_local_data_ssl=NO force_local_logins_ssl=NO

Une explication s’impose quant au choix de cette configuration.
J’essaie généralement de trouver la configuration la plus simple à utiliser et à mettre en œuvre (sans backend, par exemple), la configuration d’Nginx en est un parfait exemple puisqu’il suffit de créer un répertoire au bon endroit pour que le serveur en serve le contenu. Ici, cependant, une étape supplémentaire peut-être nécessaire afin de s’assurer que www soit le seul propriétaire des données contenues dans /home/http.
Pour résumer, le seul moyen d’attribuer un utilisateur unique à tous les comptes ftp est d’utiliser l’option guest_username, seulement cela implique d’utiliser l’option guest_enable qui (en gros) active l’utilisation des utilisateurs virtuels, et mets au passage au même plan les utilisateurs virtuels et locaux. Ainsi, par exemple, si l’on veut une racine qui diffère du nom d’utilisateur (ce qui serait simplement le répertoire home de l’utilisateur, si l’on utilisait pas d’utilisateur virtuel), on est obligé d’utiliser un fichier de configuration par utilisateur.

Pour créer un utilisateur FTP, il faut donc avant toute chose créer le répertoire qui acceuillera les configurations spécifiques des utilisateurs.

mkdir /usr/local/etc/vsftpd

On crée ensuite un utilisateur local…

pw useradd user -g www -s /usr/sbin/nologin

…on lui attribue un mot de passe…

passwd user

…et on précise, si nécessaire, sa racine dans un fichier éponyme.

local_root=/home/http/user

Il peut être, par ailleurs, intéressant de savoir que les modifications apportées aux comptes locaux ou aux fichiers de configuration des utilisateurs sont prises en compte dès leur écriture.

De plus, l’utilisateur local attribué aux utilisateurs virtuels doit avoir la racine des répertoires de ceux-ci pour répertoire home, il faut donc modifier le compte de www de façon à ce que son répertoire home soit /home/http.

pw usermod www -d /home/http

On a donc désormais un serveur qui refuse les sessions annonymes, exige un compte local, limite l’utilisateur à son répertoire personnel sur lequel il a les droits de lecture et d’écriture et qui permet (mais n’impose pas) aux utilisateurs de se connecter via FTPS (pour peu que le client supporte facilement les certificats self-signed).
Il ne reste alors plus qu’à le lancer,

/usr/local/etc/rc.d/vsftpd start

et à quitter la jail.

exit

Petite aparté

Lorsqu’un problème se produit dans la configuration, il n’y a souvent rien de simple ni de documenté et personne pour répondre sur le canal IRC de VsFTPd. Il m’a fallu deux jours pour découvrir que l’utilisateur local attribué aux utilisateurs virtuels doit avoir la racine des répertoires de ceux-ci pour répertoire home, sans quoi VsFTPd retourne le message 500 OOPS: cannot change directory: juste après avoir validé l’authentification.