Outils pour utilisateurs

Outils du site


linux:installation:vsftpd_avec_users_mariadb

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
linux:installation:vsftpd_avec_users_mariadb [2022/09/03 15:44] – [Ajouter un utilisateur] tutospistolinux:installation:vsftpd_avec_users_mariadb [2022/09/03 16:28] (Version actuelle) tutospisto
Ligne 54: Ligne 54:
 Autrement dit, les valeurs ne correspondent pas et l’authentification échoue systématiquement. Personnellement, j’ai choisi crypt=1 (donc ENCRYPT sous 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 utilisateur =====+===== Ajouter un premier utilisateur =====
  
 On crée un premier utilisateur virtuel sur MySQLINSERT INTO comptes (pseudo, mdp) VALUES(‘exemple’, ENCRYPT(‘mypass’)); On crée un premier utilisateur virtuel sur MySQLINSERT INTO comptes (pseudo, mdp) VALUES(‘exemple’, ENCRYPT(‘mypass’));
Ligne 73: Ligne 73:
 <code bash>nano /etc/vsftpd/user_conf/PSEUDO_USER</code> <code bash>nano /etc/vsftpd/user_conf/PSEUDO_USER</code>
  
-<codebash user_config.txt[enable_line_numbers=1, skin=sons-of-obsidian]>## l'utilisateur est enferme dans un dossier determine+<code bash user_config.txt[enable_line_numbers=1, skin=sons-of-obsidian]>## l'utilisateur est enferme dans un dossier determine
 local_root=/var/ftp/ftpzone/PSEUDO_USER  local_root=/var/ftp/ftpzone/PSEUDO_USER 
    
Ligne 94: Ligne 94:
 ## definir l'option local_umask ## definir l'option local_umask
 local_umask=022</code> local_umask=022</code>
 +
 +===== 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 :
 +<code bash>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/</code>
 +
 +Pour l’avoir au boot éditer /etc/fstab et ajouter :
 +<code bash>/var/www/html/PSEUDO_USER/ /var/ftp/ftpzone/PSEUDO_USER/    none  bind,defaults,auto        0</code>
 +
 +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
 +<code bash>sudo usermod -g www-data vsftpd</code>
 +
 +Ensuite on édite la configuration de vsftpd dans /etc/vsftpd.conf
 +<code bash>mkdir -p /var/backups/config
 +cp /etc/vsftpd.conf /var/backups/config/vsftpd.conf.bak
 +nano /etc/vsftpd.conf</code>
 +
 +On remplace TON_PORT et TON_PORT_MAX par les ports de son choix (qu’on pense à ouvrir sur le routeur)
 +
 +<code bash vsftpd.conf[enable_line_numbers=1, skin=sons-of-obsidian]>
 +# 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</code>
 +
 +
 +On relance tout ça :
 +<code bash>/etc/init.d/vsftpd restart</code>
 +
 +Et on teste avec filezilla ou la commande ftp :
 +<code bash>ftp 127.0.0.1 TONPORT</code>
 +
 +Et le couple login / mdp qui va bien.
 +
 +Une fois l’installation effectuée, pour que le serveur se lance automatiquement au démarrage :
 +<code bash>systemctl enable vsftpd.service</code>
 +
 +===== Ajouter un utilisateur =====
 +
 +  - on crée son compte sur MySQL (ATTENTION : le mot de passe doit etre encrypt(« password ») si crypt=1)
 +  - on crée son répertoire ftp (et on mount –bind les répertoires dont il aura besoin)
 +  - on donne le répertoire à ftp ( chmod 555 /var/ftp/ftpzone/PSEUDO_USER && chmod 775 /var/ftp/ftpzone/PSEUDO_USER/upload/ )
 +  - on ajoute ses permissions ( nano /etc/vsftpd/user_conf/PSEUDO_USER )
 +  - on édite le /etc/fstab en ajoutant les bind
 +  - on relance vsftpd ( /etc/init.d/vsftpd reload && /etc/init.d/vsftpd restart 
 +
 +===== Monitoring vsftpd  =====
 +Pour avoir un monitoring basic (voir les utilisateurs connectes) :
 +
 +((nécessite 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 :
 +<code bash>ps -aef | grep vsftpd</code>
 +
 +ou pour suivre les connexions en continu (perso j’ai fait un alias « watchftp »):
 +<code bash>watch -n 1 'ps ax | grep vsftpd | grep -v grep'</code>
 +
 +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 : <code bash>Reponse : 500 OOPS: cannot change directory:/home/ftp</code>
 +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 : <code bash>Reponse : 500 OOPS: vsf_sysutil_bind</code>
 +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
 +<code bash>chmod 555 /var/ftp/ftpzone/PSEUDO_USER /
 +chmod 775 /var/ftp/ftpzone/PSEUDO_USER/upload/</code>
 +\\
 +Après chaque changement de config on oublie pas de relancer vsftpd (ce qui ne gène normalement pas les gens connectes)
 +<code bash>/etc/init.d/vsftpd reload
 +/etc/init.d/vsftpd restart</code>
 +
 +Et on n'oublie pas non plus d’ouvrir les ports utilises dans la box !
 +
 +----
 +
 +###################################################
 +
 +===== Ancien tuto pour info =====
 +
 +<code bash ancien_tuto.txt[enable_line_numbers=1, skin=sons-of-obsidian]>
 +# 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. </code>
 +
 +
linux/installation/vsftpd_avec_users_mariadb.1662219874.txt.gz · Dernière modification : 2022/09/03 15:44 de tutospisto