За основу взята статья Как настроить FTP с виртуальными пользователями на CentOS и сохранить рассудок

Задача: настроить индивидуальный FTP-доступ к директориям веб-сайтов (/var/www/<имя хоста>) на основе виртуальных пользователей в ОС CentOS 6.5. Настройка простого FTP-доступа с виртуальными пользователями в Linux это, как оказалось, сложная и многоуровневая административная задача, сравнимая со самостоятельной сборкой среднего по размерам приложения

Шаг 1. Итак, для начала необходимо установить сам FTP-сервер. Будем использовать самый распространённый для CentOS сервер vsftpd (Very Secure FTP Daemon, ага). Установим его:

# yum install vsftpd  тут все ясно проблем не возникло.

Шаг 2. Сервер vsftpd использует систему аутентификации PAM (Pluggable Authentication Modules) и для настройки виртуальных пользователей нам понадобится именно она. Имена пользователей, для простоты установки, должны совпадать с названиями директорий веб-сайтов в папке /var/www. Создадим в произвольной директории временный файл, который будет описывать логины и пароли наших виртуальных пользователей, например, …а вот и не в произвольной, если создавать в произвольной директории то получим ошибку db_load: no database type specified

делать надо так:

# 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

Шаг 5. Теперь о самой интересной части — задание совместных чтения/записи в каталоги веб-сайтов одновременно для FTP и веб-сервера. Так как оба этих сервиса используют разных пользователей для обращения к файловой системе, единственным разумным способом (кроме, конечно, раздачи прав на запись/чтение в каталоги веб-сайтов для всех желающих) является объединение этих пользователей в одну группу, имеющую соответствующие права. Я решил не мудрствовать лукаво и просто сменить группу пользователя ftp на www-data (которая используется веб-сервером) и в Centos называется apache

# usermod -g apache ftp

Теперь необходимо задать групповые права для каталогов веб-сайтов:

# chown -R apache:apache /var/www/site1.com

# chmod -R g+rws /var/www/site1.com

Флаг +s нужен для того, чтобы FTP-сервер мог сам выставлять права на созданные файлы и каталоги