Documentation Submit Query
discussion voir le texte source historique page
groupe d'installation qui lui est dédié. Nous utilisons ce dernier pour l'installation :
Une fois l'installation effectuée, pour que le serveur se lance automatiquement au démarrage :
Pour démarrer, redémarrer et stopper le service, les commandes respectives sont (toujours en super utilisateur) :
Normalement votre système doit déjà avoir un utilisateur ftp et un groupe ftp. Si ce n'est pas le cas, créez les avec groupadd etuseradd.
3 Configuration
Le fichier de configuration de vsftpd se trouve dans le répertoire /etc/vsftpd et se nomme vsftpd.conf. Nous partirons d'une configuration vide, nous nous déplaçons donc dans le dossier, puis nous renommons le fichier :
Nous créons ensuite un dossier qui contiendra les configurations spécifiques à chaque utilisateur :
$ su -
# yum groupinstall "FTP Server"
# chkconfig vsftpd on
# service vsftpd start
# service vsftpd restart
# service vsftpd stop
Configurations
Il existe un grand nombre de possibilités de configuration, faisant varier le comportement du serveur de façon très différente. Une lecture de la page de manuel de vsftpd reste indispensable pour une configuration sûre.
$ su -
# cd /etc/vsftpd
# mv vsftpd.conf vsftpd.conf.default
# mkdir vsftpd_user_conf
ftpusers et user_list
Ces deux fichiers ont la même vocation : interdire des utilisateurs. En effet il contiennent tous les deux une liste d'utilisateurs pour lesquels le serveur ftp refusera toute connexion. Pourquoi deux fichiers (au contenu identique) ?
Le premier (ftpusers) est utilisé via PAM dans la configuration par défaut faite sur Fedora et CentOS. A la connexion d'un utilisateur, PAM vient lire ce fichier et si l'identifiant de connexion utilisé est dans ce fichier, la connexion est refusée.
Le second (user_list) est utilisé directement par vsftpd. Il peut avoir deux usages : soit les seuls utilisateurs contenus dans ce fichier ont le droit de se connecter, soit l'accès leur est systématiquement refusé.
On se fiche d'avoir une liste d'utilisateurs autorisés (second cas), puisque ceux-ci seront gérés avec une base d'utilisateurs virtuels. Il est donc inutile d'avoir ces deux systèmes d'interdiction. Mon choix pourrait être de suivre la configuration par défaut faite par CentOS et Fedora, c'est-à-dire utiliser PAM, et donc supprimer le
Dernière modification de cette page le 23 janvier 2009 à 09:06.
Contenu disponible sous Paternité 2.5 .
Ce site rassemble les utilisateurs francophones de Fedora et ne dépend pas du Projet Fedora fedora-fr est hébergé gracieusement chez sur serveur
Skin fedora-fr par Titax & LLaumgui
N'étant pas utilisé, on supprime le fichier ftpusers (vous pouvez tout à fait le conserver et sauter cette étape, au cas où vous voudriez vous en servir ensuite, notez cependant que son contenu est par défaut le même que user_list) en root :
Nous verrons plus loin la configuration de PAM pour qu'il n'aille plus chercher dans ce fichier. À vous de rentrer les
identifiants que vous ne souhaitez pas voir se connecter dans user_list en plus de ceux par défaut. Cela sera pratique pour désactiver un utilisateur virtuel, plutôt que de supprimer puis recréer son compte.Venons-en maintenant au fichier de configuration à proprement parler :
Vous êtes dans un fichier vide, puisque nous avons renommé celui par défaut. Vous trouverez tous les paramètres possibles du fichier de configuration dans la page de man (man vsftpd.conf). Voici la configuration à entrer, avec la documentation de chaque paramètre:
fichier user_list alors inutile. Et pourtant ce n'est pas la solution que j'ai retenue. En effet il y a une petite différence dans la façon de rejeter les utilisateurs. Si root (présent dans les deux fichiers par défaut) se connecte :
Premier cas (ftpusers) : le système PAM ne va pas réagir, et le mot de passe sera demandé. A partir de là, même si ce dernier est correct, PAM va refuser la connexion car "root" est présent dans le fichier ftpusers.
Second cas (user_list) : Vsftpd va lui réagir différemment. Lorsque le login sera demandé, et que l'utilisateur tapera "root", il coupera directement la connexion, sans même demander le mot de passe.
C'est une subtilité, mais je préfère ce comportement. Le protocole FTP envoyant les données en clair, cela évite par exemple d'envoyer le mot de passe root pour rien. Je vais donc utiliser le fichier user_list plutôt que ftpusers, même si ce n'est pas le choix par défaut fait pour Fedora et Centos.
# rm /etc/vsftpd/ftpusers
# vi /etc/vsftpd/vsftpd.conf
Petit résumé :
On écoute sur le port 21 On est en standalone
On refuse les utilisateurs anonymes
On accepte les utilisateurs système et les utilisateurs virtuels Les utilisateurs virtuels sont mappés sur l'utilisateur système "ftp"
Les utilisateurs n'ont aucun droit d'écriture par défaut Ils sont chrootés dans/var/ftp
/etc/vsftpd/vsftpd_user_conf/ sera le dossier pour les configurations d'utilisateurs virtuels
/etc/vsftpd/user_list contiendra la liste des utilisateurs refusés (pour lesquels on ne demandera même pas le mot de passe)
# http://vsftpd.beasts.org/vsftpd_conf.html ou "man vsftpd.conf"
# Port d'ecoute listen_port=21
# Banniere de bienvenue
ftpd_banner=Bienvenue sur mon ftp perso
# Fichier de config PAM pam_service_name=vsftpd
# Mode "standalone"
listen=YES
# Je ne veux pas de connexion anonyme anonymous_enable=NO
# On autorise les connexions des utilisateurs locaux. C'est indispensable
# pour que les utilisateurs virtuels (mappes sur un utilisateur local)
# puissent se connecter (les "vrais" utilisateurs locaux sont ensuite desactives
# avec le fichier user_list local_enable=YES
# Fichier de users
userlist_file=/etc/vsftpd/user_list
# Chargement de la liste userlist_file userlist_enable=YES
# On refuse les utilisateurs de la liste userlist_deny=YES
# trop restrictif, un utilisateur virtuel pourra ainsi telecharger un fichier meme s'il n'est pas world readable anon_world_readable_only=NO
# Refus des commandes influant sur le systeme de fichier (STOR, DELE, RNFR, RNTO, MKD, RMD, APPE and SITE) write_enable=NO
# Refus des droits d'ecriture pour les anonymes (et donc utilisateurs virtuels) par défaut
# les autorisations seront données au cas par cas :
# pas d'upload
anon_upload_enable=NO
# pas de creation de repertoire anon_mkdir_write_enable=NO
# pas de creation, suppression, renommage de repertoire ...
anon_other_write_enable=NO
# On fait en sorte que les utilisateurs "guest" (non-anonymes) soient mappés sur le compte local "ftp"
guest_enable=YES guest_username=ftp
# chroot des utilisateurs chroot_local_user=YES
# Nombre maximum de connexion simultanees max_clients=50
# Nombre maximum de connexion venant de la meme IP max_per_ip=4
# Dossier de configuration specifique des utilisateurs user_config_dir=/etc/vsftpd/vsftpd_user_conf
# On active le log xferlog_enable=YES
Pour plus de sécurité, on réduit les droits sur le fichier de configuration :
4 Utilisateurs virtuels
Il est temps maintenant de créer la base contenant nos utilisateurs virtuels. Comme je l'ai dit, nous nous laissons le choix du format : berkeley ou mysql. Lisez le chapitre correspondant à votre choix de base.
4.1 Format berkeley
Nous partirons d'un fichier texte simple, comprenant les logins et les mots de passe, puis nous utiliserons une commande pour transformer ce fichier en format db. Le format du fichier est simplissime, un mot par ligne, et on écrit dans l'ordre le login, le pass, le login, le pass, etc. Je vais créer une base contenant deux utilisateurs :
titi dont le mot de passe est passtiti toto dont le mot de passe est passtoto
Rendez-vous dans /etc/vsftpd et en root créez un fichier nommé login.txt :
Et voici ce que contiendra le fichier : Mapping utilisateur
Si les utilisateurs virtuels ne sont pas (par définition) des utilisateurs système, ils disposent tout de même de droits (sur les fichiers, dossiers, en écriture, lecture...). Afin de pouvoir gérer ces droits, on "mappe" (relie) ces utilisateurs à un utilisateur système unique (ici "ftp").
Ainsi les droits des utilisateurs virtuels en écriture et lecture seront ceux donnés à l'utilisateur système "ftp".
Ces droits prévalent sur la configuration (même si un utilisateur virtuel a les droits d'écriture dans un dossier, si l'utilisateur "ftp" ne les a pas, l'utilisateur virtuel ne pourra pas écrire).
Standalone ?
Le mode standalone indique que le serveur est autonome, et que le service tourne en permanance.
Xinetd est un meta-démon qui écoute les requêtes, et lance le démon approprié lorsqu'il est sollicité. L'intérêt est donc de ne pas lancer un service et laisser xinetd se charger de le démarrer lorsqu'un utilisateur le
sollicitera.
Il permet donc une économie de ressources (processeur, mémoire... et donc électricité). Il peut être
intéressant de l'utiliser si la machine est déjà chargée ou/et si le service est très peu utilisé. En contre-partie la première requête subira quelques délais, puisque le démon approprié devra être démarré.
Attention !
Pensez à ouvrir les ports 20 et 21 de votre pare-feu, et à faire une redirection de port si vous êtes derrière un routeur. Si vous avez changé les valeurs de ces ports dans le fichier de configuration, modifiez vos pare- feu et routage en conséquence.
# chmod 600 /etc/vsftpd/vsftpd.conf
$ su -
# cd /etc/vsftpd/
# vi login.txt
Nous allons maintenant créer le fichier db à partir de celui-ci. Pour cela nous devons utiliser la commande db_load, fournie par le package db4-utils. Si ce package n'est pas installé, faites-le de cette façon :
Une fois cela fait, toujours depuis le dossier /etc/vsftpd, en root tapez :
Nous verrons plus loin que l'on peut intégrer cette commande à un script pour regénérer plus facilement la base. Nous disposons maintenant d'un fichier /etc/vsftpd/login.db. Pour plus de sécurité, on réduit les droits sur les fichiers utilisateurs :
4.1.1 Se simplifier la vie
La commande pour générer le fichier db à partir du txt est lourde à retenir, et de plus il est intéressant de pouvoir générer un fichier de configuration spécifique vide pour chaque utilisateur pour ne pas avoir d'erreur. Voici un petit script (surement optimisable) appellé txt2db.sh faisant cela pour vous. Il regénère le fichier db, et créé un fichier de config vide s'il n'existe pas. En voici le contenu :
et son utilisation :
titi passtiti toto passtoto
Attention !
Ce fichier doit se terminer par un retour à la ligne.
# yum install db4-utils
# db_load -T -t hash -f login.txt login.db
# chmod 600 login.*
#!/bin/sh
if [ $# = "2" ]; then rm -f $2
db_load -T -t hash -f $1 $2 chmod 600 /etc/vsftpd/login.*
echo "Base cree"
lignes=$(cat $1) nb=1
for ligne in $lignes do
if [ $(($nb%2)) -ne 0 ];
then
if [ ! -e vsftpd_user_conf/$ligne ];
then
touch /etc/vsftpd/vsftpd_user_conf/$ligne echo "fichier $ligne cree"
fi fi
nb=$(($nb+1)) done
else
echo "Il faut donner le fichier d'entree et le fichier de sortie"
fi
Ce script lie les lignes du login.txt et pour chaque login, 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. L'autre souci est que si vous supprimez un utilisateur du login.txt, il restera toujours le fichier spécifique de configuration. Voici un script appelé "cleanconf.sh" qui supprime tous les fichiers spécifiques n'ayant pas de login associé. Son contenu :
Son utilisation :
Voila qui nous simplifiera un peu la vie.
4.2 Base MySQL
Le module pam_mysql offre l'avantage intéressant de pouvoir loguer dans la base de données les évènements relatifs aux connexions. De plus, sa configuration souple permet de l'adapter à n'importe quelle table MySQL et donc ainsi de pouvoir utiliser une base utilisateur déja existante (dans le cadre d'un hébergement multiservice par exemple). Pour l'exemple nous créerons un utilisateur dont le login sera titi et le mot de passe sera passtiti. La base de données contenant les informations seravsftpd. Les mots de passe de nos utilisateurs seront cryptés au formatmd5. Dans un premier temps, il faut installer le module pam_mysql :
Ensuite il faut démarrer le service mysqld :
Créons la base de données. Nous aurons deux tables :
$ su -
# cd /etc/vsftpd/
# chmod +x txt2db.sh (à ne faire que la première fois)
# ./txt2db.sh login.txt login.db
fichiers=$(ls /etc/vsftpd/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 vsftpd_user_conf/$conf echo "Fichier $conf supprime"
fi done
$ su -
# chmod +x cleanconf.sh
# ./cleanconf.sh
# yum install pam_mysql
$ su -
# service mysqld start
users : table des utilisateurs log : évènements de connexion
La table de log est optionnelle. Voici les scripts SQL à exécuter pour créer ces deux tables :
Pour la table de sutilisateurs, nous utilisons un champ 'active' qui aura la valeur 1 ou 0 permettant de désactiver
temporairement l'accès à un utilisateur sans pour autant en supprimer le compte. Pour la table de log, nous stockerons le login incriminé, le message relatif à l'évènement, le pid, le host de la personne et la date et l'heure de l'évènement.
Il ne nous reste plus qu'à utiliser un utilisateur :
Vous remarquez que l'on crypte le mot de passe en md5, et que l'on active cette utilisateur (active=1). Vérifions que notre utilisateur est ajouté :
Notre utilisateur est bien ajouté. Si on souhaite lui interdire l'accès, on pourra soit supprimer son compte, soit mettre 'active' à 0.
5 PAM
Notre base d'utilisateurs étant créée, configurons PAM pour qu'il l'utilise. Commeapache (par exemple), PAM utilise pour sa configuration un dossier, /etc/pam.d/, comportant les fichiers de configuration des services qui l'utilisent. Un
fichier /etc/pam.d/vsftpd existe déjà, mais comme je l'expliquais plus haut, je ne l'utilise pas dans son intégralité. Voici donc le contenu complet que ce fichier doit avoir (et rien de plus). Utilisez le chapitre selon le type de base de donénes que vous avez utilisé :
5.1 Base berkeley
CREATE TABLE `vsftpd`.`users` (
`id_user` int(11) NOT NULL auto_increment,
`login` varchar(50) NOT NULL,
`password` varchar(100) NOT NULL,
`active` int(11) NOT NULL, PRIMARY KEY (`id_user`)
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=latin1 CREATE TABLE `vsftpd`.`log` (
`id_log` int(11) NOT NULL auto_increment,
`login` varchar(50) NOT NULL,
`message` varchar(200) NOT NULL,
`pid` varchar(10) NOT NULL,
`host` varchar(30) NOT NULL,
`time` datetime default NULL, PRIMARY KEY (`id_log`)
) ENGINE=MyISAM AUTO_INCREMENT=9 DEFAULT CHARSET=latin1
$ mysql -u <votre_user_mysql> --password=<votre_password_mysql> -e "INSERT INTO vsftpd.users (login,password,active) VALUES('titi',md5('passtiti'),1)"
$ mysql -u <votre_user_mysql> --password=<votre_password_mysql> -e "SELECT * FROM vsftpd.users"
+---+---+---+---+
| id_user | login | password | active | +---+---+---+---+
| 1 | titi | 7571fd2482115bad7310b422847f014e | 1 | +---+---+---+---+
PAM
PAM (Pluggable Authentication Modules) est un système d'authentification modulaire permettant la gestion de l'authentification des utilisateurs. Les programmes utilisant PAM n'ont pas besoin d'implémenter leur propre gestion d'authentification. De plus, PAM permet d'établir des stratégies d'authentification et supporte de nombreux formats de stockage.
Les lignes 2 et 3 permettent la connexion des utilisateurs système, les 4 et 5 la connexion des utilisateurs virtuels placés dans notre base.
Attention, pour ceux utilisant une architecture 64 bits, les deux dernières lignes sont à remplacer par celles-ci :
On peut relancer notre serveur :
5.2 Base MySQL
Tous les paramètres mis après 'where' ne sont à utiliser que si vous utilisez le log dans la base MySQL. J'ai utilisé '127.0.0.1' pour le host, mais il faut évidemment l'adapter en mettant l'adresse IP de votre serveur MySQL. Voici en détail des
paramètres :
verbose : permet d'afficher plus d'informations, seulement utile lors du deboggage user : utilisateur mysql
passwd : mot de passe mysql host : hôte du serveur mysql db : nom de la base de données
table : nom de la table pour les utilisateurs
usercolumn : nom de la colonne contenant les logins
passwdcolumn : nom de la colonne contenant les mots de passe crypt : type de cryptage, 3 indique que l'on utilise du md5
where : close supplémentaire à rajouter dans la requête, ici on s'en sert pour utiliser le paramètre 'active' sqllog : yes indique que l'on veut logger dans une table les évènements
logtable : nom de la table contenant les logs
logmsgcolumn : Nom de la colonne contenant le message de log logusercolumn : Nom de la colonne contenant le login pour le log logpidcolumn : Nom de la colonne contenant le pid pour le log loghostcolumn : Nom de la colonne contenant le host pour le log
logtimecolumn : Nom de la colonne contenant la date et l'heure pour le log Plus d'infos sur pam_mysql sur cette page.
#%PAM-1.0
auth sufficient pam_unix.so account sufficient pam_unix.so
auth required /lib/security/pam_userdb.so db=/etc/vsftpd/login account required /lib/security/pam_userdb.so db=/etc/vsftpd/login
auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/login account required /lib64/security/pam_userdb.so db=/etc/vsftpd/login
$ su -lc "service vsftpd restart"
#%PAM-1.0
auth sufficient pam_unix.so account sufficient pam_unix.so
auth required /lib/security/pam_mysql.so verbose=0 user=<votre_user_mysql> passwd=<votre_pass_mysql> host=127.0.0.1 db=vsftpd table=users usercolumn=login passwdcolumn=password crypt=3 where=users.active=1 sqllog=yes logtable=log logmsgcolumn=message logusercolumn=login logpidcolumn=pid loghostcolumn=host logtimecolumn=time account required /lib/security/pam_mysql.so verbose=0 user=<votre_user_mysql> passwd=<votre_pass_mysql> host=127.0.0.1 db=vsftpd table=users usercolumn=login passwdcolumn=password crypt=3 where=users.active=1 sqllog=yes logtable=log logmsgcolumn=message logusercolumn=login logpidcolumn=pid loghostcolumn=host logtimecolumn=time
Attention !
Pour ceux utilisant une architecture 64 bits, dans les deux dernières lignes,/lib/security est à remplacer par /lib64/security.
6 Attribution/Personnalisation des droits
Testons notre serveur :
Entrez "titi" pour utilisateur et "passtiti" comme mot de passe. La connexion doit être établie.
Placez un fichier dans /var/ftp/ (lisible par l'utilisateur ftp) et reconnectez-vous. Une fois connecté, tapez la commande ls.
Vous devez voir votre fichier.
Si nous avons créé des utilisateurs virtuels, c'est pour que chacun d'eux puisse avoir des droits différents, et même leur espace propre. Vous avez vu que dans la configuration, nous utilisons la directive
"user_config_dir=/etc/vsftpd/vsftpd_user_conf".
Ce dossier nous permet de stocker dans des fichiers séparés des configurations spécifiques à chaque utilisateur. Dans ces fichiers, on entre des paramètres, les mêmes que ceux du fichier de configuration, qui seront prioritaires par rapport à ce dernier.
Généralement, on y modifie le "local_root" et les droits d'écriture. On y met un fichier par utilisateur, et le fichier porte le même nom que le login de l'utilisateur auquel il fait référence.
Créons un dossiertiti dans /var/ftp, changeons son propriétaire puis modifions le "local_root" et les droits d'écriture pour cet utilisateur :
Notez que l'on aurait pu mettre un répertoire absolu pour le "local_root", par exemple /var/www/html/le_site_de_titi, mais en s'assurant que l'utilisateur ftp ait les droits adéquats sur ce dossier. Reconnectez-vous avec l'utilisateur titi, il vous est maintenant possible de déposer des fichiers. Reportez-vous à la page de man pour les détails sur les paramètres de configuration.
7 Erreurs possibles
Il est possible que parfois lorsque vous vous connectez, vous rencontriez un de ces erreurs : 500 OOPS: reading non-root config file :
Cela intervient si l'utilisateur n'a pas de fichier spécifique dans /etc/vsftpd/vsftpd_user_conf (même vide). Il semble que ce soit un bogue. Si vous avez ce souci, créez un fichier pour cet utilisateur. Nous verrons ensuite que l'on peut faire cela automatiquement.
500 OOPS: cannot change directory:<repertoire> : Dans ce cas, entrez :
500 OOPS: vsftpd: refusing to run with writable anonymous root Il faut enlever le droit d'écriture sur le répertoire root :
$ ftp localhost
# mkdir /var/ftp/titi
# chown ftp:ftp /var/ftp/titi
# echo "local_root=titi" > /etc/vsftpd/vsftpd_user_conf/titi
# echo "write_enable=YES" >> /etc/vsftpd/vsftpd_user_conf/titi
# echo "anon_upload_enable=YES" >> /etc/vsftpd/vsftpd_user_conf/titi
# echo "anon_mkdir_write_enable=YES" >> /etc/vsftpd/vsftpd_user_conf/titi
# echo "anon_other_write_enable=YES" >> /etc/vsftpd/vsftpd_user_conf/titi
$ su -lc "setsebool -P ftp_home_dir 1"
Ensuite il faut s'assurer que le local_root appartient bien au user et groupe ftp.
8 Conclusion
Voilà un serveur FTP prêt, avec une gestion facile d'utilisateurs virtuels. Il est de plus pour chaque utilisateur possible de modifier chaque valeur de la configuration principale, ce qui rend la gestion des utilisateurs virtuels très souple.
9 Références
Manuel vsftpd.conf vsftpd sous debian
Catégories : Administrer un serveur dédié | Réseaux et Serveurs | Système
# chmod u-w /le/local/root