Table des matières

Note > Voici l’emplacement des fichiers de configuration :

On installe vsftpd et on le stoppe le temps de le configurer

agi vsftpd
/etc/init.d/vsftpd stop

On prépare la BDD à accueillir les users et les logs

Sur MySQL ou MariaDB, on cree un utilisateur BDDUSER avec une bdd qui lui est associee (via phpmyadmin par exemple)Ensuite on crée deux nouvelles tables dans cette bdd

  1. -- # Creation d''une table ftpcomptes avec 3 champs (id, pseudo, mdp)
  2. 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`) );
  3. -- # Creation d''une table ftplogging avec 7 champs (id, pseudo, pid, host, rhost, time, msg)
  4. 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`) );
  5. -- # Creation d''un premier utilisateur virtuel sur MySQL. Son pseudo est "exemple" avec comme mot de passe "mypass" (crypt=1 donc ENCRYPT)
  6. INSERT INTO ftpcomptes (pseudo, mdp) VALUES('exemple', ENCRYPT('mypass'));

Configurer Pam pour utiliser des users en BDD

On l’installe, et surtout on n’oublie pas le module libpam-mysql :

agi libpam libpam-mysql

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, stockés dans /etc/passwd et /etc/shadow.On sauvegarde l’ancien fichier (au cas où, mais pas dans le même répertoire, sinon il serait lu aussi) et on en crée un tout neuf :

mkdir -p /var/backups/config
cp /etc/pam.d/vsftpd /var/backups/config/vsftpd.bak
nano /etc/pam.d/vsftpd

Et on remplace l’integralite du contenu par les lignes 2 suivantes,Où BDDUSER est l’utilisateur crée sur MySQLBDDPASS son mot de passeBDDNAME le nom de la base de donnees qui lui est associée

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 mysqlEn 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 échoue systématiquement. Personnellement, j’ai choisi crypt=1 (donc ENCRYPT sous MySQL)

Ajouter un premier utilisateur

On crée un premier utilisateur virtuel sur MySQLINSERT INTO comptes (pseudo, mdp) VALUES(‘exemple’, ENCRYPT(‘mypass’));

Le répertoire de l’utilisateur ‘PSEUDO_USER ‘ est /var/ftp/ftpzone/PSEUDO_USER , mais vsftpd ne peut pas le créer. Il faut donc le faire et le donner à l’utilisateur vsftpd.

mkdir -p /var/ftp/ftpzone/PSEUDO_USER 
useradd --home /var/ftp/ftpzone --shell /bin/false vsftpd

On donne les droits d’écriture dans un sous répertoire upload et on attribue l’ensemble à vsftpd, et au groupe www-data (si on souhaite donner l’accès à apache) :

chmod 555 /var/ftp/ftpzone/PSEUDO_USER /
chmod 775 /var/ftp/ftpzone/PSEUDO_USER/upload/
chown -R vsftpd:www-data  /var/ftp/ftpzone/

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 :

nano /etc/vsftpd/user_conf/PSEUDO_USER
user_config.txt
  1. ## l'utilisateur est enferme dans un dossier determine
  2. local_root=/var/ftp/ftpzone/PSEUDO_USER
  3.  
  4. ## droit de lecture(download)
  5. anon_world_readable_only=NO
  6.  
  7. ## droit d'ecriture(upload)
  8. write_enable=YES
  9. anon_upload_enable=YES
  10.  
  11. ## creer des dossiers
  12. anon_mkdir_write_enable=YES
  13.  
  14. ## droit de renommer, supprimer...
  15. anon_other_write_enable=YES
  16.  
  17. ## pour gerer le chmod de l'utilisateur
  18. ## activer l'option
  19. virtual_use_local_privs=YES
  20. ## definir l'option local_umask
  21. local_umask=022

Petit plus : publication sur apache

Si on veut que PSEUDO_USER qui est chroot dans /var/ftp/ftpzone/PSEUDO_USER puisse publier le contenu de son ftp (sur /var/www/html/PSEUDO_USER) ou encore accéder à d’autres répertoires, il suffit de lancer les commandes suivantes :

mkdir /var/www/html/PSEUDO_USER
chown -R vsftpd:www-data /var/www/html/PSEUDO_USER/
mount --bind /var/www/html/PSEUDO_USER/ /var/ftp/ftpzone/PSEUDO_USER/

