Jump to content

Archived

This topic is now archived and is closed to further replies.

ggbce

[RESOLU] Utiliser VSFTPD avec MySQL

Recommended Posts

J'ai décidé d'utiliser VSFTPD comme serveur FTP dernièrement. Je sais que Pro-FTPD et Pure-FTPD sont d'autres bons serveurs FTP, mais j'aimerais quand même demeurer avec VSFTPD.

Je l'utilise avec des usagers virtuels, qui ont chacun leur propre dossier racine, droits différents... avec le paramètre "user_config_dir " et un fichier de config pour chaque usager.

Le mécanisme d'authentification utilisé est avec PAM. Je stocke les usagers et mot de passe dans une base de données DB3 (Berkeley) et à partir d'un fichier texte et un script je peux mettre à jour facilement les usagers, mais uniquement depuis la console.

J'ai déjà un serveur Apache qui authentifie les usagers depuis une base de données MySQL, j'aimerais utiliser la même base de données pour mes usagers FTP (qui sont les mêmes) pour moins de gestion et plus de facilité. Je pourrais créer, détruire, modifier mes comptes directement sur une page en php.

Donc après plusieurs recherches, je ne trouve rien de pertinent pour utiliser VSFTPD avec MySQL. La seule chose que j'ai trouvé se rapporte toujours à Suse pour un module se nommant "pam_mysql" quand je fait une recherche sur Google.

Ça me donne une piste... mais je suis bloqué là.

Est-ce qu'il est possible d'utiliser VSFTPD avec MySQL via PAM ?

Si oui, toute information serait la bienvenue !

Share this post


Link to post
Share on other sites

...et bien je me suis répondu par moi même en passant mon après-midi à découvrir pam_mysql.

Faut premièrement compiler pam_mysql pour notre distribution (que j'ai ensuite convertit en RPM).

Ensuite c'est assez simple quand on connait la "formule". Il faut éditer notre fichier dans /etc/pam.d et ajouter les lignes pour "auth" et "account" appropriées ! Tout est écrit dans le fichier README du package.

Donc finalement mon VSFTPD fonctionne très bien avec des usagers virtuels qui sont stockées dans une base de données MySQL !!!

La seule chose que je ne peux pas faire c'est d'y ajouter la config (umask, local_root, write_enable, ...) par usager. Mais je vais me créer un interface en PHP qui généra un fichier de texte associé, ça devrait fonctionner.

Share this post


Link to post
Share on other sites

bonsoir je vien de voir ke tu as réussi a utiliser vsftpd avec mysql... estke tu pourais me donner ton fichier pam pour identifier les utilisateurs virtuels... ainsi que des explications je suis un peu newbee... merci d'avance

Share this post


Link to post
Share on other sites

Et bien de savoir qu'il faut utiliser un fichier PAM pour inter-connecter VSFTPD à MySQL c'est déjà mieux qu'être Newbie pour Linux :chinois:

Et voilà le contenu de /etc/pam.d/vsftpd

#%PAM-1.0
auth required pam_mysql.so host=localhost user=username passwd=mot_de_passe db=mabdd table=matable usercolumn=user_name passwdcolumn=user_passwd crypt=0
account required pam_mysql.so host=localhost user=username passwd=mot_de_passe db=mabdd table=matable usercolumn=user_name passwdcolumn=user_passwd crypt=0

Puis dans MySQL il suffit de créer la bd, table et champs nécessaire. Comme tu peux voir, il y a un option "crypt=0" ce qui égale "texte clair". J'ai essayé de changer le niveau de cryptage pour permettre l'enregistrement des valeurs en cryptage SQL, mais sans sucès pour le moment. L'aide pour les options sont disponible sur le site de "pam_mysql" à http://sourceforge.net/projects/pam-mysql/

Comme ça je peux utiliser la même BD que celle utilisée par Apache pour authentifier mes usagers HTTP.

Share this post


Link to post
Share on other sites

snif maintenant que tu m'as donné le bon fichier c'est lidentification qui ne marche pas...

j'ai gardé le fichier conf d'origine sans les utilisateurs anonymes.... faut il changer quelquechose dans le fichier conf???? mon serveur mysql démarre trés bien voila ma base de données:

create database ftp;

create table vsftpd(usr varchar(10), pass varchar(10));

insert into vsftpd values ('test','test');

peut etre faut il faire démarrer vsftpd avec xinetd???? en tout cas lorsque je met listen= no le deamon ne se lance pas...

merci bcp

Share this post


Link to post
Share on other sites

ça m'interesse tout ça

sinon soit tu le met en standalone avec listen=yes, soit tu le lance avec inetd (listen=no par defaut)

Share this post


Link to post
Share on other sites

Si tu as lu correctement l'aide fournit par VSFTPD... tu aurais vu qu'un utilisateur "virtuel" est toujours considéré comme un utilisateur "anonyme" au niveau des droits.

http://vsftpd.beasts.org/vsftpd_conf.html

et

ftp://vsftpd.beasts.org/users/cevans/unta.../VIRTUAL_USERS/

et

ftp://vsftpd.beasts.org/users/cevans/unta...IRTUAL_USERS_2/

P.S. Ton problème n'est pas lié à utiliser VSFTPD en mode standalone ou avec Xinetd. Il est toujours préférable d'utiliser en mode standalone. c'est plus sécuritaire et stable.

Listen = YES (veut dire: mode standalone, qui se démarre par lui-même)

Listen = NO (veut dire: passer par XINETD. Dans ce mode il faut configurer XINETD pour recevoir les requêtes FTP et les rediriger vers VSFTPD, tout comme avec WU-FTPD.)

Share this post


Link to post
Share on other sites

Si tu as lu correctement l'aide fournit par VSFTPD... tu aurais vu qu'un utilisateur "virtuel" est toujours considéré comme un utilisateur "anonyme" au niveau des droits.

lu,

Je reveille cette ancien post pour une petite précision:

avec la clause :virtual_use_local_privs

vsftpd donne les mêmes droits à un utilisateur virtuel qu'a un utilisateur local

:)

