Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
linux:installation:vsftpd_avec_users_mariadb [2022/09/03 15:09] – tutospisto | linux:installation:vsftpd_avec_users_mariadb [2022/09/03 16:28] (Version actuelle) – tutospisto | ||
---|---|---|---|
Ligne 12: | Ligne 12: | ||
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 | 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 | ||
<code sql[enable_line_numbers=1]> | <code sql[enable_line_numbers=1]> | ||
- | # Creation d'' | + | -- # Creation d'' |
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`) ); | 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'' | + | -- # Creation d'' |
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`) ); | 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'' | + | -- # Creation d'' |
INSERT INTO ftpcomptes (pseudo, mdp) VALUES(' | INSERT INTO ftpcomptes (pseudo, mdp) VALUES(' | ||
</ | </ | ||
+ | |||
+ | ===== Configurer Pam pour utiliser des users en BDD ===== | ||
+ | On l’installe, | ||
+ | <code bash>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 / | ||
+ | <code bash> | ||
+ | cp / | ||
+ | nano / | ||
+ | Et on remplace l’integralite du contenu par les lignes 2 suivantes, | ||
+ | <code bash> | ||
+ | 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, | ||
+ | # user : Utilisateur employe par VsftpD pour se conncter a MySQL | ||
+ | # password : Mot de passe de l' | ||
+ | # 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' | ||
+ | # 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, | ||
+ | |||
+ | ===== Ajouter un premier utilisateur ===== | ||
+ | |||
+ | On crée un premier utilisateur virtuel sur MySQLINSERT INTO comptes (pseudo, mdp) VALUES(‘exemple’, | ||
+ | |||
+ | Le répertoire de l’utilisateur ‘PSEUDO_USER ‘ est / | ||
+ | <code bash> | ||
+ | useradd --home / | ||
+ | |||
+ | 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) : | ||
+ | <code bash> | ||
+ | chmod 775 / | ||
+ | chown -R vsftpd: | ||
+ | |||
+ | On cree le repertoire qui stockera les droits des users virtuels | ||
+ | <code bash> | ||
+ | |||
+ | On cree un repertoire par utilisateur virtuel en specifiant ces droits : | ||
+ | <code bash> | ||
+ | |||
+ | <code bash user_config.txt[enable_line_numbers=1, | ||
+ | local_root=/ | ||
+ | |||
+ | ## droit de lecture(download) | ||
+ | anon_world_readable_only=NO | ||
+ | |||
+ | ## droit d' | ||
+ | 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' | ||
+ | ## activer l' | ||
+ | virtual_use_local_privs=YES | ||
+ | ## definir l' | ||
+ | local_umask=022</ | ||
+ | |||
+ | ===== Petit plus : publication sur apache ===== | ||
+ | |||
+ | Si on veut que PSEUDO_USER qui est chroot dans / | ||
+ | <code bash> | ||
+ | chown -R vsftpd: | ||
+ | mount --bind / | ||
+ | |||
+ | Pour l’avoir au boot éditer /etc/fstab et ajouter : | ||
+ | <code bash>/ | ||
+ | |||
+ | 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> | ||
+ | |||
+ | Ensuite on édite la configuration de vsftpd dans / | ||
+ | <code bash> | ||
+ | cp / | ||
+ | nano / | ||
+ | |||
+ | 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, | ||
+ | # ftp server | ||
+ | ##################### | ||
+ | listen=YES | ||
+ | # port par défaut du FTP | ||
+ | listen_port=TON_PORT | ||
+ | # nom du service d' | ||
+ | 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=/ | ||
+ | hide_ids=YES | ||
+ | |||
+ | # Necessaire pour le monitoring | ||
+ | setproctitle_enable=YES</ | ||
+ | |||
+ | |||
+ | On relance tout ça : | ||
+ | <code bash>/ | ||
+ | |||
+ | Et on teste avec filezilla ou la commande ftp : | ||
+ | <code bash>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 : | ||
+ | <code bash> | ||
+ | |||
+ | ===== 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 / | ||
+ | - on ajoute ses permissions ( nano / | ||
+ | - on édite le /etc/fstab en ajoutant les bind | ||
+ | - on relance vsftpd ( / | ||
+ | |||
+ | ===== Monitoring vsftpd | ||
+ | Pour avoir un monitoring basic (voir les utilisateurs connectes) : | ||
+ | |||
+ | ((nécessite l’activation de « setproctitle_enable=YES » dans le fichier / | ||
+ | |||
+ | Ensuite, pour voir la liste des utilisateurs il suffit de taper la commande suivante dans un terminal : | ||
+ | <code bash>ps -aef | grep vsftpd</ | ||
+ | |||
+ | ou pour suivre les connexions en continu (perso j’ai fait un alias « watchftp »): | ||
+ | <code bash> | ||
+ | |||
+ | 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> | ||
+ | Alors il faudra modifier le /home/ de l’utilisateur vsftpd (nano /etc/passwd ) et mettre / | ||
+ | \\ | ||
+ | \\ | ||
+ | Si lors des tests de connexion on obtient : <code bash> | ||
+ | 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: | ||
+ | <code bash> | ||
+ | chmod 775 / | ||
+ | \\ | ||
+ | Après chaque changement de config on oublie pas de relancer vsftpd (ce qui ne gène normalement pas les gens connectes) | ||
+ | <code bash>/ | ||
+ | / | ||
+ | |||
+ | Et on n' | ||
+ | |||
+ | ---- | ||
+ | |||
+ | ################################################### | ||
+ | |||
+ | ===== Ancien tuto pour info ===== | ||
+ | |||
+ | <code bash ancien_tuto.txt[enable_line_numbers=1, | ||
+ | # Note : Voici l' | ||
+ | # vsftpd/ | ||
+ | # vsftpd/ | ||
+ | # 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' | ||
+ | # 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 " | ||
+ | INSERT INTO ftpcomptes (pseudo, mdp) VALUES(' | ||
+ | # Il faut maintenant configurer pam, qui va permettre a vsftpd d' | ||
+ | # dans les utilisateurs systeme, stockes dans /etc/passwd et / | ||
+ | nano / | ||
+ | # Et on remplace l' | ||
+ | # Ou BDDUSER est l' | ||
+ | # 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, | ||
+ | # user : Utilisateur employe par VsftpD pour se conncter a MySQL | ||
+ | # password : Mot de passe de l' | ||
+ | # 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' | ||
+ | # 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' | ||
+ | # Personellement, | ||
+ | # | ||
+ | # Et on cree un premier utilisateur virtuel sur MySQL | ||
+ | INSERT INTO comptes (pseudo, mdp) VALUES(' | ||
+ | # Le repertoire de l' | ||
+ | mkdir / | ||
+ | chown ftp:nogroup / | ||
+ | # 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 / | ||
+ | nano / | ||
+ | # | ||
+ | # On cree le repertoire qui stockera les droits des users virtuels | ||
+ | mkdir / | ||
+ | # On cree un repertoire par utilisateur virtuel en specifiant ces droits (! fichier d' | ||
+ | nano / | ||
+ | # On relance vsftpd et on teste ! | ||
+ | / | ||
+ | / | ||
+ | # Si lors des tests de connexion on obtient : Reponse : 500 OOPS: cannot change directory:/ | ||
+ | # Alors il faudra modifier le /home/ de l' | ||
+ | # 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 : | ||
+ | # Si lors des tests du FTP on obtient des erreurs de permissions ou des " | ||
+ | # 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) | ||
+ | / | ||
+ | / | ||
+ | # Et on oublie pas non plus d' | ||
+ | # | ||
+ | ### Petit plus : si on veut que PSEUDO_USER qui est chroot dans / | ||
+ | # publier le contenu de son ftp (sur / | ||
+ | # il suffit de lancer les commandes suivantes : | ||
+ | mkdir / | ||
+ | chown -R ftp:nogroup / | ||
+ | mount --bind / | ||
+ | # Pour l' | ||
+ | / | ||
+ | # | ||
+ | # | ||
+ | ### 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' | ||
+ | # Lorsqu' | ||
+ | # Pour eviter de se retrouver coince de cette façon, il suffit d' | ||
+ | # (Ouvrir une cinquantaine de ports est suffisant dans mon cas pour accueillir simultanement une dizaine d' | ||
+ | # Dans mon cas toujours, j'ai donc modifie la ligne pasv_max_port=65482, | ||
+ | # | ||
+ | # | ||
+ | ### Ajouter un utilisateur : | ||
+ | # 1) on cree son compte sur MySQL (ATTENTION : le mot de passe doit etre encrypt(" | ||
+ | # 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 / | ||
+ | # 4) on ajoute ses permissions ( nano / | ||
+ | # 5) on edite le /etc/fstab en ajoutant les bind | ||
+ | # 6) on relance vsftpd ( / | ||
+ | # | ||
+ | # | ||
+ | ### Monitoring vsftpd | ||
+ | # Pour avoir un monitoring basic (voir les utilisateurs connectes) : | ||
+ | # ((necessite l' | ||
+ | # 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 " | ||
+ | ## watch -n 1 'ps ax | grep vsftpd | grep -v grep' | ||
+ | # Attention, tous les utilisateurs du systeme ayant acces a la commande " | ||
+ | |||
+ |