Servidor FTP · 3 min read · Dec 16, 2025

Alojamiento Virtual Con vsftpd Y PostgreSQL

Alojamiento Virtual Con vsftpd Y PostgreSQL

Este documento describe cómo instalar un servidor vsftpd que utiliza usuarios virtuales de una base de datos PostgreSQL en lugar de usuarios reales del sistema. No pude encontrar ningún tutorial como ese en internet, así que cuando esa configuración finalmente funcionó para mí, decidí publicarlo. La documentación se basa en FreeBSD 6.2 que recientemente me vi obligado a usar (normalmente uso Debian). Sin embargo, el documento debería ser adecuado para casi cualquier distribución de Linux también (puede requerir enmiendas muy pequeñas).

OK, comencemos.

Paquetes Requeridos

  • vsftpd
  • Servidor/Cliente PostgreSQL 7.4+
  • PAM_PGSQL

Instalación

1. PostgreSQL

#cd /usr/ports/database/postgresql-server82
make install clean

Establece tu configuración regional de postgres antes de initdb:

#vi /usr/local/pgsql/.cshrc: setenv PGLIB /usr/local/lib

setenv PGDATA $HOME/data

#Es posible que desees establecer algunas configuraciones regionales aquí
setenv PGDATESTYLE ISO
setenv LC_ALL pl_PL.ISO_8859-2

Instala el clúster de base de datos con la codificación correcta (tomada de LC_ALL):

su - pgsql
initdb -E latin2

2. PAM-PGSQL

cd /usr/ports/security/pam-pgsql
make install clean

Asegúrate de que pam-pgsql.so esté en /usr/lib. Si obtienes SEGFAULT, lo más probable es que pam_pgsql no esté en la ruta correcta (encontré ese problema cuando intenté 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. Y Ahora … Ejemplos Funcionales De Archivos De Configuración

vsftpd - es el nombre del archivo de configuración pam /etc/pam.d/vsftpd.

vsftpd - es el nombre del usuario agregado recientemente (el usuario necesita derechos de acceso de escritura a localroot del ejemplo local_umask=0000 - quería que los archivos se almacenaran con 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=Bienvenido al servidor FTP
file_open_mode=0770
local_umask=0000
anon_mkdir_write_enable=NO
guest_username=vsftpd

Por defecto, pam_pgsql está buscando la configuración en el archivo /etc/pam_pgsql.conf. Podría pensar en una configuración donde autentico diferentes servicios frente a diferentes tablas en la base de datos postgres.

El interruptor config_file hace el trabajo - así es como se ve el archivo:

#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

Creemos la tabla de postgres y un usuario de prueba:

#su - pgsql
#psql system

Bienvenido a psql 8.2.4, el terminal interactivo de PostgreSQL.

Escribe: \copyright para términos de distribución
\h para ayuda con comandos SQL
\? para ayuda con comandos psql
\g o termina con punto y coma para ejecutar la consulta
\q para salir

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 creará una secuencia implícita “accounts_i_id_seq” para la columna serial “accounts.i_id”
NOTICE: CREATE TABLE / UNIQUE creará un índice implícito “accounts_s_username_key” para la tabla “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)

Creemos una carpeta para nuestro nuevo usuario virtual:

mkdir /usr/local/www/apache22/data/testuser
chown vsftpd:vsftpd /usr/local/www/apache22/data/testuser
ls -la /usr/local/www/apache22/data/testuser

Hagamos que vsftpd se inicie al arrancar el sistema:

#vi /usr/local/etc/rc.d/vsftpd:

#!/bin/sh
/usr/local/libexec/vsftpd &

Hagamos que vsftpd se inicie ahora mismo:

#/usr/local/etc/rc.d/vsftpd

… y vsftpd debería funcionar bien ahora.

Soy consciente de que algunas cosas podrían hacerse de manera diferente, pero este documento debería ser lo suficientemente bueno para guiarte.

Share: X/Twitter LinkedIn

Recibe nuevas publicaciones en tu bandeja de entrada.

No spam. Cancela la suscripción en cualquier momento.