Виртуальный хостинг · 3 min read · Dec 16, 2025
Виртуальный хостинг с vsftpd и PostgreSQL
Виртуальный хостинг с vsftpd и PostgreSQL
Этот документ описывает, как установить сервер vsftpd, который использует виртуальных пользователей из базы данных PostgreSQL вместо реальных системных пользователей. Я не смог найти ни одного учебника на эту тему в интернете, поэтому, когда эта конфигурация наконец заработала для меня, я решил опубликовать её. Документация основана на FreeBSD 6.2, которую мне недавно пришлось использовать (обычно я использую Debian). Тем не менее, документ должен быть подходящим для почти любой дистрибуции Linux (может потребоваться очень небольшие изменения).
Хорошо, давайте начнем.
Необходимые пакеты
- vsftpd
- PostgreSQL Server/Client 7.4+
- PAM_PGSQL
Установка
1. PostgreSQL
#cd /usr/ports/database/postgresql-server82
make install clean
Установите локаль postgres перед initdb:
#vi /usr/local/pgsql/.cshrc: setenv PGLIB /usr/local/lib
setenv PGDATA $HOME/data
#Вы можете захотеть установить некоторые параметры локали здесь
setenv PGDATESTYLE ISO
setenv LC_ALL pl_PL.ISO_8859-2
Установите кластер базы данных с правильной кодировкой (взято из LC_ALL):
su - pgsql
initdb -E latin2
2. PAM-PGSQL
cd /usr/ports/security/pam-pgsql
make install clean
Убедитесь, что pam-pgsql.so находится в /usr/lib. Если вы получите SEGFAULT, скорее всего, pam_pgsql не находится в правильном пути (я столкнулся с этой проблемой, когда пытался использовать 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. А теперь … Рабочие примеры конфигурационных файлов
vsftpd - это имя файла конфигурации pam /etc/pam.d/vsftpd.
vsftpd - это имя недавно добавленного пользователя (пользователю нужны права на запись в localroot из примера local_umask=0000 - я хотел, чтобы файлы хранились с 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=Добро пожаловать на FTP сервер
file_open_mode=0770
local_umask=0000
anon_mkdir_write_enable=NO
guest_username=vsftpd
По умолчанию pam_pgsql ищет конфигурацию в файле /etc/pam_pgsql.conf. Я мог бы подумать о настройке, где я аутентифицирую разные службы по сравнению с разными таблицами в базе данных postgres.
Параметр config_file выполняет свою работу - вот как выглядит файл:
#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
Давайте создадим таблицу postgres и тестового пользователя:
#su - pgsql
#psql system
Добро пожаловать в psql 8.2.4, интерактивный терминал PostgreSQL.
Введите: \copyright для условий распространения
\h для помощи с SQL-командами
\? для помощи с командами psql
\g или завершите с помощью точки с запятой для выполнения запроса
\q для выхода
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 создаст неявную последовательность “accounts_i_id_seq” для серийного столбца “accounts.i_id”
NOTICE: CREATE TABLE / UNIQUE создаст неявный индекс “accounts_s_username_key” для таблицы “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)
Давайте создадим папку для нашего нового виртуального пользователя:
mkdir /usr/local/www/apache22/data/testuser
chown vsftpd:vsftpd /usr/local/www/apache22/data/testuser
ls -la /usr/local/www/apache22/data/testuser
Давайте запустим vsftpd при старте системы:
#vi /usr/local/etc/rc.d/vsftpd:
#!/bin/sh
/usr/local/libexec/vsftpd &
Давайте запустим vsftpd прямо сейчас:
#/usr/local/etc/rc.d/vsftpd
… и vsftpd теперь должен работать нормально.
Я понимаю, что некоторые вещи могут быть сделаны по-другому, но этот документ должен быть достаточно хорош, чтобы направить вас.
Get new posts in your inbox
No spam. Unsubscribe anytime.