{{tag>Bionic BROUILLON reseau Tutoriel}}
----
====== VsftpD et authentification via pam_mysql sur base de données SQL ======
Cette page aurait besoin d'une mise à jour, à lire avec précaution.
Ce tutoriel vous servira à authentifier des utilisateurs VsftpD grâce à une base de données MySQL. Le but étant de ne pas utiliser une base de données Berkeley qui doit être re-générée à chaque création, suppression ou mise à jour d'utilisateur.
===== Installation =====
[[:tutoriel:comment_installer_un_paquet|Installez les paquets]] **[[apt://vsftpd,mysql-server,libpam-mysql,openssl|vsftpd mysql-server libpam-mysql openssl]]**
Une fois ces logiciels installés, je vous conseille de suivre ce [[:mysql|tutoriel MySQL]] afin de correctement sécuriser votre serveur
de base de données, notamment la partie **Configuration**.
===== Configuration de VsftpD =====
On commence par sauvegarder le nécessaire :
sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.OK
[[:tutoriel:comment_editer_un_fichier|Éditez le fichier]] en tant qu'[[:sudo|administrateur]].
Ci dessous la configuration du fichier **/etc/vsftpd.conf** avec le détail de chaque option. Les utilisateurs virtuels se
connectent et sont emprisonnés (chroot) dans un même dossier, les connections sont encryptées en SSL (**Cipher DES-CBC3-SHA**)
et les options de connexion passives sont activées.
# Serveur en écoute
listen=YES
# Port d’écoute du serveur
listen_port=21
# Options des utilisateurs anonymes ici désactivés
anonymous_enable=NO
# Autorisation d'upload pour les utilisateurs anonymes
anon_upload_enable=NO
# Autorisation de création de répertoire pour les utilisateurs anonymes
# mais aussi de suppression et de renommage
anon_other_write_enable=NO
anon_mkdir_write_enable=NO
# Autorisation de connexion anonyme en ssl
allow_anon_ssl=NO
# Autorise les utilisateurs locaux ou virtuels a se connecter
local_enable=YES
# Autorise l'ecriture sur le serveur (upload)
write_enable=YES
# Masque d'upload de fichier 022 => correspond a un chmod 755
local_umask=022
# Monitoring de base via `ps -ef | grep vsftpd`
setproctitle_enable=YES
# Active les messages de changement de répertoire
dirmessage_enable=YES
# Utilisation de log pour les uploads et downloads (par defaut /var/log/vsftpd.log)
xferlog_enable=YES
# Emplacement du fichier de log
xferlog_file=/var/log/vsftpd.log
# Formatage de la log au standard wu-ftpd
xferlog_std_format=YES
# Utilisation de 2 fichiers de log différents (Par défaut /var/log/xferlog et /var/log/vsftpd.log)
dual_log_enable=YES
# Options de connexion
# Nombre de clients maximum
max_clients=30
# Nombre maximum de connexions par clients
max_per_ip=3
# Durée en secondes d’inactivité avant déconnexion de la session
idle_session_timeout=60
# Durée en secondes d’inactivité avant déconnexion de données
data_connection_timeout=120
# Débit maximum du serveur en bytes par secondes (0 = débit illimité)
local_max_rate=0
# Message de bienvenue affiche durant la phase de connexion
ftpd_banner=Bienvenue sur le serveur VsftpD
# Bloquer les utilisateurs dans un dossier
chroot_local_user=YES
# Dossier utiliser pour le chroot (doit appartenir a root et avec un chmod 755)
# car il ne doit surtout pas être inscriptible (writable) par tous le monde
secure_chroot_dir=/var/run/vsftpd
# Nom du service d'authentification utilise par le serveur vsftpd
pam_service_name=vsftpd
# Utilisation des privilèges locaux pour les utilisateurs virtuels
# permet notamment de donner les droits d’écriture car sinon les
# utilisateurs virtuels ont des droits d'utilisateurs anonymes
virtual_use_local_privs=YES
# Autoriser les utilisateurs virtuels
guest_enable=YES
# Utilisateur du lancement du serveur vsftpd
# ici c'est le même utilisateur que le serveur apache
# mais vous pouvez créer un utilisateur dédie à cette tache
guest_username=www-data
# Dossier ou vont être encapsules les utilisateurs virtuels
# représente le / du site ftp
local_root=/home/vsftpd
Options supplémentaires pour le SSL, utiles si vous voulez encrypter les connexions utilisateur et connexions de données.
# Activation du SSL
ssl_enable=YES
# Oblige les connexions de données a passer par du SSL
# Si cette option est activée les clients ftp ne gérant pas
# SSL ne pourront envoyer ni recevoir de données
force_local_data_ssl=NO
# Oblige la connexion d'identification a être encryptée en SSL
# Si cette option est activée les clients ftp ne gérant pas
# SSL ne pourront plus se connecter
force_local_logins_ssl=YES
# Versions de SSL pris en charge par le serveur VsftpD
ssl_sslv2=YES
ssl_sslv3=YES
ssl_tlsv1=YES
# Emplacement du certificat d'encryption SSL
rsa_cert_file=/etc/ssl/certs/vsftpd/vsftpd.pem
# Emplacement de la clé privée (inutile et ne fonctionne pas ,il va la chercher dans le cert)
#rsa_private_key_file=/etc/ssl/certs/vsftpd/vsftpd.key
Options supplémentaires d'utilisation de VsftpD derrière un routeur (NAT), pensez bien à ouvrir et rediriger les ports décrits ci-dessous vers l'adresse IP locale de la machine hébergeant VsftpD
# Option permettant de désactiver la méthode passive (PASV)
# déconseille si vous êtes derrière un routeur
pasv_promiscuous=NO
# Mode passif autorise
pasv_enable=YES
# Debut de la plage de ports passifs
pasv_min_port=21000
# Debut de la plage de ports passifs
pasv_max_port=21100
# Adresse IP ou nom de domaine a renseigner
pasv_address=monsiteftp.com
# Demande de résolution DNS du nom de domaine (pour tous ceux en DynDNS, no-ip, etc ...)
pasv_addr_resolve=YES
# Option permettant de désactiver la méthode (PORT)
port_promiscuous=NO
Il faut penser à créer le dossier **secure_chroot_dir** Vsftpd (dans notre exemple **/var/run/vsftpd**)
et lui appliquer les [[:permissions]] adéquates, il ne faut pas que les utilisateurs aient des droits d'écriture dans ce répertoire.
sudo mkdir /var/run/vsftpd
sudo chown root:root /var/run/vsftpd
sudo chmod 660 /var/run/vsftpd
===== Configuration de MySQL =====
À ce stade, plusieurs possibilités pour administrer la base de données MySQL :\\
En commande, pas très convivial mais efficace ou via une interface Web comme [[:lamp|PhpMyAdmin]] ou [[:webmin|Webmin]].
Concernant PhpMyAdmin et Webmin je vous laisse chercher, je vais donner les commandes MySQL de base tout en précisant les besoins.
sudo mysql -u root -p (puis taper le mot de passe de votre superutilisateur MySQL)
mysql>
# Création d'une nouvelle base nommée "vsftpd"
CREATE DATABASE vsftpd;
# Attribution des privilèges a l'utilisateur vsftpd avec comme mot de passe : MOTDEPASSE_VSFTPD
# MOTDEPASSE_VSFTPD ne doit pas contenir de caractère # : interpréte le reste de la ligne comme un commentaire.
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON vsftpd.* TO 'vsftpd'@'localhost' IDENTIFIED BY 'MOTDEPASSE_VSFTPD';
# Sous Mysql 8.0 ou > :
# CREATE USER 'vsftpd'@'localhost' IDENTIFIED BY 'MOTDEPASSE_VSFTPD';
# GRANT ALL ON vsftpd.* TO 'vsftpd'@'localhost';
# Application des privileges
FLUSH PRIVILEGES;
# Utilisation de la base de données fraîchement créée
USE vsftpd;
# Création d'une table utilisateurs avec 4 champs (ID, NOM, PASS, CRYPTAGE)
# ID => identifiant unique (auto-incrémentation et clé primaire)
# NOM => texte (nul non autorise)
# PASS => texte (nul non autorise)
# CRYPTAGE => texte (nul autorise)
CREATE TABLE `utilisateurs` ( `ID` INT NOT NULL AUTO_INCREMENT PRIMARY KEY , `NOM` TEXT NOT NULL , `PASS` TEXT NOT NULL , `CRYPTAGE` TEXT );
# Création d'une table logging avec 6 champs (ID, USER, HOST, RHOST, MSG, TIME)
# ID => identifiant unique (auto-incrémentation et clé primaire)
# USER => texte (nul non autorise)
# HOST => texte (nul non autorise)
# RHOST => texte (nul non autorise)
# TIME => texte (nul non autorise)
# MSG => => texte (nul non autorise)
# PID => texte (nul non autorisé)
CREATE TABLE `logging` ( `ID` INT NOT NULL AUTO_INCREMENT PRIMARY KEY , `USER` TEXT NOT NULL , `HOST` TEXT NOT NULL , `RHOST` TEXT NOT NULL , `TIME` TEXT NOT NULL , `MSG` TEXT NOT NULL , `PID` TEXT NOT NULL);
Notre base de données est créée et nous allons donc la renseigner avec un jeu d'utilisateurs de test, voici la syntaxe pour ajouter un utilisateur, sachant
que cette commande est aussi utilisable sous [[:lamp|PhpMyAdmin]] ou [[:webmin|Webmin]] pour ceux qui n'ont pas envie de s'embêter. Nous allons créer 3 utilisateurs nommés respectivement
"toto", "tata" et "titi" avec comme mots de passes respectifs **toto**, **tata** et **titi**.
Ceci afin de détailler l'utilisation de la librairie pam_mysql et de MySQL-server.
# Création de l'utilisateur toto avec comme mot de passe toto stocke en clair (aucun cryptage)
INSERT INTO utilisateurs (NOM, PASS, CRYPTAGE) VALUES('toto', 'toto', 'aucun' );
# Création de l'utilisateur tata avec comme mot de passe tata crypte avec la fonction MySQL PASSWORD() => deconseille dans le manuel MySQL
INSERT INTO utilisateurs (NOM, PASS, CRYPTAGE) VALUES('tata', PASSWORD('tata'), 'PASSWORD' );
# Création de l'utilisateur titi avec comme mot de passe titi crypte avec la fonction MySQL ENCRYPT() => conseille a la place de PASSWORD()
INSERT INTO utilisateurs (NOM, PASS, CRYPTAGE) VALUES('titi', ENCRYPT('titi'), 'ENCRYPT' );
===== Configuration du certificat SSL =====
La commande **sudo head -15 vsftpd.pem > vsftpd.key**
peut rendre votre système fortement instable
# Creation du repertoire pour stocker les certificats
sudo mkdir /etc/ssl/certs/vsftpd && cd /etc/ssl/certs/vsftpd
# Creation du certificat SSL valable 1 an
sudo openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout vsftpd.pem -out vsftpd.pem
# Copie de la partie [PRIVATE_KEY] du certificat dans le fichier vsftpd.key
sudo head -15 vsftpd.pem > vsftpd.key
# Protection du certificat et de la cle privee
sudo chmod 600 *
La clé privée générée est auto-signée et certains clients vont donc afficher des alertes de sécurité,
car la clé n'est pas validée par une authorité de certification reconnue (Thawte, Verisign, etc)
Exemple de clé privée :
-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQDA4ApkDJ3bW16Fgp2voDLr0ku7IYNP1tz43i1zWdwlPuoXtNyQ
Gl8jO6QjWfPY1p/LpK7KM434yZeC53QO8cJA60KFDUTdNpxmknZBWblU86nHiYNZ
IOy/ojEt7I5/4pQEVG0ns9JEmpNje1pjPX/K2vX4yRHxDdJhlJS+zlUgNQIDAQAB
AoGAeAb0cG6pjei+Wbd/CdxX1Al6t2mTngvIV9dr0W0KYuNUKoyS9dpzeimTa6x+
42Is7z38yDhtEXXio8QFpYctqsKQsekB/iboA9Qvh2+NONBVv/9oFxdRE2lZHVc/
YdiFv17LlN34FEGb7CgkJtA30ma09wwWEtAS11Fo2nFMOcECQQD3fo7oX2pMH74W
WQl/+RmQlC2OF+6HZko73TrGTBVzhhcKzqtbrTyD2gPid9QHCKKQB1gMsoPi3+HV
20uBrfDPAkEAx4DyEOLK8EX0vHg8k57WESQpd2bbL+ugUaksmBGmPcuXsP6tGBan
6jtYip8tKgVAZ89oYxtw8hFI+69u6sp3uwJAQE/sxsl0j893z8rXQx/x2rYGmHPz
kc+s3p2AVmMS9/ASMMa/lJURspmGhOTqfeFqjM67vKDu0Jeo0a+okUwn1QJBAJGh
rxJke3+pkV2C57Va3SjmHN7sVlREzGLP+52GRLQXSkQJpJFQ+IIjkB6g03c5Hiqp
XKn7/ha2R3ByP6Vk5sECQCZRJ0c1TEsmt4sZAO2rfWHeQ5D6GZWjsqY/WW2TInM/
ynrPiJyfS8mVrKmwZa4JjL/1ohDd+ma8MsgWIXBc7ck=
-----END RSA PRIVATE KEY-----
===== Configuration de pam_mysql =====
On commence par sauvegarder l'existant :
sudo cp /etc/pam.d/vsftpd /etc/pam.d/vsftpd.ok
[[:tutoriel:comment_editer_un_fichier|Éditez le fichier]] **/etc/pam.d/vsftpd** vous devriez tomber sur quelque chose ressemblant à ça :
# Standard behaviour for ftpd(8).
auth required pam_listfile.so item=user sense=deny file=/etc/ftpusers onerr=succeed
# Note: vsftpd handles anonymous logins on its own. Do not enable
# pam_ftp.so.
# Standard blurb.
@include common-account
@include common-session
@include common-auth
auth required pam_shells.so
Il faut commenter toutes les lignes avec un **#** ou effacer tout le contenu du fichier et coller le code ci dessous à la place.
# fonction pam_mysql crypt=1 OK avec la fonction ENCRYPT() de MySQL
# fonction pam_mysql crypt=2 OK avec la fonction PASSWORD() de MySQL
# Minimum necesaire afin de se connecter
# auth required pam_mysql.so user=vsftpd passwd=VsftpD host=localhost db=vsftpd table=users usercolumn=nom passwdcolumn=mdp crypt=1
# account required pam_mysql.so user=vsftpd passwd=VsftpD host=localhost db=vsftpd table=users usercolumn=nom passwdcolumn=mdp crypt=1
# Connexion avec logging en base de donnees des acces
auth required pam_mysql.so verbose=1 user=vsftpd passwd=VsftpD host=localhost db=vsftpd table=utilisateurs usercolumn=NOM passwdcolumn=PASS crypt=1 sqllog=true logtable=logging logmsgcolumn=msg logusercolumn=user loghostcolumn=host logrhostcolumn=rhost logtimecolumn=time logpidcolumn=pid
account required pam_mysql.so verbose=1 user=vsftpd passwd=VsftpD host=localhost db=vsftpd table=utilisateurs usercolumn=NOM passwdcolumn=PASS crypt=1 sqllog=true logtable=logging logmsgcolumn=msg logusercolumn=user loghostcolumn=host logrhostcolumn=rhost logtimecolumn=time logpidcolumn=pid
N'oubliez pas de remplacer VsftpD par le mot de passe que vous avez choisi lors de la création de la base de données
La librairie pam_mysql acceptent plusieurs arguments dont voici le détail :
\\
**verbose** => Mode verbeux, nécessaire pour logger les accès ( 0=désactivé, 1 = activé )\\
**user** => Utilisateur employé par VsftpD pour se conncter à MySQL\\
**password** => Mot de passe de l'utilsateur employé par VsftpD pour se connecter à MySQL\\
**host** => Hote hébergeant le serveur MySQL (localhost ou adresse IP)\\
**db** => nom de la base de données à 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 utilisé pour les mots de passe ( 0 = clair , 1 = fonction ENCRYPT(), 2 = fonction PASSWORD(), 3 = fonction MD5(), 4 = fonction SHA1() )\\
**sqllog** => activation du logging d'accès en base SQL ( 0 = désactivé, 1 = activé )\\
**logtable** => nom de la table de log des accès utilisateurs\\
**logmsgcolumn** => nom de la colonne ou seront stockés les messages de pam_mysql\\
**logusercolumn** => nom de la colonne ou seront stockés les nom des utilisateurs\\
**logpidcolumn** => nom de la colonne ou seront stockés les numéros de process (pid)\\
**loghostcolumn** => nom de la colonne ou seront stockés les adresses ou se connectent les utilisateurs (en général le serveur lui même)\\
**logrhostcolumn** => nom de la colonne ou seront stockés les adresses distantes des utilisateurs\\
**logtimecolumn** => nom de la colonne ou seront stockés les heures de connexion\\
La fonction **crypt** de la librairie pam_mysql accepte différents arguments (**0**, **1**, **2**, **3**, **4**) , cependant je n'en ai trouvé que deux qui fonctionnent avec mysql-server, bien que, sous mysql la fonction **MD5()** et la fonction **SHA1()** existent, 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.
===== Configuration des partages =====
Nos utilisateurs virtuels se connectent et sont emprisonnés dans un dossier dans lequel il n'ont pas les droits en écriture. Il faut donc leur monter des
répertoires en lecture et en écriture (si besoin). Dans notre exemple (cf fichier **/etc.vsftpd.conf**) ce dossier **/home/vsftpd**
Nous allons monter deux repertoires nommés **dossier1** accessible en lecture et **dossier2** accessible en écriture dans **/home/vsftpd** et les faire pointer vers deux dossiers existants **dossier1** et **dossier2** dans **/media/donnees**\\
cd /home/vsftpd
# Creer les repertoires de destination des montages
sudo mkdir dossier1 dossier2
# Donner les droits en ecriture a tout le monde sur dossier2
sudo chmod 777 dossier2
Il faut ensuite modifier le fichier **/etc/fstab** pour monter à chaque démarrage les répertoires partagés sur le serveur VsftpD,
ajoutez à la fin de **/etc/fstab** les deux lignes suivantes.
/home/vsftpd/dossier1 /media/donnees/dossier1 none bind,defaults,auto 0 0
/home/vsftpd/dossier2 /media/donnees/dossier2 none bind,defaults,auto 0 0
Pour que **dossier2** soit en lecture/écriture il faut penser aux permissions du répertoire de destination.
sudo chmod 777 /media/donnees/dossier2
===== Utilisation ===== test
Pour faire mes tests j'ai utilisé différents clients ftp, cependant je conseille **ftp-ssl** pour les tests car les messages d'erreurs sont plus
parlants. Autrement il existe **Filezilla** ou **FireFTP** sous Mozilla qui fonctionnent très bien.
[[:tutoriel:comment_installer_un_paquet|Installez les paquets]] suivants :
* [[apt://filezilla|filezilla]]
* [[apt://ftp-ssl|ftp-ssl]]
* [[https://addons.mozilla.org/fr/firefox/addon/684|Plugin FireFTP pour Firefox]]
Pour commencer il faut recharger le fichier de configuration VsftpD.
sudo /etc/init.d/vsftpd restart
Ensuite tentative de connexion en commande ou via un client graphique qui devrait normalement vous répondre comme ci-dessous. Il est aussi possible de tester via un navigateur à l'adresse ftp://toto@localhost:21 si vous avez laisser les options adéquates.\\
ftp-ssl localhost 21
Connected to localhost.
220 Bienvenue sur le serveur VsftpD
Name (localhost:toto): toto
234 Proceed with negotiation.
[SSL Cipher DES-CBC3-SHA]
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>
Si toutefois vous avez des problèmes de connexion (Authentication Failed) vérifiez les paramètres de cryptage de pam_mysql et la fonction\\
utilisée dans MySQL-server pour crypter le mot de passe. Pour les problèmes de connexion sur nom de domaine vérifiez bien que tous les ports\\
(connexion et plage de ports passifs) sont bien ouverts et redirigés vers l'adresse IP locale de votre machine.
Une autre solution est de venir en discuter [[https://forum.ubuntu-fr.org/viewtopic.php?id=198367|ici]] ou [[http://forum.ubuntu-fr.org|ici]]. Bon courage.
===== Liens =====
* [[http://vsftpd.beasts.org/vsftpd_conf.html|Page officielle du manuel VsftpD)]]
* [[:Vsftpd|Vsftpd sur ubuntu-fr]] (pour toute la partie installation du serveur et configuration des certificats SSL)
* [[http://pam-mysql.sourceforge.net/Documentation/package-readme.php?seemore=y|le README de la librairie pam_mysql]]
* [[https://doc.fedora-fr.org/wiki/Vsftpd_:_Installation_et_configuration|Page similaire sur le wiki de Fedora]]
----
//Contributeur : [[:utilisateurs:maclane45]]//