Pour l’avoir au boot éditer /etc/fstab et ajouter :

/var/www/html/PSEUDO_USER/ /var/ftp/ftpzone/PSEUDO_USER/    none  bind,defaults,auto     0    0

Ne pas oublier de metttre l’user vsftpd dans le groupe www-data pour que chaque upload d’un utilisateur soit directement visible par apache

sudo usermod -g www-data vsftpd

Ensuite on édite la configuration de vsftpd dans /etc/vsftpd.conf

mkdir -p /var/backups/config
cp /etc/vsftpd.conf /var/backups/config/vsftpd.conf.bak
nano /etc/vsftpd.conf

On remplace TON_PORT et TON_PORT_MAX par les ports de son choix (qu’on pense à ouvrir sur le routeur)

vsftpd.conf
  1. # ftp server
  2. #####################
  3. listen=YES
  4. # port par défaut du FTP
  5. listen_port=TON_PORT
  6. # nom du service d'authentification
  7. pam_service_name=vsftpd
  8. # pour le mode passif (firewall)
  9. pasv_min_port=TON_PORT
  10. pasv_max_port=TON_PORT_MAX
  11. #
  12. #
  13. # anonymous user
  14. #####################
  15. anonymous_enable=NO
  16. anon_upload_enable=NO
  17. anon_mkdir_write_enable=NO
  18. anon_other_write_enable=NO
  19. #
  20. #
  21. # general user
  22. #####################
  23. local_enable=YES
  24. local_umask= 022
  25. write_enable=YES
  26. chroot_local_user=YES
  27. # pour user admin (déconseillé)
  28. # chroot_list_enable=YES
  29. #
  30. #
  31. # virtual user
  32. #####################
  33. guest_enable=YES
  34. guest_username=vsftpd
  35. nopriv_user=vsftpd
  36. virtual_use_local_privs=YES
  37. user_sub_token=$USER
  38. local_root=/var/ftp/ftpzone/$USER
  39. hide_ids=YES
  40.  
  41. # Necessaire pour le monitoring
  42. setproctitle_enable=YES

On relance tout ça :

/etc/init.d/vsftpd restart

Et on teste avec filezilla ou la commande ftp :

ftp 127.0.0.1 TONPORT

Et le couple login / mdp qui va bien.

Une fois l’installation effectuée, pour que le serveur se lance automatiquement au démarrage :

systemctl enable vsftpd.service

Ajouter un utilisateur

  1. on crée son compte sur MySQL (ATTENTION : le mot de passe doit etre encrypt(« password ») si crypt=1)
  2. on crée son répertoire ftp (et on mount –bind les répertoires dont il aura besoin)
  3. on donne le répertoire à ftp ( chmod 555 /var/ftp/ftpzone/PSEUDO_USER && chmod 775 /var/ftp/ftpzone/PSEUDO_USER/upload/ )
  4. on ajoute ses permissions ( nano /etc/vsftpd/user_conf/PSEUDO_USER )
  5. on édite 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) :

1)

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 système ayant accès a la commande « ps » pourront également visualiser la liste des utilisateurs connectes.

Erreurs récurrentes

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 vsftpd (nano /etc/passwd ) et mettre /var/ftp/ftpzone

Si lors des tests de connexion on obtient :

Reponse : 500 OOPS: vsf_sysutil_bind

Alors il faut vérifier que les ports de connexion et de data ne sont pas déjà 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 vérifier qu’on a bien lance la commande : chown -R vsftpd:www-data /var/ftp/ftpzone/ ou encore

chmod 555 /var/ftp/ftpzone/PSEUDO_USER /
chmod 775 /var/ftp/ftpzone/PSEUDO_USER/upload/


Après chaque changement de config on oublie pas de relancer vsftpd (ce qui ne gène normalement pas les gens connectes)

/etc/init.d/vsftpd reload
/etc/init.d/vsftpd restart

Et on n'oublie pas non plus d’ouvrir les ports utilises dans la box !


###################################################

Ancien tuto pour info

