vsftpd est un serveur FTP stable, sécurisé et rapide.
Nous allons l'installer et le configurer ainsi :
Quatre scénarios illustreront les possibilités.
Le protocole ftp en lui même n'est pas sûr !
L'échange du nom d'utilisateur et du mot de passe transite en clair sur le réseau.
N'utilisez pas via ftp un compte qui a les droits sudo !
Nous supposons que le serveur sera sur le disque $DISQUE=/srv/www
...@...:~$ sudo apt update
...@...:~$ sudo apt install vsftpd db-util ftp
Le service ftp démarre automatiquement après l'installation.
...@...:~$ ftp localhost Connected to localhost. 220 (vsFTPd 3.0.3)Name (localhost:pi): 331 Please specify the password. Password:230 Login successful. Remote system type is UNIX. Using binary mode to transfer files.ftp> ls 200 PORT command successful. Consider using PASV. 150 Here comes the directory listing. ... drwxr-xr-x 8 1000 1000 4096 Aug 01 21:59 Documents ... 226 Directory send OK. ftp> bye221 Goodbye....@...:~$
...@...:~$ cat /etc/passwd | grep ftp ftp:x:117:124:ftp daemon,,,:/srv/ftp:/usr/sbin/nologin
...@...:~$ sudo groupadd ftp
...@...:~$ sudo usermod -d <disque>/ftp ftp
...@...:~$ cat /etc/passwd | grep www-data www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
Le fichier de configuration du serveur est /etc/vsftpd.conf : Le fichier de configuration de vsftpd. Voir la page de man Page de man vsftpd.conf
Explication des options :
...@...:~$ sudo mkdir -p /etc/vsftpd/user_conf ...@...:~$ sudo touch /etc/vsftpd/user_list
...@...:~$ sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.dist ...@...:~$ sudo cp /etc/pam.d/vsftpd /etc/pam.d/vsftpd.dist
Pour revenir au départ en cas de problème, il suffira de faire l'inverse :
...@...:~$ sudo cp /etc/vsftpd.conf.dist /etc/vsftpd.conf ...@...:~$ sudo cp /etc/pam.d/vsftpd.dist /etc/pam.d/vsftpd
...@...:~$ sudo mkdir -p <DISQUE>/srv/ftp
<DISQUE>/srv /srv none bind 0 0
...@...:~$ sudo mount /srv
Éditez avec les droits d'administration le fichier /etc/vsftpd.conf pour ajouter à la fin les commandes suivantes.
Nous plaçons à la fin du fichier /etc/vsftpd.conf nos réglages par défaut :
... ########## Paramètres personnalisés ########## ftpd_banner=Bienvenue sur le serveur FTP de ... # un message apparaît chaque fois # qu'un utilisateur ouvre un répertoire avec un fichier .message dirmessage_enable=YES # heure locale de l'ordinateur au lieu de l'heure GMT use_localtime=YES # Nombre maximum de connexions simultanées # Au-delà, les nouveaux clients recevront un message du genre : # "erreur: serveur occupé" max_clients=200 # Nombre maximum de connexions venant de la même IP max_per_ip=4 # journalisation des transferts xferlog_enable=YES
# Activation des utilisateurs virtuels guest_enable=YES # nom de l'utilisateur (ftp) sous lequel ils vont fonctionner # tous les utilisateurs virtuels -> utilisateur ftp avec son home /srv/ftp ftp_username=ftp guest_username=ftp nopriv_user=ftp # Fichier de config PAM pam_service_name=vsftpd
# Pas d'accès anonyme, que des utilisateurs locaux # (dont les utilisateurs virtuels, mappés sur un utilisateur local) # les vrais utilisateurs locaux sont désactivés avec le fichier user_list anonymous_enable=NO local_enable=YES # On refuse les utilisateurs du fichier /etc/vsftpd.user_list # un utilisateur par ligne userlist_enable=YES userlist_deny=NO userlist_file=/etc/vsftpd/user_list # Les utilisateurs locaux restent chez eux chroot_local_user=YES allow_writeable_chroot=YES
# Interdiction de toute action d'écriture : # On spécifiera les droits utilisateur par utilisateur. write_enable=NO anon_mkdir_write_enable=NO anon_other_write_enable=NO anon_upload_enable=NO anon_world_readable_only=NO # droits par défaut des fichiers uploadés anon_umask=002 # Autoriser les utilisateurs locaux # à changer les permissions des fichiers chmod_enable=YES virtual_use_local_privs=YES # On n’autorise pas les utilisateurs à se faire passer pour d’autres chown_uploads=NO chown_username=nobody # Cacher les informations sur le propriétaire des fichiers (utilisateur et groupe) hide_ids=YES # Activation de la configuration utilisateur par utilisateur user_config_dir=/etc/vsftpd/user_conf
rsa_cert_file=/etc/ssl/private/vsftpd.pem rsa_private_key_file=/etc/ssl/private/vsftpd.pem ssl_enable=YES
après avoir créé la clé privée de 2048 bits et le certificat autosigné valable 10 ans (la clé privée et le certificat sont enregistrés dans un même fichier) :
...@...:~$ sudo openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /etc/ssl/private/vsftpd.pem -out /etc/ssl/private/vsftpd.pem
Nous allons créer trois utilisateurs virtuels :
admin MotDePasseAdmin user MotDePasseUser admiweb MotDePasseAdmiweb
N'oubliez pas une ligne vide à la fin.
...@...:~$ sudo db_load -T -t hash -f /etc/vsftpd/login.txt /etc/vsftpd/login.db
...@...:~$ sudo chmod 600 /etc/vsftpd/login.*
Pour ajouter, modifier ou supprimer un utilisateur il faut éditer le fichier login.txt puis relancer la création de la base avec la commande du paragraphe 2.
auth required pam_userdb.so db=/etc/vsftpd/login account required pam_userdb.so db=/etc/vsftpd/login
...@...:~$ sudo systemctl restart vsftpd.service
...@...:~$ ftp localhost Connected to localhost. 220 Bienvenue sur le serveur FTP de xxxName (localhost:pi): 331 Please specify the password. Password:530 Login incorrect. Login failed.ftp> bye221 Goodbye.
ftp localhost Connected to localhost. 220 Bienvenue sur le serveur FTP de xxxName (localhost:pi): admiweb 331 Please specify the password. Password:230 Login successful. Remote system type is UNIX. Using binary mode to transfer files.ftp> bye221 Goodbye.
Deux scripts pour se faciliter la vie
#!/bin/sh if [ $# = "2" ]; then rm -f $2 db_load -T -t hash -f /etc/vsftpd/$1 /etc/vsftpd/$2 chmod 600 /etc/vsftpd/login.* echo "Base créée" lignes=$(cat $1) nb=1 for ligne in $lignes do if [ $(($nb%2)) -ne 0 ]; then if [ ! -e /etc/vsftpd/user_conf/$ligne ]; then touch /etc/vsftpd/user_conf/$ligne echo "fichier /etc/vsftpd/user_conf/$ligne créé" fi fi nb=$(($nb+1)) done else echo "Il faut donner le fichier d’entrée et le fichier de sortie" fi
Rendez-le exécutable (à ne faire que la première fois) :
...@...:~$ sudo chmod +x ~/bin/txt2db.sh
Utilisation (le script est supposé résider en ~/bin/) :
...@...:~$ cd ~/bin ...@...:~$ sudo ./txt2db.sh login.txt login.db
Ce script lit les lignes du login.txt ; pour chaque login, il vérifie si un fichier de configuration existe. Si ce n'est pas le cas il en crée un vide.
Auparavant il génère le fichier db.
fichiers=$(ls /etc/vsftpd/user_conf) users="" lignes=$(cat /etc/vsftpd/login.txt) nb=1 for ligne in $lignes do if [ $(($nb%2)) -ne 0 ]; then users="$users $ligne" fi nb=$(($nb+1)) done for conf in $fichiers do found=0 for user in $users do if [ $conf = $user ]; then found="1" fi done if [ $found != "1" ]; then rm -f /etc/vsftpd/user_conf/$conf echo "Fichier /etc/vsftpd/user_conf/$conf supprimé" fi done
Rendez-le exécutable (à ne faire que la première fois) :
...@...:~$ sudo chmod +x ~/bin/cleanconf.sh
Utilisation (le script est supposé résider en ~/bin/) :
...@...:~$ cd ~/bin ...@...:~$ sudo ./cleanconf.sh
Par défaut les utilisateurs virtuels n'ont aucun droit.
Il faut donc les définir pour chacun d'entre eux en créant dans le dossier /etc/vsftpd/user_conf un fichier de configuration pour chaque utilisateur (du même nom que le login de l'utilisateur auquel il fait référence).
Chaque fichier contient des paramètres (les mêmes que ceux de vsftpd.conf) qui remplaceront ceux de vsftpd.conf.
Généralement, on y modifie le “local_root” et les droits d'écriture.
Voici quelques exemples.
# Racine local_root=/srv # Lecture autorisée download_enable=YES anon_world_readable_only=NO # Écriture autorisée write_enable=YES anon_upload_enable=YES anon_mkdir_write_enable=YES # Renommage et suppression autorisés anon_other_write_enable=YES # changement des droits autorisé chmod_enable=YES virtual_use_local_privs=YES # Définit à qui appartiendront les fichiers téléversés guest_username=pi # Affichage des fichiers cachés # (important pour les fichiers htaccess) force_dot_files=YES # masque local (002 -> droits 775) local_umask=002 anon_umask=002
Cet utilisateur aura presque tous les droits et accédera au répertoire /srv et à tous ses sous-répertoires.
# Racine local_root=/srv/www/html # Lecture autorisée download_enable=YES anon_world_readable_only=NO # Écriture (upload) autorisée write_enable=YES anon_upload_enable=YES anon_mkdir_write_enable=YES # Renommage et suppression autorisés anon_other_write_enable=YES # changement des droits autorisé chmod_enable=YES virtual_use_local_privs=YES # Définit à qui appartiendront les fichiers téléversés guest_username=www-data chown_uploads=YES chown_username=www-data # Affichage des fichiers cachés # (important pour les fichiers htaccess) force_dot_files=YES # masque local (002 -> droits 775) file_open_mode=0777 local_umask=002 anon_umask=002
Cet utilisateur aura presque tous les droits et accédera au répertoire /srv/www/html et à tous ses sous-répertoires sous le nom www-data
...@...:~$ sudo mkdir -p <DISQUE>/srv/ftp/user
local_root=/srv/ftp/user
Cet utilisateur ne pourra que télécharger et sera enfermé dans le répertoire /srv/ftp/user (qui doit exister).
## l'utilisateur est enfermé dans un dossier déterminé # en commentant cette ligne, on autorise tout le site #local_root=adminftp ## droit de lecture(download) anon_world_readable_only=NO ## droit d'écriture(upload) write_enable=YES anon_upload_enable=YES ## créer des dossiers anon_mkdir_write_enable=YES ## droit de renommer, supprimer... anon_other_write_enable=YES ## pour gérer le chmod de l'utilisateur ## activer l'option #virtual_use_local_privs=YES ## définir l'option local_umask #local_umask=022 #anon_umask=022 write_enable=YES anon_upload_enable=YES
adminftp aura accès au répertoire ~ftp et à ses sous-répertoires avec tous les droits ; il ne pourra pas remonter au-dessus de ~ftp qui apparaîtra comme la racine ”/”
Redémarrez le serveur pour valider les modifications :
...@...:~$ sudo systemctl restart vsftpd.service
...@...:~$ ftp localhost Connected to localhost. 220 Bienvenue sur le serveur FTP de framboise 4.Name (localhost:pi): admin 331 Please specify the password. Password:230 Login successful. Remote system type is UNIX. Using binary mode to transfer files.ftp> bye221 Goodbye.
...@...:~$ ftp localhost Connected to localhost. 220 Bienvenue sur le serveur FTP de framboise 4.Name (localhost:pi): admiweb 331 Please specify the password. Password:230 Login successful. Remote system type is UNIX. Using binary mode to transfer files.ftp> bye221 Goodbye.
...@...:~$ ftp localhost Connected to localhost. 220 Bienvenue sur le serveur FTP de framboise 4.Name (localhost:pi): user 331 Please specify the password. Password:230 Login successful. Remote system type is UNIX. Using binary mode to transfer files.ftp> bye221 Goodbye.
...@...:~$ ftp localhost ...Name (localhost:pi): 331 Please specify the password. Password: 530 Login incorrect. Login failed.ftp> bye221 Goodbye.
Voir la page Vsftpd : cinq exemples de configuration
Via systemctl :
...@...:~$ sudo systemctl COMMANDE vsftpd
Valeurs de COMMANDE :
On peut aussi cocher la case pour créer un signet en le nommant.
On se retrouve avec un dossier distant dans lequel on peut naviguer.
Ne pas oublier de se déconnecter (démonter)
Désormais, on peut se connecter directement sur le serveur FTP, en :
$ sudo apt-get remove vsftpd
...@...:~$ sudo apt remove --purge vsftpd db-util ...@...:~$ sudo mv /etc/vsftpd.conf.dist /etc/vsftpd.conf ...@...:~$ sudo mv /etc/pam.d/vsftpd.dist /etc/pam.d/vsftpd
La remise à plat supprime définitivement des données de votre disque dur !
Si vous n'êtes pas sûr de vous, la désinstallation partielle est préférable.