Виртуальные ФТП-серверы на базе VSFTPD

Введение

В статье рассматривается один из способов создания виртуальных FTP серверов на базе "самого быстрого и безопасного" FTP демона - VSFTPD. В примере рассматривается создание двух виртуальных серверов. Первый - полностью анонимный, с двумя директориями pub и incoming (наверное самый распространенный вариант). В каталоге incoming пользователи смогут создавать директории, загружать и скачивать файлы. Удалять закачанное - нельзя. В будущем содержимое этой директории должно анализироваться администратором ftp сервера.
Администратор должен удалять мусор а все нужное и полезное перемещать в директорию pub. К директории pub пользователи имеет доступ только для чтения. Второй - с доступом только по учетным записям. Аккаунт anonymous отсутствует. "Изюминка" его реализации - индивидуальная конфигурация для каждого пользователя. Итак, начнем...

Теория реализации виртуальных FTP серверов

Виртуальные хосты на VSFTPD можно организовать двумя способами. Первый способ: запустить нужное количество серверов в режиме демона и в конфигурационном файле каждого сервера указать слушаемые IP адреса listen_address=x.x.x.x. Т.е. если нужно 10 вируальных FTP серверов - нужно запусть 10 копий vsftpd. Как видно это не самый лучший способ. Врядли к этим 10 серверам постоянно будут подключены клиенты. Гораздо экономнее запускать VSFTPD по требованию от суперсервера.

Установка сервера
Нам необходимы пакеты vsftpd и xinetd.


Создание общей структуры каталогов

В директории /etc/vsftpd создать директории для каждого из них Например у нас будут 2 ftp на адресах 192.168.1.19 (ftp1) и 192.168.1.20 (ftp2).

# mkdir /etc/vsftpd/192.168.1.19
# mkdir /etc/vsftpd/192.168.1.20

Скопируем в эти каталоги конфигурационный файл.

# cp /etc/vsftpd.conf /etc/vsftpd/192.168.1.19/vsftpd.conf
# cp /etc/vsftpd.conf /etc/vsftpd/192.168.1.20/vsftpd.conf

Тоже касается и логов. Создаем директорию /var/log/vsftpd. В ней будут
файлы с логами соответствующих виртуальных FTP серверов. Т.е. в
/etc/vsftpd/192.168.1.19/vsftpd.conf ищем строчку

xferlog_file=/var/log/vsftpd.log

и меняем ее на

xferlog_file=/var/log/vsftpd/192.168.1.19.log

Тоже самое для второго FTP.

Прописываем создание двух дополнительных IP адресов при запуске. Создаём файл /etc/sysconfig/networking-scripts/ifcfg-eth0:1

[root@ftp network-scripts]# cat ifcfg-eth0:1
# Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE]
DEVICE=eth0:1
BOOTPROTO=static
BROADCAST=192.168.1.255
HWADDR=00:50:56:83:4E:54
IPADDR=192.168.1.20
NETMASK=255.255.255.0
NETWORK=192.168.1.0
ONBOOT=yes

Добавим записи о FTP серверах в DNS (прямая зона)

ftp1 IN A 192.168.1.19
ftp2 IN A 192.168.1.20

Создаём файлы в директории /etc/xinetd.d ftp19 и ftp20

[root@ftp xinetd.d]# cat ftp19
# default: off
# description: The kerberized FTP server accepts FTP connections \
# that can be authenticated with Kerberos 5.
service ftp
{
flags = REUSE
socket_type = stream
wait = no
bind = 192.168.1.19
user = root
server = /usr/sbin/vsftpd
server_args = /etc/vsftpd/192.168.1.19/vsftpd.conf
log_on_failure += USERID
disable = no
}

[root@ftp xinetd.d]# cat ftp20
# default: off
# description: The kerberized FTP server accepts FTP connections \
# that can be authenticated with Kerberos 5.
service ftp
{
flags = REUSE
socket_type = stream
wait = no
bind = 192.168.1.20
user = root
server = /usr/sbin/vsftpd
server_args = /etc/vsftpd/192.168.1.20/vsftpd.conf
log_on_failure += USERID
disable = no
}

Перезапустим xinetd

# service xinetd restart

Теперь xinetd в зависимости на какой IP обратились, будет запускать vsftpd с соответствующими конфигурационными файлами. Внимание: интерфейсы и записи в DNS должны существовать до того как будет перезапущен xinetd! Иначе ничего не получиться. Т.е. сначала создаем интерфейсы (или дополнительные IP адреса), если будет использоваться DNS - прописываем адреса в DNS и только потом запускаем/перезапускаем xinetd.

