{{tag> Precise tutoriel vsftpd}}
----------------
====== VSFTPD multi-utilisateurs multi-dossiers avec DB ou MYSQL. ======
vsftpd est un deamon FTP très léger, rapide et sécurisé.
Il peut gérer des services FTP de tous types, il est relativement simple à configurer, mais il manque cruellement de documentation et d'exemple.
Voici un petit tutoriel qui vous permettra de monter rapidement votre service FTP en local ou sur votre serveur dédié.
Vous y trouverez deux possibilités pour la gestions de vos utilisateurs, suivant vos préférences avec un simple fichier DB (Berkeley db) ou avec une base mySQL qui offre plus de souplesse et de possibilité.
Ce tuto suppose que avez un minimum de connaissance en ligne de commande, mais il est suffisamment détaillé pour un débutant.
Il a été réalisé sous Ubuntu 12.04, mais peut s'adapter aux versions précédentes.
Pour réaliser cette installation, il ne vous faudra pas plus de 10 minutes.
===== Pré-requis =====
* Disposer des droits d'administration
* Savoir utiliser un terminal
* Avoir installé le paquet vsftpd
Commencez par ouvrir votre fenêtre de terminal (ctrl-alt-t)
Passez en utilisateur « root » pour éviter d'ajouter sudo à toutes les commandes.
sudo -i
Si vous n'avez pas encore installé vsftpd tapez :
apt-get install vsftpd
===== Configuration =====
Commencez par créer un fichier de configuration pour vsftpd, si ce fichier existe déjà renommez le :
mv /etc/vsftpd.conf /etc/vsftpd.old
Puis créez un nouveau fichier de configuration :
touch /etc/vsftpd.conf
Editez ce fichier avec votre éditeur favori, ici avec nano :
nano /etc/vsftpd.conf
Insérez ce contenu (copier/coller), quelques commentaires vous permettent de l'adapter suivant vos préférences, et vous trouverez des références à cette configuration dans les chapitres suivants.
# ftp server
#####################
listen=YES
# port par défaut du FTP
listen_port=21
# nom du service d'authentification
pam_service_name=vsftpd
# pour le mode passif (firewall)
pasv_min_port=30000
pasv_max_port=30999
#
#
# anonymous user
#####################
anonymous_enable=NO
anon_upload_enable=NO
anon_mkdir_write_enable=NO
anon_other_write_enable=NO
#
#
# general user
#####################
local_enable=YES
local_umask= 022
write_enable=YES
chroot_local_user=YES
# pour user admin (déconseillé)
# chroot_list_enable=YES
#
#
# virtual user
#####################
guest_enable=YES
guest_username=vsftpd
nopriv_user=vsftpd
virtual_use_local_privs=YES
user_sub_token=$USER
local_root=/ftpzone/$USER
hide_ids=YES
Créez maintenant l'utilisateur local pour VSFTPD, il permet de définir les droits des dossiers, et la racine du système ftp (/ftpzone plutôt que /home/user) . Cet utilisateur n'a pas besoin de shell .
useradd --home /ftpzone --shell /bin/false vsftpd
Le nom d'utilisateur local et le dossier racine peuvent être adaptés, mais vous devrez changer la configuration en conséquence.
//cf. config ://
//guest_username=vsftpd//
//nopriv_user=vsftpd//
//local_root=/ftpzone/$USER//
===== UTILISATEURS VIRTUELS =====
Les utilisateurs virtuels peuvent être gérés de plusieurs façons, je vous en propose deux :
* **3.1 un simple fichier DB (Berkeley db)**
* **3.2 une base mySQL**
Je vous conseille plutôt la version mySQL qui vous permettra par la suite une gestion beaucoup plus souple et évolutive (ajout des quotas, gestion d'utilisateur en http par php, etc...).
Bien sûr il faudra disposer du service mysql installé.
==== Un simple fichier DB (Berkeley db) ====
Le principe est de créer les utilisateurs dans un fichier texte puis de le convertir au format DB.
Créez le fichier d'utilisateurs virtuels et leurs mot de passe (dans /root il ne sera lisible par personne) , les noms d'utilisateur et les mots de passe seront en alternance sur chaque ligne.
touch /root/vsftpd_login.txt
Editez le fichier et définissez deux utilisateurs pour exemple user1et user2, respectivement avec les mots de passe 123456 et 654321.
nano /root/vsftpd_login.txt
Copiez/collez ces 4 lignes :
user1
123456
user2
654321
ATTENTION il est important de ne pas ajouter de retour, ni de ligne supplémentaire après le dernier mot de passe .
Générez ensuite le fichier db dans /etc/vsftpd_login.db :
db_load -T -t hash -f /root/vsftpd_login.txt /etc/vsftpd_login.db
Changez les droits pour le fichier db (securité) :
chmod 600 /etc/vsftpd_login.db
Définissez la config de PAM pour l'authentification , créez le fichier /etc/pam.d/vsftpd :
//cf config : pam_service_name=vsftpd//
touch /etc/pam.d/vsftpd
Éditez ce fichier :
nano /etc/pam.d/vsftpd
Copiez/collez ce contenu :
auth required /lib/x86_64-linux-gnu/security/pam_userdb.so db=/etc/vsftpd_login
account required /lib/x86_64-linux-gnu/security/pam_userdb.so db=/etc/vsftpd_login
**Vos utilisateurs virtuels peuvent maintenant être authentifiés sans être créés comme des utilisateurs locaux.**
==== Une base MySQL ====
Pour créer la base de données vsftpd, il est nécessaire de connaître le mot de passe root (ici les étoiles) de votre installation de mysql ou celui d'un autre utilisateur ayant les droits de création.
Nous utiliserons ici des mots de passe cryptés pour nos utilisateurs virtuels.
Connexion au serveur MySQL
sudo mysql
(Ajoutez //-p// à cette commande si vous utilisez un mot de passe pour le compte //root//.)
Vous entrez alors dans l'invite de commande SQL ou vous pouvez créer une base de données vsftpd associée à un utilisateur MySQL vsftpd, puis créer la table d'utilisateurs FTP et insérer vos deux premiers utilisateurs FTP, pour exemple user1et user2 avec les mots de passe 123456 et 654321 :
N'oubliez pas de changer le mot de passe de l'utilisateur de la base vsftpd en fonction de vos préférences, ici « mot_de_passe ».
CREATE DATABASE vsftpd;
GRANT ALL ON vsftpd.* TO "vsftpd"@"localhost" IDENTIFIED BY 'mot_de_passe';
USE vsftpd;
CREATE TABLE `utilisateurs` (
`username` varchar(64) NOT NULL default '',
`password` varchar(64) NOT NULL default '',
`quota` int(10) NOT NULL default '0',
PRIMARY KEY (username)
) ENGINE=MyISAM COMMENT='Utilisateurs Virtuels pour le ftp';
INSERT INTO `utilisateurs` (`username`,`password`) VALUES ("user1", ENCRYPT("123456"));
INSERT INTO `utilisateurs` (`username`,`password`) VALUES ("user2", ENCRYPT("654321"));
QUIT;
Il vous reste à créer le fichier pour l'identification PAM , et indiquer dans ce fichier comment lire votre base.
Créez le fichier /etc/pam.d/vsftpd :
//cf config : pam_service_name=vsftpd//
touch /etc/pam.d/vsftpd
Éditez ce fichier :
nano /etc/pam.d/vsftpd
Copiez/coller ce contenu :
N'oubliez pas de modifier le mot de passe de l'utilisateur de la base vsftpd en fonction de votre création, ici « mot_de_passe».
auth required pam_mysql.so user=vsftpd passwd=mot_de_passe host=127.0.0.1 db=vsftpd table=utilisateurs usercolumn=username passwdcolumn=password crypt=1
account required pam_mysql.so user=vsftpd passwd=mot_de_passe host=127.0.0.1 db=vsftpd table=utilisateurs usercolumn=username passwdcolumn=password crypt=1
**Vos utilisateurs virtuels peuvent maintenant être authentifiés sans être créés comme des utilisateurs locaux.**
===== Dossiers des utilisateurs virtuels =====
Nous définissons ici le dossier racine du FTP /ftpzone, mais vous devez l'adapter suivant le home de votre utilisateur principal et modifier la configuration en conséquence.
//cf. config : virtual_use_local_privs=YES ; user_sub_token=$USER ; local_root=/ftpzone/$USER//
Pour fonctionner dans ce mode, vsftpd attend :
- un dossier racine (jail) pour chaque utilisateur sans droit d'écriture
- un ou plusieurs sous-dossiers pour chaque utilisateur avec droit d'écriture, dans notre exemple le sous dossier sera nommé « upload ».
Création des dossiers et sous-dossiers :
mkdir /ftpzone
mkdir /ftpzone/user1
mkdir /ftpzone/user1/upload
mkdir /ftpzone/user2
mkdir /ftpzone/user2/upload
Définition les droits pour les dossiers des utilisateurs virtuels :
chmod 555 /ftpzone/user1
chmod 775 /ftpzone/user1/upload
chmod 555 /ftpzone/user2
chmod 775 /ftpzone/user2/upload
Le propriétaire de l'arborescence FTP sera l'utilisateur local « vsftpd » :
chown -R vsftpd:vsftpd /ftpzone
===== Démarrage du service et test. =====
Pour démarrer le service vsftpd on utilisera la commande « service », pour les versions précédentes de ubuntu, on utilisera plutôt /etc/init.d/vsftpd.
Premier démarrage du service vsftpd :
service vsftpd start
Si le service est déjà démarré ou pour toutes modification de la configuration :
service vsftpd restart
Attention si il y a une erreur de configuration, vsftpd n'affiche aucun message, il ne se lance pas alors que la commande affiche néanmoins un id de process.
Pour vérifier que le service est bien démarré et que la configuration est correcte, vérifiez les process (top) ou plus simplement redémarrez le service (restart) et s'il affiche « stop: Unknown instance » s'est qu'il n'a pas été lancé et que vous avez une erreur dans le fichier configuration.
A partir de là le service FTP fonctionne il peut être testé. Dans un premier temps en local en ligne de commande pour vérifier si les logins fonctionnent :
**En gras ce que vous devez taper.**
**ftp 127.0.0.1 21**
Connected to 127.0.0.1.
220 (vsFTPd 2.3.5)
Name (127.0.0.1:xxx):** user1**
331 Please specify the password.
Password: **123456**
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> **quit**
221 Goodbye.
Si la connexion s'est bien déroulée, passez maintenant au test avec votre client ftp favori - ex. Nautilus ou FileZilla
Lorsque vous devez utiliser ce service FTP depuis une autre machine extérieur à votre réseau, ou si vous venez de l'installer sur un serveur dédié, assurez vous que le port défini dans la configuration (par défaut 21) est ouvert dans votre firewall et dans votre passerelle réseau (box).
===== OPTION : Administrateur général =====
Le but est de définir un utilisateur qui pourra accéder aux fichiers de tous les autres , et qui n'aura pas de dossier personnel.
ATTENTION : c'est dangereux pour la sécurité, cet admin pourra remonter l'arborescence générale et voir tous les fichiers autorisés en lecture pour tous les utilisateurs locaux (ex. /etc)
Même si vsftpd permet de le faire, je vous déconseille ce type d'utilisateur, il est préférable de garder votre accès par ssh, ou en utilisateur root local pour accéder à tous les dossiers de vos utilisateurs virtuels.
Le fichier /etc/vsftpd.chroot_list contiendra les utilisateurs qui n'ont pas besoin de dossier et qui pourront parcourir l'arborescence générale.
//cf. config : chroot_list_enable=YES//
Dé-commentez cette ligne dans la config : chroot_list_enable=YES
Créez le fichier /etc/vsftpd.chroot_list :
touch /etc/vsftpd.chroot_list
Éditez ce fichier :
nano /etc/vsftpd.chroot_list
Ajoutez les identifiants d'utilisateurs virtuels autorisés (admin) - 1 par ligne
===== Ajouter des nouveaux utilisateurs =====
Il faut ajouter le nom et le mot de passe de l'utilisateur dans la BD et il faut créer les dossiers du nouvel utilisateur dans la racine /ftpzone sans oublier de définir les droits des dossiers 555 pour l'utilisateur et 755 pour son dossier upload .
Pour cela un petit scripts shell est bien pratique . Je vous décrit ici un script très simple si vous avez choisi le mode DB, et un autre plus complet si vous avez choisi le mode MYSQL.
==== script SH pour DB ====
Ici un script pour ajouter un utilisateur nommé addFTPuser :
touch /root/addFTPuser
nano /root/addFTPuser
Copiez/collez ce contenu :
#!/bin/sh
#################################################################
# ajoute un utilisateur virtuel pour vsftpd // BY ChesterKiK
#################################################################
if [ $# = "2" ] ; then
# ajoute username et mot de passe au fichier texte des logins
echo $1"\n"$2 >> /root/vsftpd_login.txt
# converti le fichier texte en DB
db_load -T -t hash -f /root/vsftpd_login.txt /etc/vsftpd_login.db
# securise le fichier
chmod 600 /etc/vsftpd_login.db
# cree le dossier utilisateur
mkdir /ftpzone/$1
mkdir /ftpzone/$1/upload
# defini les droits et le propriétaire des dossiers utilisateur
chmod 555 /ftpzone/$1
chmod 775 /ftpzone/$1/upload
chown -R vsftpd:vsftpd /ftpzone/$1
# affiche le succés
echo "Utilisateur FTP "$1" ajouté avec succés"
else
echo "Deux arguments attendus (ex: addFTPuser username password)"
fi
Donnez le droit d'execution à votre script :
chmod 750 /root/addFTPuser
Exemple d'utilisation :
/root/addFTPuser user3 456789
==== script SH pour MYSQL ====
Ici un script scripts d'ajout/suppression/modification nommé FTPuser
touch /root/FTPuser
nano /root/FTPuser
Copiez/collez ce contenu :
N'oubliez pas de modifier le mot de passe de la base de donnée (ici XpassftpX).
#!/bin/sh
#################################################################
# gestion des utilisateurs virtuels pour vsftpd // BY CHESTERKIK
#################################################################
if [ $# = "3" ] && [ $1 = "add" ] ; then
# test si l'utilisateur existe
r=$(echo "USE vsftpd;SELECT username FROM utilisateurs WHERE username='$2';" | mysql -u vsftpd --password='XpassftpX')
if [ "$r" = "" ] ; then
# insert l'utilisateur et son mot de passe dans la table utilisateurs
echo "USE vsftpd;INSERT INTO utilisateurs (username,password) VALUES ('$2', ENCRYPT('$3')) ;" | mysql -u vsftpd --password='XpassftpX'
# cree le dossier utilisateur
mkdir /ftpzone/$2
mkdir /ftpzone/$2/upload
# defini les droits et le propriétaire des dossiers utilisateur
chmod 555 /ftpzone/$2
chmod 775 /ftpzone/$2/upload
chown -R vsftpd:vsftpd /ftpzone/$2
# affiche le succés
echo "L'utilisateur FTP $2 a été ajouté"
else
echo "L'utilisateur $2 existe déjà";
fi
elif [ $# = "2" ] && [ $1 = "delete" ] ; then
# test si l'utilisateur existe
r=$(echo "USE vsftpd;SELECT username FROM utilisateurs WHERE username='$2';" | mysql -u vsftpd --password='XpassftpX')
if [ "$r" = "" ] ; then
echo "L'utilisateur $2 est introuvable";
else
echo "Attention! L'utilisateur $2 et tous ses fichiers vont être supprimés."
echo -n "Vous êtes sur (o/N) ? "
read rr
if [ "$rr" = "o" ] || [ "$rr" = "O" ] ; then
# supprime l'utilisateur dans la table
echo "USE vsftpd;DELETE FROM utilisateurs WHERE username='$2';" | mysql -u vsftpd --password='XpassftpX'
# supprime les dossiers
rm -r /ftpzone/$2
# affiche le succés
echo "L'utilisateur FTP $2 a été supprimé"
else
echo "Rien n'a été supprimé"
fi
fi
elif [ $# = "3" ] && [ $1 = "change" ] ; then
# test si l'utilisateur existe
r=$(echo "USE vsftpd;SELECT username FROM utilisateurs WHERE username='$2';" | mysql -u vsftpd --password='XpassftpX')
if [ "$r" = "" ] ; then
echo "L'utilisateur $2 est introuvable";
else
# modifie l'utilisateur dans la table
echo "USE vsftpd;UPDATE utilisateurs SET password=ENCRYPT('$3') WHERE username='$2';" | mysql -u vsftpd --password='XpassftpX'
# affiche le succés
echo "L'utilisateur FTP $2 a été modifié"
fi
else
echo "Arguments attendus, syntax :"
echo " > Ajout, tapez: FTPuser add username password"
echo " > Suppression, tapez: FTPuser delete username"
echo " > Changer le mot de passe, tapez: FTPuser change username password"
fi
Donnez le droit d'execution à votre script :
chmod 750 /root/FTPuser
**Exemples d'utilisation**
ajout d'un utilisateur
/root/FTPuser add user3 456789
modification d'un mot de passe
/root/FTPuser change user3 987654
suppression d'un utilisateur
/root/FTPuser delete user3
===== Problèmes connus =====
Si vous obtenez les messages suivants lors de la connexion d'un utilisateur virtuel :
500 OOPS: cannot change directory:/ftpzone/user1the folder doesnt exist
Vous n'avez pas créé le dossier racine de l'utilisateur
500 OOPS: vsftpd: refusing to run with writable root inside chroot ()
Vous n'avez pas restreint les droits d'écriture (555) sur le dossier racine de l'utilisateur (ex. /ftpzone/userx )
----
Lors du redémarrage si vous constatez un message du type :
stop: Unknown instance
Vous avez une erreur dans le fichier de configuration qui empêche de démarrer le daemon.
----
Lors de la connexion vous obtenez le message
libgcc_s.so.1 must be installed for pthread_cancel to work ubuntu
Il vous manque une bibliothèque (normalement installé sous ubuntu 12.04). Vous devez installer le paquet **libpam-ldap** pour résoudre votre problème.
===== Voir aussi. =====
(en) [[https://security.appspot.com/vsftpd.html]]
(en) [[https://ubuntuforums.org/showthread.php?t=518293]]
(en) [[https://www.debiantutorials.com/installing-vsftpd-using-text-file-for-virtual-users/]]
----
--- //[[:utilisateurs:ChesterKiK|ChesterKiK]] Le 24/09/2012, 16:22//