ancien_tuto.txt
  1. # Note : Voici l'emplacement des fichiers de configuration
  2. # vsftpd/vsftpd.conf = /etc/vsftpd.conf
  3. # vsftpd/vsftpd_user_conf = /etc/vsftpd/user_conf/PSEUDO_USER
  4. # vsftpd/pam_vsftpd = /etc/pam.d/vsftpd
  5. # NOTE : Pour le moment les droits des users virtuels ne sont pas tout a fait appliques.
  6. # En effet ils sont effectivement chrootes, mais impossible d'interdire l'ecriture sans interdire la lecture par exemple...
  7. # A creuser !
  8. ### VSFTPD via MySQL
  9. # Sur MySQL, on cree un utilisateur BDDUSER avec une bdd qui lui est associee (via phpmyadmin par exemple)
  10. # Ensuite on cree deux nouvelles tables dans cette bdd
  11. # Creation d'une table ftpcomptes avec 3 champs (id, pseudo, mdp)
  12. 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`) );
  13. # Creation d'une table ftplogging avec 7 champs (id, pseudo, pid, host, rhost, time, msg)
  14. 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`) );
  15. # Creation d'un premier utilisateur virtuel sur MySQL. Son pseudo est "exemple" avec comme mot de passe "mypass" (crypt=1 donc ENCRYPT)
  16. INSERT INTO ftpcomptes (pseudo, mdp) VALUES('exemple', ENCRYPT('mypass'));
  17. # Il faut maintenant configurer pam, qui va permettre a vsftpd d'aller chercher les utilisateurs dans la base mysql plutôt que
  18. # 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 !)
  19. nano /etc/pam.d/vsftpd
  20. # Et on remplace l'integralite du contenu par les lignes 2 suivantes,
  21. # Ou BDDUSER est l'utilisateur cree sur MySQL
  22. # BDDPASS son mot de passe
  23. # BDDNAME le nom de la base de donnees qui lui est associee
  24. 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
  25. 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
  26. ### INFOS
  27. # verbose : Mode verbeux, necessaire pour logger les acces ( 0=desactive, 1 = active )
  28. # user : Utilisateur employe par VsftpD pour se conncter a MySQL
  29. # password : Mot de passe de l'utilsateur employe par VsftpD pour se connecter a MySQL
  30. # host : Hote hebergeant le serveur MySQL (localhost ou adresse IP)
  31. # db : nom de la base de donnees a utiliser
  32. # table : nom de la table contenant les utilisateurs
  33. # usercolumn : nom de la colonne contenant les noms des utilisateurs
  34. # passwdcolumn : nom de la colone contenant les mot de passe des utilisateurs
  35. # crypt : type de cryptage utilise pour les mots de passe ( 0 = clair , 1 = fonction ENCRYPT(), 2 = fonction PASSWORD(), 3 = fonction MD5(), 4 = fonction SHA1() )
  36. # sqllog : activation du logging d'acces en base SQL ( 0 = desactive, 1 = active )
  37. # logtable : nom de la table de log des acces utilisateurs
  38. # logmsgcolumn : nom de la colonne ou seront stockes les messages de pam_mysql
  39. # logusercolumn : nom de la colonne ou seront stockes les nom des utilisateurs
  40. # logpidcolumn : nom de la colonne ou seront stockes les numeros de process (pid)
  41. # loghostcolumn : nom de la colonne ou seront stockes les adresses ou se connectent les utilisateurs (en general le serveur lui même)
  42. # logrhostcolumn : nom de la colonne ou seront stockes les adresses distantes des utilisateurs
  43. # logtimecolumn : nom de la colonne ou seront stockes les heures de connexion
  44. #
  45. # 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
  46. # 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.
  47. # Autrement dit, les valeurs ne correspondent pas et l'authentification echoue systematiquement.
  48. # Personellement, j'ai choisi crypt=1 (donc ENCRYPT sous MySQL)
  49. #
  50. # Et on cree un premier utilisateur virtuel sur MySQL
  51. INSERT INTO comptes (pseudo, mdp) VALUES('exemple', ENCRYPT('secret'));
  52. # 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
  53. mkdir /var/ftp/exemple
  54. chown ftp:nogroup /var/ftp/exemple
  55. # On peut aussi, pour ne pas oublier un repertoire, lancer :
  56. chown -R ftp:nogroup /var/ftp/
  57. # Cette commande devra etre lancee apres chaque creation de nouveau repertoire
  58. #
  59. # Ensuite on edite la configuration de vsftpd dans /etc/vsftpd.conf (! fichier dispo avec le tuto !)
  60. nano /etc/vsftpd.conf
  61. #
  62. # On cree le repertoire qui stockera les droits des users virtuels
  63. mkdir /etc/vsftpd/user_conf
  64. # On cree un repertoire par utilisateur virtuel en specifiant ces droits (! fichier d'exemple dispo avec le tuto !)
  65. nano /etc/vsftpd/user_conf/PSEUDO_USER
  66. # On relance vsftpd et on teste !
  67. /etc/init.d/vsftpd reload
  68. /etc/init.d/vsftpd restart
  69. # Si lors des tests de connexion on obtient : Reponse : 500 OOPS: cannot change directory:/home/ftp
  70. # Alors il faudra modifier le /home/ de l'utilisateur ftp (nano /etc/passwd ) et mettre /var/ftp/
  71. # Si lors des tests de connexion on obtient : Reponse : 500 OOPS: vsf_sysutil_bind
  72. # Alors il faut verifier que les ports de connexion et de data ne sont pas deja utilise (commande "lsof -i :65432" par exemple)
  73. # Si lors des tests du FTP on obtient des erreurs de permissions ou des "failed"
  74. # Alors il faut verifier qu'on a bien lance la commande : chown -R ftp:nogroup /var/ftp/
  75. # Apres chaque changement de config on oublie pas de relancer vsftpd (ce qui ne gene normalement pas les gens connectes)
  76. /etc/init.d/vsftpd reload
  77. /etc/init.d/vsftpd restart
  78. # Et on oublie pas non plus d'ouvrir les ports utilises dans la box !
  79. #
  80. ### Petit plus : si on veut que PSEUDO_USER qui est chroot dans /var/ftp/PSEUDO_USER puisse
  81. # publier le contenu de son ftp (sur /var/www/PSEUDO_USER) ou encore acceder a d'autres repertoires,
  82. # il suffit de lancer les commandes suivantes :
  83. mkdir /var/www/PSEUDO_USER
  84. chown -R ftp:nogroup /var/www/PSEUDO_USER/
  85. mount --bind /var/www/PSEUDO_USER/ /var/ftp/PSEUDO_USER/
  86. # Pour l'avoir au boot éditer /etc/fstab et ajouter :
  87. /var/www/PSEUDO_USER/ /var/ftp/PSEUDO_USER/none bind,defaults,auto 00
  88. #
  89. #
  90. ### NOTE : Apres avoir mis en place le ftp sur deux ports seulement (65432 pour les connexions et 65431 pour les data),
  91. # 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.
  92. # Lorsqu'on essaye on tombe sur une erreur (Reponse : 500 OOPS: vsf_sysutil_bind) et seul le premier connecte beneficie du FTP.
  93. # 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
  94. # (Ouvrir une cinquantaine de ports est suffisant dans mon cas pour accueillir simultanement une dizaine d'utilisateurs envoyant jusqu'a 5 fichiers)
  95. # 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
  96. #
  97. #
  98. ### Ajouter un utilisateur :
  99. # 1) on cree son compte sur MySQL (ATTENTION : le mot de passe doit etre encrypt("password") si crypt=1)
  100. # 2) On cree son repertoire ftp (et on mount --bind les repertoires dont il aura besoin)
  101. # 3) on donne le repertoire a ftp ( chown -R ftp:nogroup /var/ftp/PSEUDO_USER/ )
  102. # 4) on ajoute ses permissions ( nano /etc/vsftpd/user_conf/PSEUDO_USER )
  103. # 5) on edite le /etc/fstab en ajoutant les bind
  104. # 6) on relance vsftpd ( /etc/init.d/vsftpd reload && /etc/init.d/vsftpd restart )
  105. #
  106. #
  107. ### Monitoring vsftpd
  108. # Pour avoir un monitoring basic (voir les utilisateurs connectes) :
  109. # ((necessite l'activation de "setproctitle_enable=YES" dans le fichier /etc/vsftpd.conf ))
  110. # Ensuite, pour voir la liste des utilisateurs il suffit de taper la commande suivante dans un terminal :
  111. ## ps -aef | grep vsftpd
  112. # ou pour suivre les connexions en continu (perso j'ai fait un alias "watchftp"):
  113. ## watch -n 1 'ps ax | grep vsftpd | grep -v grep'
  114. # Attention, tous les utilisateurs du systeme ayant acces a la commande "ps" pourront egalement visualiser la liste des utilisateurs connectes.
1)
nécessite l’activation de « setproctitle_enable=YES » dans le fichier /etc/vsftpd.conf