Principes appliqués :
Ici, le serveur est supposé se trouver sur l'emplacement $DISQUE=/srv/www
Le protocole ftp n'est pas sûr ! L'échange du nom d'utilisateur et du mot de passe transite en clair sur le réseau.
Ne pas utiliser via ftp un compte qui a les droits sudo !
~$ sudo apt install {vsftpd,db-util,ftp}
Le service ftp démarre automatiquement après l'installation.
~$ ftp chateau.parc Connected to chateau.parc. 220 (vsFTPd 3.0.5)Name (chateau.parc:nicolas): 331 Please specify the password. Password:230 Login successful. Remote system type is UNIX. Using binary mode to transfer files.ftp> bye221 Goodbye.
Avec la configuration d'origine,
~$ cat /etc/passwd | grep ftp ftp:x:132:141:ftp daemon,,,:/srv/ftp:/usr/sbin/nologin
~$ sudo groupadd ftp
...@...:~$ sudo usermod -d /srv/www ftp
...@...:~$ cat /etc/passwd | grep www-data www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
~$ 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/www ~$ sudo mkdir /var/www
<DISQUE>/srv /srv none bind 0 0
~$ sudo mount /srv ~$ sudo mount /var/www
~$ sudo openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /etc/ssl/private/vsftpd.pem -out /etc/ssl/private/vsftpd.pem (...) You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. -----Country Name (2 letter code) [AU]:FR State or Province Name (full name) [Some-State]: Locality Name (eg, city) []: Organization Name (eg, company) [Internet Widgits Pty Ltd]: Organizational Unit Name (eg, section) []: Common Name (e.g. server FQDN or YOUR name) []: Email Address []:nicolas@nfrappe.fr
(...) ############################ # Paramètres personnalisés # ############################ ########## Paramètres généraux ########## ftpd_banner=Bienvenue sur le serveur FTP de chateau.parc # 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 ########## Utilisateurs virtuels ########## # Activation des utilisateurs virtuels guest_enable=YES # nom de l'utilisateur (www-data) sous lequel ils vont fonctionner # tous les utilisateurs virtuels -> utilisateur ftp avec son home /srv/ftp ftp_username=www-data guest_username=www-data nopriv_user=www-data # Fichier de config PAM pam_service_name=vsftpd ########## Connexion et contrôle d'accès ########## # 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 ########## Permissions ########## # 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 ########## Sécurisation des transmissions avec SSL/TLS ########## rsa_cert_file=/etc/ssl/private/vsftpd.pem rsa_private_key_file=/etc/ssl/private/vsftpd.pem ssl_enable=YES
Nous allons créer trois utilisateurs virtuels :
~$ sudo touch /etc/vsftpd/login.txt
admin Epp48Arf user Epp48Arf admiweb Epp48Arf
Il faut 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 chateau.parc Connected to chateau.parc. 220 Bienvenue sur le serveur FTP de chateau.parc Name (chateau.parc:nicolas): 331 Please specify the password.Password:530 Login incorrect. ftp: Login failedftp> bye221 Goodbye.
~$ ftp chateau.parc Connected to chateau.parc. 220 Bienvenue sur le serveur FTP de chateau.parc Name (chateau.parc:nicolas): admiweb 331 Please specify the password.Password:230 Login successful. Remote system type is UNIX. Using binary mode to transfer files.ftp> bye221 Goodbye.
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.
Attention : pas de blanc en fin de ligne (sinon erreur de syntaxe)
~$ sudo touch /etc/vsftpd/user_conf/admin
# 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=nicolas # 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
~$ sudo touch /etc/vsftpd/user_conf/admiweb
# Racine local_root=/var/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
~$ sudo mkdir -p <DISQUE>/srv/ftp/user
~$ sudo touch /etc/vsftpd/user_conf/user
local_root=/srv/ftp/user
~$ sudo touch /etc/vsftpd/user_conf/adminftp
## 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
~$ sudo systemctl restart vsftpd.service