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

Настройка простого FTP-доступа с виртуальными пользователями в Linux это, как оказалось, сложная и многоуровневая административная задача, сравнимая со самостоятельной сборкой среднего по размерам приложения.

 

 

Во-первых, необходимо сказать, что в общем случае лучше не настраивать FTP-доступ вообще и, вместо этого, настроить решение на основе SCP/SFTP. Однако, FTP для веб-сайтов может быть необходим в случаях, когда наполнением сайтов занимается команда контент-менеджеров и разработчиков, которым необходим постоянный доступ к файлам, а так же в случаях, когда вы бы не хотели создавать отдельные системные аккаунты для каждого пользователя.

Кроме того, если на вашем сервере настроен сетевой экран (файервол), у вас неизбежно возникнут проблемы с пассивным режимом передачи FTP и безопасностью этого экрана.

 

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

# yum install vsftpd

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

Создадим в произвольной директории временный файл, который будет описывать логины и пароли наших виртуальных пользователей, например, /home/khaos/vusers.txt с именами и паролями пользователей на отдельных строках, например:

site1.com
site1_password
site2.com
site2_password

На основе этого файла сгенерируем базу данных Berkley, которая будет использоваться PAM для аутентификации наших виртуальных пользователей и поместим полученный файл в директорию /etc/vsftpd (чтобы по феншую):

# db_load -T -hash -f /home/khaos/vusers.txt /etc/vsftpd/vusers.db

Шаг 3. Зададим файл конфигурации PAM для vsftpd использующий сгенерированную базу данных. Создадим файл /etc/pam.d/vsftpd-virtual:

#%PAM-1.0
auth required pam_userdb.so db=/etc/vsftpd/vusers
account required pam_userdb.so db=/etc/vsftpd/vusers
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 (которая используется веб-сервером):

# usermod -g www-data ftp

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

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

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

Шаг 6. Почти готово, остался один маленький нюанс. По-умолчанию в CentOS включен SELinux, который не позволит вам загружать файлы на FTP-сервер даже при наличии корректно настроенных прав. Для временного отключения применим команду:

# setenforce 0

Однако при следующей перезагрузке SELinux вновь заработает. Для постоянного отключения его функционала отредактируем файл /etc/selinux/config и изменим строчку SELINUX=enabled на SELINUX=disabled. Если вы являетесь ревнителем тотальной безопасности и не хотите отключать SELinux, можете настроить его для работы с FTP самостоятельно.

UPD. Предложен альтернативный вариант точечного отключения включения полных прав для FTPd в SELinux командой:

# setsebool -P ftpd_full_access on

Готово. Осталось включить сервер и добавить его в автозагрузку.

# service vsftpd start
# chkconfig vsftpd on

Уфф!

comments powered by HyperComments