Share this post


Link to post
Share on other sites

Se pourrait-il que ce paramètre soit apparu avec une nouvelle version ? Je ne me rappelle pas d'avoir vu cela auparavant.

Ça pourrait être un paramètre à prendre plus de réflexion dessus afin d'élaborer son fonctionnement. Est-ce uniquement les "privilèges" qui sont considérés ou bien la "manière de reconnaître" l'usager virtuel comme étant un usager réel à la place... ?

Share this post


Link to post
Share on other sites
snif maintenant que tu m'as donné le bon fichier c'est lidentification qui ne marche pas...

j'ai gardé le fichier conf d'origine sans les utilisateurs anonymes.... faut il changer quelquechose dans le fichier conf???? mon serveur mysql démarre trés bien voila ma base de données:

create database ftp;

create table vsftpd(usr varchar(10), pass varchar(10));

insert into vsftpd values ('test','test');

peut etre faut il faire démarrer vsftpd avec xinetd???? en tout cas lorsque je met listen= no le deamon ne se lance pas...

merci bcp

Moi aussi je vais réveiller cet ancien post que j'avais ouvert afin de répondre correctement à une question qui peut intéresser quelques personnes.

Si vous utilisez un champ de mots de passe en mode crypté (non texte clair), il faut faire attention avec la longueur du champ. Par exemple, pass varchar(10) pourrait être problématique. Car lorsqu'on utilise un cryptage SHA1, MD5, etc. le mot de passe peut se retrouver avec une longueur beaucoup plus grande (et c'est de manière aléatoire). Si vous limitez les utilisateurs à des mots de passe de 10 caractères, je suggère d'utiliser un champ de mot de passe d'au moins 50 caractères dans la BDD MySQL. Je ne sais pas exactement quel est la longueur maximale d'un mot de passe crypté vs le mot de passe en texte clair, mais je sais que si le champ n'est pas assez long lors de la création du mot de passe vous n'aurez pas d'erreur... sauf que le mot de passe crypté sera tronqué à son insertion et sera illisible par la suite... donc vous éprouverez des problèmes d'authentification.

Share this post


Link to post
Share on other sites

je vous poste ce tuto, inspiré de celui de ubuntu.fr et modifié pour ma config avec quelques plus, merci de corriger si vous voyez un truc mais je pense que tt est correct.

Système Debian Lenny 5.0.4 – noyaux 2.6.26-2amd64 sur x86_64

vsftpd 2.0.7-1

MySQL 5.0.51a-24+lenny3

libpam-mysql 0.6.2-1

mysql-client 5.0.51a-24+lenny3

phpmyadmin 2.11.8.1-5+lenny4

openssl 0.9.8g-16+lenny6

 Dans ce tuto j'utilise le nom d'hôte server1,example.com avec l'adresse IP 192.168.0.100. Ces données peuvent changer chez vous, donc vous devez les remplacer.

2 Installation de vsftpd, MySQL et phpMyAdmin

Vsftpd n'est pas supporté en natif par MySQL, donc nous utiliserons PAM pour s'identifier dans la base de donnée MySQL. Nous devons installer libpam-mysql en plus de vsftpd, MySQL, et phpMyAdmin:

apt-get update

apt-get upgrade

apt-get install vsftpd libpam-mysql mysql-server mysql-client phpmyadmin

créons un utilisateur root avec mot de passe pour MySQL (remplacer yourrootsqlpassword avec le mot de passe que vous voulez utiliser):

