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.