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.

Share: X/Twitter LinkedIn

Recevez de nouveaux articles dans votre boîte de réception.

Aucun spam. Désabonnez-vous à tout moment.