mysqladmin -u root password yourrootsqlpassword

On vérifie:

netstat -tap | grep mysql

Si ça donne quelque chose comme ça:

tcp 0 0 localhost.localdomain:mysql *:* LISTEN 2713/mysqld

MySQL écoute sur localhost.localdomain seulement, on est en sécurité. Mais si ça donne quelque chose comme ça:

tcp 0 0 *:mysql *:* LISTEN 2713/mysqld

On doit donner un mot de passe MySQL pour le hostname également, sinon l'accès ne serait pas complétement sécurisé et n'importe qui pourrait avoir accès a la table:

mysqladmin -h server1.example.com -u root password yourrootsqlpassword

3 Création de la base MySQL pour vsftpd

Nous allons créer un base de donnée nommée vsftpd et un utilisateur MySQL nommé vsftpd que le daemon vsftpd utilisera pour ce connecter à la base vsftpd:

mysql -u root -p

CREATE DATABASE vsftpd;

GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON vsftpd.* TO 'vsftpd'@'localhost' IDENTIFIED BY 'ftpdpass';

GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON vsftpd.* TO 'vsftpd'@'localhost.localdomain' IDENTIFIED BY 'ftpdpass';

FLUSH PRIVILEGES;

Replacer ftpdpass par le mot de passe que vous voulez utiliser pour l'utilisateur vsftpd. Puis nous créons la table accounts:

USE vsftpd;

