вівторок, 8 липня 2008 р.

Виртуальные серверы на базе VSFTPD (ftp virtual)

Содержание


1. Введение

2. Установка сервера

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

4. Установка xinetd

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

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

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


Введение


В статье рассматривается один из способов создания виртуальных 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.


06/12/17@13:29:36: 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
        Джерело http://howtoforge.org.ua/?q=node/483

Немає коментарів: