Задача: настроить индивидуальный 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-сервер мог сам выставлять права на созданные файлы и каталоги