Mise en place d'un serveur FTP cloisonné

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 /  :

 

Image

 

 

Un exemple avec des comptes chrootés. L'utilisateur n'a accès qu'à son répertoire.

Image

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

Catégorie
Tag