Настройка анонимного сервера

Создадим струткуру каталогов для анонимного сервера. Директория incoming предназначена для закачки файлов пользователями. pub - только для скачивания.

Структура анонимного FTP сервера:

# mkdir /var/ftp/192.168.1.19
# mkdir /var/ftp/192.168.1.19/incoming
# mkdir /var/ftp/192.168.1.19/pub

Для anonymous пользователя корневым будут каталог
/var/ftp/192.168.1.19. Тем самым создается иллюзия что это разные
серверы. Хотя на самом деле - просто разные директории.

Пропишем это в конфигруационном файле:

anon_root=/var/ftp/192.168.1.19

Чтобы сделать директорию incoming доступной для записи - нужно
установить ее в группу ftp и дать этой группе права на запись.

# chgrp -R ftp /var/ftp/192.168.1.19/incoming/
# chmod -R g+w /var/ftp/192.168.1.19/incoming/

Вот в принципе и все. На этом можно считать настройку анонимного ftp сервера законченной. Вот листинг конфигурационного файла

[root@ftp 192.168.1.19]# cat vsftpd.conf
anonymous_enable=YES
write_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_umask=022
file_open_mode=0777
anon_root=/var/ftp/192.168.1.19
local_enable=NO
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_file=/var/log/vsftpd/192.168.1.19.log
xferlog_std_format=YES

Настройка сервера с доступом только по учетным записям

Создадим файл userlist, в который будем прописывать пользователей
которым разрешен доступ на FTP.

# touch /etc/vsftpd/192.168.1.20/userlist

Пропишем в него первым делом самого себя у меня это пользователь
ftpadmin Создадим директорию для хранения индивидульных настроек для каждого пользователя

# mkdir /etc/vsftpd/192.168.1.20/users

Создадим в этом каталоге файл для настроек пользователя ftpadmin

# touch /etc/vsftpd/192.168.1.20/users/ftpadmin

Пропишем в него все права и корневую директорию. Добавим:

cmds_allowed=ABOR,MKD,CWD,DELE,LIST,MDTM,NLST,PASS,PASV,PORT,PWD,QUIT,RETR,RMD,RNFR,RNTO,SIZE,
STOR,TYPE,USER,ACCT,APPE,CDUP,HELP,MODE,NOOP,REIN,STAT,STOU,STRU,SYST


local_root=/var/ftp/192.168.1.20/

Сообщим vsftpd о том, что мы будем использовать индивидуальные настройки для каждого пользователя. Добавим в
/etc/vsftpd/192.168.1.20/vsftpd.conf следующие строки:

[root@ftp 192.168.1.20]# cat vsftpd.conf
anonymous_enable=NO
file_open_mode=0777
local_enable=YES
userlist_enable=YES
userlist_deny=NO
userlist_file=/etc/vsftpd/192.168.1.20/userlist
user_config_dir=/etc/vsftpd/192.168.1.20/users
chroot_local_user=YES
write_enable=YES
local_umask=0007
ftpd_banner=Welcome to FTP server by ZayDen
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_file=/var/log/vsftpd/192.168.1.20.log
xferlog_std_format=YES
ls_recurse_enable=YES

если хотите можно использовать аутентификацию через PAM

pam_service_name=vsftpd

[root@ftp pam.d]# cat vsftpd
#%PAM-1.0
session optional pam_keyinit.so force revoke
auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
auth required pam_shells.so
auth include system-auth
account include system-auth
session include system-auth
session required pam_loginuid.so

если хотите можно использрвать tcp_wrappers для безопасности

tcp_wrappers=YES

тогда необходимо добавлять адреса в файлы /etc/hosts.deny и /etc/hosts.allow

ПРИМЕР

Для примера, также создадим пользователя webmaster, который в теории должен через этот FTP заливать файлы на корпоративный сайт.

# adduser webmaster

Установим пароль

# passwd webmaster

В директории /var/ftp/192.168.1.20/users/ создадим файл настроек пользователя webmaster.

# touch /var/ftp/192.168.1.20/users/webmaster

Пропишем в него директорию в которая будет корневой для пользователя (в данном случае директория с сайтом)

local_root=/var/www/www.mysite.lan/

Сменим группу и пользователя директории с сайтом на webmaster:users

# chown -R webmaster:users /var/www/www.mysite.lan

Чтобы webmaster мог быстро перейти на сайт зайдя например по SSH или с SAMBA, в его домашней директории создадим символьную ссылку на директорию с web сайтом.

# ln -s /var/www/www.mysite.lan /home/webmaster/www

Вот в принципе и все. Можно проверять.