# Note : Voici l'emplacement des fichiers de configuration # vsftpd/vsftpd.conf = /etc/vsftpd.conf # vsftpd/vsftpd_user_conf = /etc/vsftpd/user_conf/PSEUDO_USER # vsftpd/pam_vsftpd = /etc/pam.d/vsftpd # NOTE : Pour le moment les droits des users virtuels ne sont pas tout a fait appliques. # En effet ils sont effectivement chrootes, mais impossible d'interdire l'ecriture sans interdire la lecture par exemple... # A creuser ! ### VSFTPD via MySQL # Sur MySQL, on cree un utilisateur BDDUSER avec une bdd qui lui est associee (via phpmyadmin par exemple) # Ensuite on cree deux nouvelles tables dans cette bdd # Creation d'une table ftpcomptes avec 3 champs (id, pseudo, mdp) CREATE TABLE IF NOT EXISTS `ftpcomptes` ( `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY , `pseudo` VARCHAR( 250 ) NOT NULL , `mdp` VARCHAR( 250 ) NOT NULL , UNIQUE (`pseudo`) ); # Creation d'une table ftplogging avec 7 champs (id, pseudo, pid, host, rhost, time, msg) CREATE TABLE IF NOT EXISTS `ftplogging` ( `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY , `pseudo` VARCHAR( 250 ) NOT NULL , `pid` VARCHAR( 250 ) NOT NULL , `host` VARCHAR( 250 ) NOT NULL , `rhost` VARCHAR( 250 ) NOT NULL , `time` VARCHAR( 250 ) NOT NULL , `msg` VARCHAR( 250 ) NOT NULL, INDEX (`pseudo`) ); # Creation d'un premier utilisateur virtuel sur MySQL. Son pseudo est "exemple" avec comme mot de passe "mypass" (crypt=1 donc ENCRYPT) INSERT INTO ftpcomptes (pseudo, mdp) VALUES('exemple', ENCRYPT('mypass')); # Il faut maintenant configurer pam, qui va permettre a vsftpd d'aller chercher les utilisateurs dans la base mysql plutôt que # dans les utilisateurs systeme, stockes dans /etc/passwd et /etc/shadow. On sauvegarde l'ancien fichier (au cas ou) et on en cree un tout neuf (! fichier dispo avec le tuto !) nano /etc/pam.d/vsftpd # Et on remplace l'integralite du contenu par les lignes 2 suivantes, # Ou BDDUSER est l'utilisateur cree sur MySQL # BDDPASS son mot de passe # BDDNAME le nom de la base de donnees qui lui est associee auth required pam_mysql.so verbose=1 user=BDDUSER passwd=BDDPASS host=localhost db=BDDNAME table=ftpcomptes usercolumn=pseudo passwdcolumn=mdp crypt=1 sqllog=true logtable=ftplogging logmsgcolumn=msg logusercolumn=pseudo logpidcolumn=pid loghostcolumn=host logrhostcolumn=rhost logtimecolumn=time account required pam_mysql.so verbose=1 user=BDDUSER passwd=BDDPASS host=localhost db=BDDNAME table=ftpcomptes usercolumn=pseudo passwdcolumn=mdp crypt=1 sqllog=true logtable=ftplogging logmsgcolumn=msg logusercolumn=pseudo logpidcolumn=pid loghostcolumn=host logrhostcolumn=rhost logtimecolumn=time ### INFOS # verbose : Mode verbeux, necessaire pour logger les acces ( 0=desactive, 1 = active ) # user : Utilisateur employe par VsftpD pour se conncter a MySQL # password : Mot de passe de l'utilsateur employe par VsftpD pour se connecter a MySQL # host : Hote hebergeant le serveur MySQL (localhost ou adresse IP) # db : nom de la base de donnees a utiliser # table : nom de la table contenant les utilisateurs # usercolumn : nom de la colonne contenant les noms des utilisateurs # passwdcolumn : nom de la colone contenant les mot de passe des utilisateurs # crypt : type de cryptage utilise pour les mots de passe ( 0 = clair , 1 = fonction ENCRYPT(), 2 = fonction PASSWORD(), 3 = fonction MD5(), 4 = fonction SHA1() ) # sqllog : activation du logging d'acces en base SQL ( 0 = desactive, 1 = active ) # logtable : nom de la table de log des acces utilisateurs # logmsgcolumn : nom de la colonne ou seront stockes les messages de pam_mysql # logusercolumn : nom de la colonne ou seront stockes les nom des utilisateurs # logpidcolumn : nom de la colonne ou seront stockes les numeros de process (pid) # loghostcolumn : nom de la colonne ou seront stockes les adresses ou se connectent les utilisateurs (en general le serveur lui même) # logrhostcolumn : nom de la colonne ou seront stockes les adresses distantes des utilisateurs # logtimecolumn : nom de la colonne ou seront stockes les heures de connexion # # NOTE : La fonction crypt de la librairie pam_mysql accepte differents arguments (0, 1, 2, 3, 4) , cependant je n'en ai trouve que deux qui fonctionnent avec mysql # En effet, sous mysql la fonction MD5() et la fonction SHA1() existent, mais elles ne renvoient pas les mêmes valeurs que le crypt fourni par pam_mysql. # Autrement dit, les valeurs ne correspondent pas et l'authentification echoue systematiquement. # Personellement, j'ai choisi crypt=1 (donc ENCRYPT sous MySQL) # # Et on cree un premier utilisateur virtuel sur MySQL INSERT INTO comptes (pseudo, mdp) VALUES('exemple', ENCRYPT('secret')); # Le repertoire de l'utilisateur exemple est /var/ftp/exemple, mais vsftpd ne peut pas le creer. Il faut donc le faire et le donner a l'utilisateur ftp mkdir /var/ftp/exemple chown ftp:nogroup /var/ftp/exemple # On peut aussi, pour ne pas oublier un repertoire, lancer : chown -R ftp:nogroup /var/ftp/ # Cette commande devra etre lancee apres chaque creation de nouveau repertoire # # Ensuite on edite la configuration de vsftpd dans /etc/vsftpd.conf (! fichier dispo avec le tuto !) nano /etc/vsftpd.conf # # On cree le repertoire qui stockera les droits des users virtuels mkdir /etc/vsftpd/user_conf # On cree un repertoire par utilisateur virtuel en specifiant ces droits (! fichier d'exemple dispo avec le tuto !) nano /etc/vsftpd/user_conf/PSEUDO_USER # On relance vsftpd et on teste ! /etc/init.d/vsftpd reload /etc/init.d/vsftpd restart # Si lors des tests de connexion on obtient : Reponse : 500 OOPS: cannot change directory:/home/ftp # Alors il faudra modifier le /home/ de l'utilisateur ftp (nano /etc/passwd ) et mettre /var/ftp/ # Si lors des tests de connexion on obtient : Reponse : 500 OOPS: vsf_sysutil_bind # Alors il faut verifier que les ports de connexion et de data ne sont pas deja utilise (commande "lsof -i :65432" par exemple) # Si lors des tests du FTP on obtient des erreurs de permissions ou des "failed" # Alors il faut verifier qu'on a bien lance la commande : chown -R ftp:nogroup /var/ftp/ # Apres chaque changement de config on oublie pas de relancer vsftpd (ce qui ne gene normalement pas les gens connectes) /etc/init.d/vsftpd reload /etc/init.d/vsftpd restart # Et on oublie pas non plus d'ouvrir les ports utilises dans la box ! # ### Petit plus : si on veut que PSEUDO_USER qui est chroot dans /var/ftp/PSEUDO_USER puisse # publier le contenu de son ftp (sur /var/www/PSEUDO_USER) ou encore acceder a d'autres repertoires, # il suffit de lancer les commandes suivantes : mkdir /var/www/PSEUDO_USER chown -R ftp:nogroup /var/www/PSEUDO_USER/ mount --bind /var/www/PSEUDO_USER/ /var/ftp/PSEUDO_USER/ # Pour l'avoir au boot éditer /etc/fstab et ajouter : /var/www/PSEUDO_USER/ /var/ftp/PSEUDO_USER/none bind,defaults,auto 00 # # ### NOTE : Apres avoir mis en place le ftp sur deux ports seulement (65432 pour les connexions et 65431 pour les data), # je me suis rendu compte qu'il etait impossible d'acceder a plusieurs comptes à la fois, ou plusieurs fois au même compte, lorsqu'un fichier est en cours de transfert. # Lorsqu'on essaye on tombe sur une erreur (Reponse : 500 OOPS: vsf_sysutil_bind) et seul le premier connecte beneficie du FTP. # Pour eviter de se retrouver coince de cette façon, il suffit d'editer le fichier de configuration (nano /etc/vsftpd.conf) et de preciser une plage de port un peu plus grande # (Ouvrir une cinquantaine de ports est suffisant dans mon cas pour accueillir simultanement une dizaine d'utilisateurs envoyant jusqu'a 5 fichiers) # Dans mon cas toujours, j'ai donc modifie la ligne pasv_max_port=65482, et j'ai donc ouvert une PLAGE de ports (65431-65482) sur ma box # # ### Ajouter un utilisateur : # 1) on cree son compte sur MySQL (ATTENTION : le mot de passe doit etre encrypt("password") si crypt=1) # 2) On cree son repertoire ftp (et on mount --bind les repertoires dont il aura besoin) # 3) on donne le repertoire a ftp ( chown -R ftp:nogroup /var/ftp/PSEUDO_USER/ ) # 4) on ajoute ses permissions ( nano /etc/vsftpd/user_conf/PSEUDO_USER ) # 5) on edite le /etc/fstab en ajoutant les bind # 6) on relance vsftpd ( /etc/init.d/vsftpd reload && /etc/init.d/vsftpd restart ) # # ### Monitoring vsftpd # Pour avoir un monitoring basic (voir les utilisateurs connectes) : # ((necessite l'activation de "setproctitle_enable=YES" dans le fichier /etc/vsftpd.conf )) # Ensuite, pour voir la liste des utilisateurs il suffit de taper la commande suivante dans un terminal : ## ps -aef | grep vsftpd # ou pour suivre les connexions en continu (perso j'ai fait un alias "watchftp"): ## watch -n 1 'ps ax | grep vsftpd | grep -v grep' # Attention, tous les utilisateurs du systeme ayant acces a la commande "ps" pourront egalement visualiser la liste des utilisateurs connectes.