Hébergement Virtuel · 3 min read · Dec 16, 2025
Hébergement Virtuel Avec vsftpd Et PostgreSQL
Hébergement Virtuel Avec vsftpd Et PostgreSQL
Ce document décrit comment installer un serveur vsftpd qui utilise des utilisateurs virtuels à partir d’une base de données PostgreSQL au lieu d’utilisateurs système réels. Je n’ai pas trouvé de tutoriel comme ça sur Internet, donc quand cette configuration a enfin fonctionné pour moi, j’ai décidé de la publier. La documentation est basée sur FreeBSD 6.2 que j’ai récemment été contraint d’utiliser (j’utilise généralement Debian). Néanmoins, le document devrait convenir à presque toutes les distributions Linux également (peut nécessiter de très petites modifications).
OK, commençons.
Packages Requis
- vsftpd
- Serveur/Client PostgreSQL 7.4+
- PAM_PGSQL
Installation
1. PostgreSQL
#cd /usr/ports/database/postgresql-server82
make install clean
Définissez votre locale postgres avant initdb :
#vi /usr/local/pgsql/.cshrc: setenv PGLIB /usr/local/lib
setenv PGDATA $HOME/data
#Vous voudrez peut-être définir certaines choses de locale ici
setenv PGDATESTYLE ISO
setenv LC_ALL pl_PL.ISO_8859-2
Installez le cluster de base de données avec le bon encodage (pris de LC_ALL) :
su - pgsql
initdb -E latin2
2. PAM-PGSQL
cd /usr/ports/security/pam-pgsql
make install clean
Assurez-vous que pam-pgsql.so est dans /usr/lib. Si vous obtenez un SEGFAULT, il est très probable que pam_pgsql ne soit pas dans le bon chemin (j’ai rencontré ce problème lorsque j’ai essayé pam_pwdfile).
ls /usr/lib/pam_pgsql.so
/usr/lib/pam_pgsql.so
3. vsftpd
cd /usr/ports/ftp/vsftpd
make install clean
echo “vsftpd_enable=\”YES\”” >> /etc/rc.conf
adduser vsftpd
4. Et Maintenant … Exemples Fonctionnels De Fichiers De Configuration
vsftpd - est le nom du fichier de configuration pam /etc/pam.d/vsftpd.
vsftpd - est le nom de l’utilisateur récemment ajouté (l’utilisateur a besoin de droits d’accès en écriture à localroot de l’exemple local_umask=0000 - je voulais que les fichiers soient stockés avec chmod 77x).
#vi /usr/local/etc/vsftpd.conf:
listen=YES
anonymous_enable=NO
local_enable=YES
virtual_use_local_privs=YES
write_enable=YES
connect_from_port_20=YES
secure_chroot_dir=/usr/local/share/vsftpd/empty
pam_service_name=vsftpd
guest_enable=YES
user_sub_token=$USER
local_root=/usr/local/www/apache22/data/$USER
chroot_local_user=YES
hide_ids=YES
ftpd_banner=Bienvenue sur le serveur FTP
file_open_mode=0770
local_umask=0000
anon_mkdir_write_enable=NO
guest_username=vsftpd
Par défaut, pam_pgsql recherche la configuration dans le fichier /etc/pam_pgsql.conf. Je pourrais penser à une configuration où j’authentifie différents services par rapport à différentes tables dans la base de données postgres.
L’option config_file fait le travail - voici à quoi ressemble le fichier :
#vi /etc/pam.d/vsftpd:
auth required pam_pgsql.so config_file=/etc/pam_pgsql_vsftpd.conf
account required pam_pgsql.so config_file=/etc/pam_pgsql_vsftpd.conf
#vi /usr/local/pgsql/data/pg_hba.conf:
host system system 127.0.0.1 255.255.255.255 md5 local all pgsql ident sameuser
local all all ident sameuser
0.0.0.0 md5 host sameuser all 0.0.0.0 0.0.0.0 md5 host all all 0.0.0.0 0.0.0.0 reject
#vi/etc/pam_pgsql_vsftpd.conf:
debug
pw_type = md5
connect = hostaddr=127.0.0.1 port=5432 dbname=system user=system password=pass connect_timeout=15
auth_query = select s_password from accounts where s_username = %u
acct_query = select b_expired as acc_expired, 0 as acc_new_pwreq, (s_password ISNULL OR s_password = ‘’) as user_password from accounts where s_username = %u
Créons la table postgres et un utilisateur de test :
#su - pgsql
#psql system
Bienvenue dans psql 8.2.4, le terminal interactif PostgreSQL.
Tapez : \copyright pour les termes de distribution
\h pour l’aide avec les commandes SQL
\? pour l’aide avec les commandes psql
\g ou terminez par un point-virgule pour exécuter la requête
\q pour quitter
system=# CREATE TABLE “accounts”(
“i_id” SERIAL,
“s_username” VARCHAR(30) NOT NULL,
“s_password” VARCHAR(50),
“b_expired” BOOLEAN DEFAULT false,
CONSTRAINT “accounts_s_username_key” UNIQUE(“s_username”)
);
NOTICE: CREATE TABLE créera une séquence implicite “accounts_i_id_seq” pour la colonne serial “accounts.i_id”
NOTICE: CREATE TABLE / UNIQUE créera un index implicite “accounts_s_username_key” pour la table “accounts”
CREATE TABLE
system=# insert into accounts(s_username, s_password) values(‘testuser’,md5(‘secret_pass’));
INSERT 0 1
system=# select * from accounts;
i_id | s_username | s_password | b_expired
——+————+———————————-+———–
1 | testuser | baeed6d497bd4f4676306544a0e7faba | f
(1 row)
Créons un dossier pour notre nouvel utilisateur virtuel :
mkdir /usr/local/www/apache22/data/testuser
chown vsftpd:vsftpd /usr/local/www/apache22/data/testuser
ls -la /usr/local/www/apache22/data/testuser
Démarrons vsftpd au démarrage du système :
#vi /usr/local/etc/rc.d/vsftpd:
#!/bin/sh
/usr/local/libexec/vsftpd &
Démarrons vsftpd tout de suite :
#/usr/local/etc/rc.d/vsftpd
… et vsftpd devrait fonctionner correctement maintenant.
Je suis conscient que certaines choses pourraient être faites différemment, mais ce document devrait être suffisamment bon pour vous guider.
Recevez de nouveaux articles dans votre boîte de réception.
Aucun spam. Désabonnez-vous à tout moment.