Depuis quelques temps, j'utilise un logiciel pour effectuer des sauvegardes complètes de mon ordinateur Windows. Pour que les sauvegardes soient utiles, il est nécessaire qu'elles soient mises à jour souvent (sauvegarde incrémentielle ou différentielle par exemple).
Mais un problème de taille (et c'est le cas de le dire !) se pose rapidement. La sauvegarde complète pèse 130 gigas environ, sans compter les futures sauvegardes.
Or, mon logiciel me permet de chiffrer les fichiers de sauvegarde et de les envoyer sur un serveur distant en utilisant le protocole FTP.
J'ai un serveur dédié, il faut en profiter ! Mais attention, l'utilisateur qui permettra à mon logiciel de se connecter en FTP ne doit pas pouvoir accéder aux autres fichiers de mon serveur, ni pouvoir se connecter en SSH.

Les ingrédients

  • VsFTPd[C']est un serveur FTP conçu avec la problématique d'une sécurité maximale. Contrairement aux autres serveurs FTP (ProFTPd, PureFTPd, etc.), aucune faille majeure de sécurité n'a jamais été décelée dans VsFTPd » .)
  • Un accès sur votre serveur cible
  • Un client ftp sur une autre machine
  • 10 minutes de votre temps

Les manipulations

Création de l'utilisateur

Le but ici, est de créer un nouvel utilisateur local sur le serveur, mais qui n'aura pas d'accès à un shell. Ainsi, on se protège de toute connexion non autorisée en SSH et des problèmes de sécurité que cela pourrait engendrer.

On passe en super user pour faciliter et accélérer les différentes commandes. Puis on crée l'utilisateur ftp_user avec son répertoire /home/ftp_user.

louis@louis $ sudo su  
root@louis $ useradd ftp_user -d /home/ftp_user  
root@louis $ passwd ftp_user  
Changing password for user ftp_user.  
New UNIX password: ********  
Retype new UNIX password: ********  

On ajoute dans /etc/shells un shell nommé false qui sera utilisé lors de la connexion de notre nouvel utilisateur.

root@louis $ sudo -e /etc/shells  
/bin/false          # On ajoute cette ligne au fichier

Puis on l'applique à notre utilisateur.

root@louis $ usermod -s /bin/false ftp_user  

Configuration de VsFTPd

S'il n'est pas encore installé, on fait comme d'habitude : sudo apt-get install vsftpd.
Le fichier de configuration est /etc/vsftpd.conf. Nous allons le modifier légèrement pour affiner les réglages de base.

# Listen reste à NO, qui est sa valeur par défaut.
listen=NO

# Bien sûr, on désactive les connexions anonymes
anonymous_enable=NO

# On autorise les utilisateurs locaux à se connecter en FTP
local_enable=YES

# On autorise l'écriture
write_enable=YES

# Activer les logs d'Upload / Download
xferlog_enable=YES

# Chemin des logs
xferlog_file=/var/log/vsftpd.log

# On définit le format
xferlog_std_format=NO

# Bannière d'accueil, à customiser au non
ftpd_banner=All connections to this FTP server are monitored and recorded !

# Chaque utilisateur est chrooté via le fichier de configuration définit plus bas
chroot_local_user=NO

# On met en place une liste contenant les utilisateurs qui seront chrootés
chroot_list_enable=YES

# Le chemin vers la liste
chroot_list_file=/etc/vsftpd/chroot_list

# On autorise l'écriture
allow_writeable_chroot=YES

# Enfin, on définit des listes d'utilisateurs
userlist_enable=YES  
userlist_file=/etc/vsftpd.userlist  
userlist_deny=NO  

On crée les différents fichiers nécessaires.

root@louis $ touch /var/log/vsftpd.log  
root@louis $ chown louis:louis /var/log/vsftpd.log  
root@louis $ mkdir /etc/vsftpd/  
root@louis $ vim /etc/vsftpd/chroot_list  
ftp_user      # Ligne ajouté au fichier  
root@louis $ vim /etc/vsftpd.userlist  
ftp_user      # Ligne ajouté au fichier  

Enfin, on redémarre le service : service vsftpd restart. Le serveur est fonctionnel, tous les utilisateurs locaux peuvent accéder au FTP, mais ftp_user ne pourra pas sortir de son dossier personnel.
Vous pouvez aussi essayer de vous connecter en SSH avec ftp_user, vous ne pourrez pas !

Bonus : Binder un répertoire

Vous l'aurez compris, l'utilisateur ftp_user ne pourra pas avoir accès aux autres dossiers et fichiers du serveur. Pour lui permettre d'accéder à un dossier précis, il est possible de binder un dossier. Cela créera en quelque sorte un raccourci vers ce dossier dans son répertoire personnel.

root@louis $ mount --bind /home/louis/backup/data/ /home/ftp_user/data  

Et pour que ce lien reste, même après un redémarrage du serveur :

root@louis $ vim /etc/fstab  
/home/louis/backup/data/     /home/ftp_user/data     none     bind     0     0     # On ajoute cette ligne

Source principale de ce tutoriel. Source de l'illustration.