Comme le dit Wikipedia, chroot (change root) est une commande des systèmes d'exploitation UNIX permettant de changer le répertoire racine d'un processus de la machine hôte. Ceci est un bon moyen de cloisonner les utilisateurs sur une machine, en les isolant, sans leur permettre d'avoir accès à toute l'arborescence. C'est généralement ce qui est utilisé, par exemple, sur les hébergements mutualisés pour les accès ftp.
Un exemple sans le chroot. L'utilisateur a accès à toute l'arborescence, depuis / :
Un exemple avec des comptes chrootés. L'utilisateur n'a accès qu'à son répertoire.
Nous allons voir dans cet article comment mettre cela en place, avec 2 serveurs ftp différents :
Le principe est le suivant :
- on va créer pour chaque connexion un utilisateur, qui n'aura pas accès au shell
- on met en place un serveur FTP
- on paramètre ce serveur FTP pour chrooter toutes les connexions
Création d'utilisateur
Pour simplifier les opérations, on va définir le dossier personnel comme étant le dossier utilisé comme DocumentRoot du serveur http.
Ceci permet également de distinguer facilement les "vrais" utilisateurs des utilisateurs ftp.
Par exemple, pour un utilisateur lambda :
sudo useradd -d /var/www/users/lambda -s /usr/sbin/nologin lambda sudo passwd lambda
A ce stade, on peut vérifier que la connexion par ssh avec l'utilisateur ne fonctionne pas :
ssh lambda@10.0.3.87 lambda@10.0.3.87's password: Linux debian7-w2_6akt4 3.13.0-44-generic #73-Ubuntu SMP Tue Dec 16 00:22:43 UTC 2014 x86_64 The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. This account is currently not available. Connection to 10.0.3.87 closed.
L'utilisateur existe, son mot de passe est valide, mais son compte n'est pas valable.
Il faut maintenant lui donner accès par FTP.
On n'oublie pas non plus de modifier le fichier /etc/shells
:
echo '/usr/sbin/nologin' >> /etc/shells
Cette ligne est nécessaire car, comme l'indique la FAQ : le shell assigné à l'utilisateur doit être listé dans le fichier /etc/shells
.
Si le shell n'est pas déclaré dans ce fichier, la connexion ne fonctionne pas, et on a un message 530 Login authentication failed :
Name (10.0.3.87:me): lambda 331 User lambda OK. Password required Password: 530 Login authentication failed Login failed. Remote system type is UNIX. Using binary mode to transfer files.
Avec vsftpd
Installation
apt-get install vsftpd
Paramétrage
Le paramétrage se fait dans le fichier /etc/vsftpd.conf
. On va modifier 4 lignes :
# pas d'accès anonyme anonymous_enable=NO # autorise les comptes locaux (dans /etc/passwd) local_enable=YES # autorise l'écriture dans les répertoires write_enable=YES # cloisonne les utilisateurs chroot_local_user=YES
Puis on redémarre le service :
/etc/init.d/vsftpd restart Stopping FTP server: vsftpd. Starting FTP server: vsftpd
Spécificité de vsftpd concernant le répertoire utilisateur
Avec vsftpd, il est nécessaire que le répertoire de l'utilisateur existe, mais que ce dernier soit en lecture seule. Du coup, l'utilisateur ne pourra pas charger de fichier à la racine. Il faut donc alors créer un sous-répertoire dans lequel il aura les droits. Par exemple :
tree users users : dr-xr-xr-x root root └── lambda : dr-xr-xr-x lambda:lambda └── web : drwxr-xr-x lambda lambda
On verra plus loin qu'avec pure-ftpd, il existe une option permettant de créer le répertoire à la première connexion de l'utilisateur.
Avec pure-ftpd
Installation
L'installation est également très simple.
apt-get install pure-ftpd
Paramétrage
Par défaut, l'accès via un compte Unix n'est pas autorisé :
# cat /etc/pure-ftpd/conf/UnixAuthentication no
Le paramétrage se fait dans plusieurs fichiers, présents dans le répertoire /etc/pure-ftpd/conf
echo "yes" > /etc/pure-ftpd/conf/ChrootEveryone echo "yes" > /etc/pure-ftpd/conf/CreateHomeDir echo "yes" > /etc/pure-ftpd/conf/UnixAuthentication echo "no" > /etc/pure-ftpd/conf/PAMAuthentication
Les commandes permettent de chrooter tous les utilisateurs, créer le Home Dir s'il n'existe pas, autoriser l'authentification Unix (via le fichier /etc/passwd) et ne pas autoriser l'authentification PAM.
Puis on redémarre le service :
/etc/init.d/pure-ftpd restart
A ce stade, les utilisateurs sont restreints à leur répertoire. Ils ne peuvent pas aller voir ce qui se passe ailleurs...
Conclusion
Personnellement, je trouve que pure-ftpd est plus simple à mettre en oeuvre, tout en offrant plus de fonctionnalités : comptes virtuels, quota, etc.
Pure-ftpd vient avec plusieurs programmes annexes, dont pure-pw
qui permet de gérer les comptes virtuels.
Par exemple, pour créer un compte virtuel :
# mkdir /var/www/users/virtuser # chown ftpuser:ftpgroup /var/www/users/virtuser # pure-pw useradd virtuser -u ftpuser -g ftpgroup -d /var/www/users/virtuser Password: Enter it again: # cd /etc/pure-ftpd # Creation du fichier de comptes / Mots de passe # pure-pw mkdb # ln -s /etc/pure-ftpd/conf/PureDB /etc/pure-ftpd/auth/50puredb # service pure-ftpd restart
Attention : à chaque fois qu'on ajoute un compte ou qu'on modifie un mot de passe, il faut relancer la commande pure-pw mkdb
Note : on peut mélanger des comptes virtuels et des comptes Linux, si on laisse UnixAuthentication = yes
.
Le wiki Fedora est assez détaillé sur le paramétrage de pure-ftpd : http://doc.fedora-fr.org/wiki/PureFTPD_:_Installation_et_configuration