Ceci est une ancienne révision du document !
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
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
-- # 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'));
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)
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
## l'utilisateur est enferme dans un dossier determine local_root=/var/ftp/ftpzone/PSEUDO_USER ## droit de lecture(download) anon_world_readable_only=NO ## droit d'ecriture(upload) write_enable=YES anon_upload_enable=YES ## creer des dossiers anon_mkdir_write_enable=YES ## droit de renommer, supprimer... anon_other_write_enable=YES ## pour gerer le chmod de l'utilisateur ## activer l'option virtual_use_local_privs=YES ## definir l'option local_umask local_umask=022
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)
# ftp server ##################### listen=YES # port par défaut du FTP listen_port=TON_PORT # nom du service d'authentification pam_service_name=vsftpd # pour le mode passif (firewall) pasv_min_port=TON_PORT pasv_max_port=TON_PORT_MAX # # # 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=/var/ftp/ftpzone/$USER hide_ids=YES # Necessaire pour le monitoring setproctitle_enable=YES