VSFTPd - виртуальные серверы

Введение

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

 

Установка сервера
# installpkg vsftpd-2.0.5-i486-1.tgz

Создаем загрузочный скрипт /etc/rc.d/rc.vsftpd

#!/bin/sh

ftp_start()
{
   echo "Starting VSFTPD: "
   if ! ps axc | grep -q " vsftpd" ; then
       vsftpd &
   else
      echo "VSFTPD already running!"
   fi
}
ftp_stop()
{
   if ps axc | grep -q " vsftpd" ; then
       killall vsftpd
   else
      echo "VSFTPD not running!"
   fi
}

ftp_restart()
{
   ftp_stop
   sleep 1
   ftp_start
}
case "$1" in

'start')
  ftp_start
  ;;
'stop')
  ftp_stop
  ;;
'restart')
  ftp_restart
  ;;
*)
echo "usage $0 start|stop|restart"
esac
 

Делаем его исполняемым
# chmod a+x /etc/rc.d/rc.vsftpd

По умолчанию, домашняя директория пользователя FTP - /home/ftp. Я предпочитаю все что предоставляет
компьютер как сервер - размещать в директории /srv. Например /srv/ftp, /srv/samba, /srv/www.
Имхо так как-то порядка в системе больше  Но это только мое ИМХО.
Открываем файл /etc/passwd, ищем пользователя ftp и меняем ему домашнюю директорию на /srv/ftp.
Если вы предпочитаете другое расположение - замените все пути описанные ниже с /srv/ftp на ваши.

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

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

Установка xinetd

Останавливаем суперсервер
# /etc/rc.d/rc.inetd stop

Удаляем inetd
# removepkg inetd

Делам файл /etc/rc.d/rc.inetd неисполняемым
# chmod a-x /etc/rc.d/rc.inetd

Устанавливаем xinetd
# installpkg xinetd-2.3.14-i486-1bms.tgz

Переименовываем файл rc.xinetd.new в rc.xinetd
mv /etc/rc.d/rc.xinetd.new /etc/rc.d/rc.xinetd

Делам его исполняемым
chmod a+x /etc/rc.d/rc.xinetd

Из файла /etc/rc.d/rc.local.new копируем строки запуска сервера в наш файл /etc/rc.d/rc.local.
Руками переписывать - лень, перенаправим вывод всего файла в конец нашего rc.local.
Откроем файл /etc/rc.d/rc.local.new и удалим из него все строки до # Start the xinetd server.
Копируем текст в наш rc.local
# cat /etc/rc.d/rc.local.new >> /etc/rc.d/rc.local

Теперь файл можно удалить.
# rm /etc/rc.d/rc.local.new

Запускаем xinetd
# /etc/rc.d/rc.xinetd start

Пробуем подключиться к FTP
# ftp 127.0.0.1

Connected to 127.0.0.1.
220 (vsFTPd 2.0.5)

Name (127.0.0.1:coder): 530 This FTP server is anonymous only.

ftp>

Запустился! Посмотреть кто когда и что хотел запустить можно через cat /var/log/servicelog.
: START: ftp pid=3195 from=127.0.0.1

Видим что 17-го декабря 2006, по запросу с адреса 127.0.0.1 был запущен ftp сервер и ему был присвоем pid 3195.
Здорово! Чтобы было еще интереснее в файле /etc/xinetd.conf допишем строку
log_on_success = HOST

до
log_on_success = HOST USERID PID DURATION EXIT

Перезапустим сервер и теперь в логах будет оботбражаться даже продолжительность вызванных соединений

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

Займемся виртуальными хостами. Т.к. виртуальных FTP может быть и больше 10, чтобы не мусорить в /etc
желательно создать директорию /etc/vsftpd
# mkdir /etc/vsftpd

А в нем, так как у нас будет два вируальных FTP сервера - создать директории для каждого из них.
Например у нас будут 2 ftp на адресах 192.168.226.3 (ftp1) и 192.168.226.4 (ftp2).
# mkdir /etc/vsftpd/192.168.226.3

# mkdir /etc/vsftpd/192.168.226.4

Скопируем в эти каталоги конфигурационный файл.
# cp /etc/vsftpd.conf /etc/vsftpd/192.168.226.3/vsftpd.conf