CREATE TABLE `accounts` (`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,

`username` VARCHAR( 30 ) NOT NULL ,`pass` VARCHAR( 50 ) NOT NULL ,UNIQUE (

`username`)) ENGINE = MYISAM ;

quit;

Nous somme maintenant revenus dans le shell Linux.

4 Configuration de vsftpd

4.1 User vsftpd

Premièrement création d'un user sans privilèges vsftpd (avec en homedir /home/vsftpd) dans le groupe nogroup. On fait tourner vsftpd avec cet user, le dossier FTP de nos users virtuels sera dans /home/vsftpd/$USER (/home/vsftpd/user1, /home/vsftpd/user2, etc.).

useradd --home /home/vsftpd --gid nogroup -m --shell /bin/false vsftpd

4.2 config de /etc/vsftpd.conf

On fait un backup du fichier de conf original /etc/vsftpd.conf et on crée le notre:

cp /etc/vsftpd.conf /etc/vsftpd.conf_orig

cat /dev/null > /etc/vsftpd.conf

vi /etc/vsftpd.conf

Contenu du nouveau fichier:

listen=YES

listen_port=21

anonymous_enable=NO

local_enable=YES

write_enable=YES

#chmod des dossiers en 755 et fichiers en 644

local_umask=022

#personnaliser texte d'accueil

ftpd_banner=Bienvenue

dirmessage_enable=YES

xferlog_enable=YES

connect_from_port_20=YES

nopriv_user=vsftpd

user_config_dir=/etc/vsftpd_user_conf

#Partie utilisateurs virtuels

chroot_local_user=YES

secure_chroot_dir=/var/run/vsftpd

pam_service_name=vsftpd

guest_enable=YES

guest_username=vsftpd

local_root=/home/vsftpd/$USER

user_sub_token=$USER

virtual_use_local_privs=YES

# Activation du SSL

ssl_enable=YES

#chemin du certificat SSL

rsa_cert_file=/etc/ssl/certs/vsftpd.pem

# 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

#Passer en mode passif et attribution des ports 3000 à 3005 pour

# le transfert des fichiers

pasv_enable=YES

pasv_min_port=3000

pasv_max_port=3005

Les autres options de config sont expliquées sur http://vsftpd.beasts.org/vsftpd_conf.html. Les options nécessaires pour notre config avec utilisateurs virtuels sont: chroot_local_user, guest_enable, guest_username, user_sub_token, local_root, and virtual_use_local_privs.

En complément de user_config_dir on peut spécifier un fichier de config par user qui remplacera/complétera la config globale. C'est totalement optionnel, mais nous créons quand même le dossier en prévision:

mkdir /etc/vsftpd_user_conf

4.3 /etc/pam.d/vsftpd

Maintenant on configure PAM qui sera utilisé pour faire la liaison avec notre base MySQL pour l'authentification de nos users virtuels à la place de /etc/passwd et /etc/shadow. La configuration de PAM pour vsftpd est dans /etc/pam.d/vsftpd. On crée un backup de l'original et on crée la nôtre:

cp /etc/pam.d/vsftpd /etc/pam.d/vsftpd_orig

cat /dev/null > /etc/pam.d/vsftpd

vi /etc/pam.d/vsftpd

auth required pam_mysql.so user=vsftpd passwd=ftpdpass host=localhost db=vsftpd table=accounts usercolumn=username passwdcolumn=pass crypt=2

account required pam_mysql.so user=vsftpd passwd=ftpdpass host=localhost db=vsftpd table=accounts usercolumn=username passwdcolumn=pass crypt=2

Attention remplacez le password MySQL par le votre!

On redémarre vsftpd:

/etc/init.d/vsftpd restart

4.4 Création du certificat SSL

Apt-get install openssl

mkdir ~/SSL-cert-vsftpd && cd ~/SSL-cert-vsftpd

openssl req -x509 -nodes -days 730 -newkey rsa:1024 -keyout vsftpd.pem -out vsftpd.pem

Openssl va vous poser quelques questions, la plus critique est celle ci :

Common Name (eg, YOUR name) []: example.com

ICreating and Using a self signed SSL Certificates in debian

Un certificat, vsftpd.pem, a été généré dans le dossier SSL-cert-vsftpd de votre dossier personnel.

Copions le dans /etc/ssl/certs/ :

sudo cp ~/SSL-cert-vsftpd/vsftpd.pem /etc/ssl/certs/

Sécurisons le :

sudo chown root:root /etc/ssl/certs/vsftpd.pem

sudo chmod 600 /etc/ssl/certs/vsftpd.pem

Note : vsftp s'exécute avec les droits de l'utilisateur nobody mais il se lance en tant que root et donc lit le certificat en tant que root.

5 Création du premier User virtuel

On rentre avec dans le shell MySQL et on ce loggue sous vsftpd:

mysql -u root -p

USE vsftpd;

Maintenant on crée le user testuser avec le password secret (Nous utilisons la commande PASSWORD pour stocker le password encrypté):

INSERT INTO accounts (username, pass) VALUES('testuser', PASSWORD('secret'));

quit;

Le dossier racine de testuser sera /home/vsftpd/testuser; malheureusement vsftpd ne crée pas ce dossier automatiquement. Donc on le crée nous même et on donne les bon droits et utilisateur:

mkdir /home/vsftpd/testuser

chown vsftpd:nogroup /home/vsftpd/testuser

cd ~vsftpd

chmod 755 testuser

Maintenant on ouvre un client FTP (comme WS_FTP ou SmartFTP sous Windows ou gFTP sous Linux, FileZilla fonctionne aussi) et essayez de vous connecter.

Hostname: 192.168.0.100

Login: testuser

password: vsftpd

Server Type: FTPES - FTP plus explicite (TLS/SSL)

Vous êtes connectés, !!! n'oubliez pas le firewall,sinon....y'a plus qu'a tout revérifier...

6 Configuration de shorewall

Le module FTP de Shorewall est fait pour un FTP actif on ne l'utilisera pas à la place on crée nos propres régles à ajouter dans /etc/shorewall/rules

#SECTION VSFTPD

ACCEPT net $FW TCP 21

ACCEPT net $FW TCP 3000:3005

7 Configuration fail2ban (optionnel)

Activer la jail pour vsftpd dans jail.conf:

vi /etc/fail2ban/jail.conf

[vsftpd]

enabled = true

port = ftp,ftp-data,ftps,ftps-data

filter = vsftpd

logpath = /var/log/vsftpd.log

# or overwrite it in jails.local to be

# logpath = /var/log/auth.log

# if you want to rely on PAM failed login attempts

# vsftpd's failregex should match both of those formats

maxretry = 3

et modifier le filtre standart de vsftpd:

vi /etc/fail2ban/filter.d/vsftpd.conf

[Definition]

# Option: failregex

# Notes.: regex to match the password failures messages in the logfile. The

# host must be matched by a group named "host". The tag "<HOST>" can

# be used for standard IP/hostname matching and is only an alias for

# (?:::f{4,6}:)?(?P<host>\S+)

# Values: TEXT

#

#Ancienne entrée

#failregex = vsftpd(?:\(pam_unix\))?(?:\[\d+\])?:.* authentication failure; .* rhost=<HOST>(?:\s+user=\S*)?\s*$

# \[.+\] FAIL LOGIN: Client "<HOST>"\s*$

#Nouvelle entrée pour mysqlauth dans vsftpd.log

failregex = .* FAIL LOGIN: Client \"<HOST>\"$

# Option: ignoreregex

# Notes.: regex to ignore. If this regex matches, the line is ignored.

# Values: TEXT

#

ignoreregex =

8 Administration de la base

Pour beaucoup de gens il est plus facile d'utiliser une interface graphique pour MySQL; vous pouvez donc utiliser phpMyAdmin (à cette adresse http://server1.example.com/phpmyadmin/) pour gérer la base.

Si vous créez ou modifiez un user, assurez-vous d'utiliser PASSWORD pour encrypter le password. Et n'oubliez pas de créer le dossier racine du user.

Share this post


Link to post
Share on other sites

×
×
  • Create New...