делать надо так:
# cd /etc/vsftpd
# vim vusers.txt
site1.com
site1_password
site2.com
site2_password
На основе этого файла сгенерируем базу данных Berkley, которая будет использоваться PAM для аутентификации наших виртуальных пользователей и поместим полученный файл в директорию /etc/vsftpd (чтобы по феншую)
# db_load -T -t hash -f vusers.txt vsftpd-virtual-user.db
Шаг 3. Зададим файл конфигурации PAM для vsftpd использующий сгенерированную базу данных. Создадим файл /etc/pam.d/vsftpd-virtual
#%PAM-1.0
auth required pam_userdb.so db=/etc/vsftpd/vsftpd-virtual-user
account required pam_userdb.so db=/etc/vsftpd/vsftpd-virtual-user
session required pam_loginuid.so
Внимание! Путь к файлу базы данных в конфигурации PAM задаётся без расширения .db, хотя такое расширение у файла имеется! В противном случае, PAM будет говорить о том, что не нашёл указанный файл. Это очень странная особенность с которой приходится считаться
Шаг 4. Теперь необходимо сконфигурировать сам vsftpd. Зададим содержимое файла /etc/vsftpd/vsftpd.conf:
# Отключает анонимный доступ
anonymous_enable=NO
# Включает не-анонимный (sic!) доступ
local_enable=YES
# Активирует поддержку виртуальных пользователей
guest_enable=YES guest_username=ftp
# Виртуальные пользователи используют локальный привилегии (а не анонимные)
virtual_use_local_privs=YES
# Включает поддержку записи
write_enable=YES
# Файл конфигурации PAM для vsftpd. Совпадает с именем файла конфигурации в /etc/pam.d
pam_service_name=vsftpd-virtual
# Следующие две строчки определяют локальные директории для пользователей
# В данном случае это будут /var/www/<имя пользователя>
user_sub_token=$USER
local_root=/var/www/$USER
# Виртуальные пользователи ограничены своим каталогом
chroot_local_user=YES
# Убирает передачу реальных идентификаторов групп и пользователей файлов
hide_ids=YES
# Запустить
# vsftpd listen=YES
# Слушать данные на порту 20
# connect_from_port_20=YES
# Маска для создания новых файлов
local_umask=022
Полный конфиг
listen=YES
listen_port=21
ftp_data_port=20
connect_from_port_20=YES
nopriv_user=ftp
ftp_username=ftp
idle_session_timeout=300
port_enable=YES
anonymous_enable=YES
anon_root=/home/ftp/anonymous
no_anon_password=YES
anon_mkdir_write_enable=NO
anon_other_write_enable=NO
anon_upload_enable=NO
chown_uploads=YES
chown_username=ftp
anon_umask=022
local_enable=YES
local_root=/home/ftp/$USER
chroot_local_user=YES
local_umask=022
chmod_enable=YES
banner_file=/etc/vsftpd/banner
dirmessage_enable=YES
message_file=.message
dirlist_enable=YES
ls_recurse_enable=NO
mdtm_write=YES
deny_file={.message}
use_localtime=YES
guest_enable=YES
guest_username=ftp
user_config_dir=/etc/vsftpd/user_config/$USER
user_sub_token=$USER
download_enable=YES
write_enable=YES
ascii_download_enable=YES
ascii_upload_enable=YES
lock_upload_files=YES
virtual_use_local_privs=YES
pam_service_name=vsftpd
secure_chroot_dir=/var/run/vsftpd