# cp /etc/vsftpd.conf /etc/vsftpd/192.168.226.4/vsftpd.conf

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

и меняем ее на
xferlog_file=/var/log/vsftpd/192.168.226.3.log

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

Прописываем создание двух дополнительных IP адресов при запуске. В конец файла /etc/rc.d/rc.inet1 добавляем
/sbin/ifconfig eth0:1 192.168.226.3 netmask 255.255.255.0 up
/sbin/ifconfig eth0:2 192.168.226.4 netmask 255.255.255.0 up

Сохраняемся, выходим.

И создаем их сейчас:
# ifconfig eth0:1 192.168.226.3 netmask 255.255.255.0 up

# ifconfig eth0:2 192.168.226.4 netmask 255.255.255.0 up

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

ftp2            IN      A       192.168.226.4

Перезапустим DNS сервер
# /etc/rc.d/rc.bind restart

Открываем файл /etc/xinetd.conf и множим секцию ftp. В одну секцию добавляем директиву
bind = 192.168.226.3

а строку server_args = vsftpd допоолняем до
server_args = vsftpd /etc/vsftpd/192.168.226.3/vsftpd.conf

в другую
bind = 192.168.226.4

и
server_args = vsftpd /etc/vsftpd/192.168.226.4/vsftpd.conf

Перезапустим xinetd
# /etc/rc.d/rc.xinetd restart

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

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

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

Структура анонимного FTP сервера:
# mkdir /srv/ftp/192.168.226.3

# mkdir /srv/ftp/192.168.226.3/incoming

# mkdir /srv/ftp/192.168.226.3/pub

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

Пропишем это в конфигруационном файле:
anon_root=/srv/ftp/192.168.226.3

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

# chmod -R g+w /srv/ftp/192.168.226.3/incoming/

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

anonymous_enable=YES
write_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_umask=022
file_open_mode=0777
anon_root=/srv/ftp/192.168.226.3
local_enable=NO
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_file=/var/log/vsftpd/192.168.226.3.log
xferlog_std_format=YES
ls_recurse_enable=YES

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

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

Пропишем в него первым делом самого себя  у меня это пользователь coder Создадим директорию для хранения
индивидульных настроек для каждого пользователя
# mkdir /etc/vsftpd/192.168.226.4/users

Создадим в этом каталоге файл для настроек пользователя coder
# touch /etc/vsftpd/192.168.226.4/users/coder

Пропишем в него все права и корневую директорию. Добавим:
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=/srv/ftp/192.168.226.4/

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

local_enable=YES

userlist_enable=YES

userlist_deny=NO

userlist_file=/etc/vsftpd/192.168.226.3/userlist

user_config_dir=/etc/vsftpd/192.168.226.3/users

Все пользователи в Slackware по умолчанию принадлежат группе users. Дадим всем пользователям группы
users доступ на запись в /srv/ftp/192.168.226.4.

# chgrp -R users /srv/ftp/192.168.226.4
# chmod -R g+w /srv/ftp/192.168.226.4

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

# adduser webmaster

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

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

Пропишем в него директорию в которая будет корневой для пользователя (в данном случае директория с сайтом)
local_root=/srv/www/www.mysite.lan/

Сменим группу и пользователя директории с сайтом на webmaster:users
# chown -R webmaster:users /srv/www/www.mysite.lan

Чтобы webmaster мог быстро перейти на сайт зайдя например по SSH или с SAMBA, в его домашней директории
создадим символьную ссылку на директорию с web сайтом.
# ln -s /srv/www/www.mysite.lan /home/webmaster/www

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

Полное содержание vsftpd.conf:
anonymous_enable=NO
file_open_mode=0777
local_enable=YES
userlist_enable=YES
userlist_deny=NO
userlist_file=/etc/vsftpd/192.168.226.4/userlist
user_config_dir=/etc/vsftpd/192.168.226.4/users
chroot_local_user=YES
write_enable=YES
local_umask=022
ftpd_banner=Welcome to FTP server
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_file=/var/log/vsftpd/192.168.226.4.log
xferlog_std_format=YES
ls_recurse_enable=YES

© 2007-02-26 23:10:09 coderinside (http://ylsoftware.com/)

Источник

free-templates.ru