Différences
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 | ||
vsftpd_et_pam_mysql [Le 01/10/2008, 22:14] – maclane45 | vsftpd_et_pam_mysql [Le 02/06/2020, 15:52] (Version actuelle) – Ajout d'une commande pour enregistrer l'utilisateur vstpd avec mysql 8.0 37.60.189.90 | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
+ | {{tag> | ||
+ | ---- | ||
+ | |||
+ | ====== VsftpD et authentification via pam_mysql sur base de données SQL ====== | ||
+ | <note warning> | ||
+ | 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' | ||
+ | |||
+ | ===== Installation ===== | ||
+ | |||
+ | [[: | ||
+ | |||
+ | Une fois ces logiciels installés, je vous conseille de suivre ce [[: | ||
+ | de base de données, notamment la partie **Configuration**. | ||
+ | |||
+ | ===== Configuration de VsftpD ===== | ||
+ | |||
+ | On commence par sauvegarder le nécessaire : | ||
+ | |||
+ | < | ||
+ | sudo cp / | ||
+ | </ | ||
+ | |||
+ | [[: | ||
+ | |||
+ | Ci dessous la configuration du fichier **/ | ||
+ | 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' | ||
+ | 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' | ||
+ | write_enable=YES | ||
+ | # Masque d' | ||
+ | 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 / | ||
+ | xferlog_enable=YES | ||
+ | # Emplacement du fichier de log | ||
+ | xferlog_file=/ | ||
+ | # Formatage de la log au standard wu-ftpd | ||
+ | xferlog_std_format=YES | ||
+ | # Utilisation de 2 fichiers de log différents (Par défaut / | ||
+ | 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=/ | ||
+ | # Nom du service d' | ||
+ | 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' | ||
+ | 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=/ | ||
+ | </ | ||
+ | <note tip> | ||
+ | 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' | ||
+ | # 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' | ||
+ | rsa_cert_file=/ | ||
+ | # Emplacement de la clé privée (inutile et ne fonctionne pas ,il va la chercher dans le cert) | ||
+ | # | ||
+ | </ | ||
+ | <note tip> | ||
+ | Options supplémentaires d' | ||
+ | </ | ||
+ | < | ||
+ | # 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 **/ | ||
+ | et lui appliquer les [[: | ||
+ | |||
+ | < | ||
+ | sudo mkdir / | ||
+ | sudo chown root:root / | ||
+ | sudo chmod 660 / | ||
+ | </ | ||
+ | |||
+ | ===== 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 [[: | ||
+ | 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 " | ||
+ | CREATE DATABASE vsftpd; | ||
+ | # Attribution des privilèges a l' | ||
+ | # 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 ' | ||
+ | # Sous Mysql 8.0 ou > : | ||
+ | # CREATE USER ' | ||
+ | # GRANT ALL ON vsftpd.* TO ' | ||
+ | # 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' | ||
+ | que cette commande est aussi utilisable sous [[: | ||
+ | " | ||
+ | Ceci afin de détailler l' | ||
+ | |||
+ | < | ||
+ | # Création de l' | ||
+ | INSERT INTO utilisateurs (NOM, PASS, CRYPTAGE) VALUES(' | ||
+ | |||
+ | # Création de l' | ||
+ | INSERT INTO utilisateurs (NOM, PASS, CRYPTAGE) VALUES(' | ||
+ | |||
+ | # Création de l' | ||
+ | INSERT INTO utilisateurs (NOM, PASS, CRYPTAGE) VALUES(' | ||
+ | </ | ||
+ | |||
+ | ===== Configuration du certificat SSL ===== | ||
+ | <note warning> 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 / | ||
+ | # 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 * | ||
+ | </ | ||
+ | |||
+ | <note important> | ||
+ | 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/ | ||
+ | IOy/ | ||
+ | AoGAeAb0cG6pjei+Wbd/ | ||
+ | 42Is7z38yDhtEXXio8QFpYctqsKQsekB/ | ||
+ | YdiFv17LlN34FEGb7CgkJtA30ma09wwWEtAS11Fo2nFMOcECQQD3fo7oX2pMH74W | ||
+ | WQl/ | ||
+ | 20uBrfDPAkEAx4DyEOLK8EX0vHg8k57WESQpd2bbL+ugUaksmBGmPcuXsP6tGBan | ||
+ | 6jtYip8tKgVAZ89oYxtw8hFI+69u6sp3uwJAQE/ | ||
+ | kc+s3p2AVmMS9/ | ||
+ | rxJke3+pkV2C57Va3SjmHN7sVlREzGLP+52GRLQXSkQJpJFQ+IIjkB6g03c5Hiqp | ||
+ | XKn7/ | ||
+ | ynrPiJyfS8mVrKmwZa4JjL/ | ||
+ | -----END RSA PRIVATE KEY----- | ||
+ | </ | ||
+ | |||
+ | ===== Configuration de pam_mysql ===== | ||
+ | |||
+ | On commence par sauvegarder l' | ||
+ | |||
+ | < | ||
+ | sudo cp / | ||
+ | </ | ||
+ | |||
+ | [[: | ||
+ | |||
+ | < | ||
+ | # Standard behaviour for ftpd(8). | ||
+ | auth required | ||
+ | |||
+ | # 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 | ||
+ | </ | ||
+ | |||
+ | 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' | ||
+ | </ | ||
+ | La librairie pam_mysql acceptent plusieurs arguments dont voici le détail : | ||
+ | \\ | ||
+ | **verbose** | ||
+ | **user** => Utilisateur employé par VsftpD pour se conncter à MySQL\\ | ||
+ | **password** => Mot de passe de l' | ||
+ | **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' | ||
+ | **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, | ||
+ | |||
+ | ===== 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 **/ | ||
+ | |||
+ | Nous allons monter deux repertoires nommés **dossier1** accessible en lecture et **dossier2** accessible en écriture dans **/ | ||
+ | |||
+ | < | ||
+ | cd / | ||
+ | # 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 **/ | ||
+ | ajoutez à la fin de **/ | ||
+ | |||
+ | < | ||
+ | / | ||
+ | / | ||
+ | </ | ||
+ | |||
+ | Pour que **dossier2** soit en lecture/ | ||
+ | |||
+ | < | ||
+ | sudo chmod 777 / | ||
+ | </ | ||
+ | |||
+ | ===== 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' | ||
+ | parlants. Autrement il existe **Filezilla** ou **FireFTP** sous Mozilla qui fonctionnent très bien. | ||
+ | |||
+ | [[: | ||
+ | |||
+ | * [[apt:// | ||
+ | * [[apt:// | ||
+ | * [[https:// | ||
+ | |||
+ | Pour commencer il faut recharger le fichier de configuration VsftpD. | ||
+ | |||
+ | < | ||
+ | sudo / | ||
+ | </ | ||
+ | |||
+ | 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' | ||
+ | |||
+ | < | ||
+ | ftp-ssl localhost 21 | ||
+ | Connected to localhost. | ||
+ | 220 Bienvenue sur le serveur VsftpD | ||
+ | Name (localhost: | ||
+ | 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' | ||
+ | |||
+ | Une autre solution est de venir en discuter [[http:// | ||
+ | |||
+ | ===== Liens ===== | ||
+ | |||
+ | * [[http:// | ||
+ | * [[: | ||
+ | * [[http:// | ||
+ | * [[https:// | ||
+ | |||
+ | ---- | ||
+ | |||
+ | // |