Les pré-requis

PAM est normalement déjà là. Pour le reste il suffit d'exécuter yum install db4 db4-utils vsftpd

Paramétrage de vsftpd

Le serveur vsftpd est paramétré dans le fichier /etc/vsftpd/vsftpd.conf dont voici un exemple pour mon cas :

# Interdire les connexions anonymes au serveur
anonymous_enable=NO
anon_upload_enable=NO
anon_mkdir_write_enable=NO

# Autoriser les utilisateurs locaux (obligatoire même si on ne veut que des utilisateurs virtuels)
local_enable=YES

# Autoriser les utilisateurs virtuels
guest_enable=YES
guest_username=ftp

# Droits par défaut
local_root=/var/ftp
write_enable=NO
local_umask=020
hide_ids=YES

# Activer les droits spécifiques par utilisateur
user_config_dir=/etc/vsftpd/vsftpd_user_conf

# activation de logs
xferlog_enable=YES
xferlog_file=/var/log/vsftpd.xfer.log
xferlog_std_format=YES
log_ftp_protocol=YES
vsftpd_log_file=/var/log/vsftpd.log

# Configuration du serveur en standalone
listen=YES
tcp_wrappers=YES
connect_from_port_20=YES
ftpd_banner="Bienvenue sur le serveur FTP"

# Configuration de l'authentification
pam_service_name=vsftpd
userlist_enable=YES

Configuration des droits propres à chaque utilisateur

Pour chaque utilisateur, il faut créer un fichier portant le nom de l'utilisateur dans le répertoire défini par la directive user_config_dir.

Mon fichier /etc/vsftpd/vsftpd_user_conf/lecteur

anon_world_readable_only=NO
local_root=/var/ftp/

Mon fichier /etc/vsftpd/vsftpd_user_conf/crontibuteur

anon_world_readable_only=NO
local_root=/var/ftp2/

Configuration de l'authentification PAM avec une base db4

Créer le fichier /etc/pam.d/vsftpd suivant :

auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/login
account required /lib64/security/pam_userdb.so db=/etc/vsftpd/login

Ainsi, PAM va donc interroger la base BDB /etc/vsftpd/login.db pour authentifier les utilisateurs.

Créer la base BDB des utilisateurs

Il suffit de lancer le script suivant :

#!/bin/bash

FTPUSERS=/etc/vsftpd/login.db

rm -f $FTPUSERS

db_load -T -t hash $FTPUSERS <<EOF
lecteur
motdepasse_lecteur
contributeur
motdepasse_contributeur
EOF

chmod 600 $FTPUSERS

Pour redumper la base générée : db_dump -p login.db

Configuration de l'authentification PAM avec une base MySQL

Nécessite pam_mysql.

Créer le fichier /etc/pam.d/vsftpd suivant :

auth required pam_mysql.so user=MYSQL_USER passwd=MYSQL_PASS host=MYSQL_SRV db=MYSQL_DB table=USER_TABLE usercolumn=LOGIN_COLUMN passwdcolumn=PASS_COLUMN crypt=2
account required pam_mysql.so user=MYSQL_USER passwd=MYSQL_PASS host=MYSQL_SRV db=MYSQL_DB table=USER_TABLE usercolumn=LOGIN_COLUMN passwdcolumn=PASS_COLUMN crypt=2

Ainsi, pour authentifier les utilisateurs FTP, PAM va donc interroger la table USER_TABLE de la base MYSQL_DB sur le serveur MySQL MYSQL_SRV en s'authentifiant avec le user mysql MYSQL_USER et le mot de passe MYSQL_PASS. La colonne LOGIN_COLUMN contient le login FTP et la colonne PASS_COLUMN le mot de passe FTP stocké avec la fonction mysql PASSWORD().

Seul truc que j'aurai aimé faire mais qui ne semble pas possible, c'est stocker les paramètres vsftpd spécifiques aux utilisateurs (comme local_root) dans la base de données plutôt que dans un fichier pour faciliter l'admin.