HowTo: FTP-сервер VsFTPd с виртуальными пользователями, хранимыми в MySQL
В статье рассматривается настройка FTP-сервера на базе VsFTPd под управлением Ubuntu Linux 9.04. Вход на сервер осуществляется как анонимно, так и с помощью авторизации. Все виртуальные пользователи имеют разграниченые права доступа. Статистика посещений и закачек ведется через Web-интерфейс.
Установим сам FTP-сервер.
# aptitude install vsftpd
Установим СУБД MySQL:
# aptitude install mysql-server mysql-client
Назначим пароль суперпользователя для СУБД:
# mysqladmin -u root password root_password
Создадим базу данных для вируальных пользователей. Я назову ее vsftpd. Пользователь БД будет vsftpd c таким же паролем.
# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 51
Server version: 5.0.67-0ubuntu6 (Ubuntu)Type “help;” or “\h” for help. Type “\c” to clear the buffer.
Создаем БД
mysql> CREATE DATABASE vsftpd;
Даем нужные права пользователю vsftpd
mysql> GRANT ALL ON vsftpd.* TO “vsftpd”@”localhost” IDENTIFIED BY “vsftpd”;
Применяем новые привелегии
mysql> FLUSH PRIVILEGES;
Делаем текущей нашу БД
mysql> USE vsftpd;
Создаем необходимые таблицы
mysql> CREATE TABLE `accounts` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`username` VARCHAR( 30 ) NOT NULL ,
`password` VARCHAR( 50 ) NOT NULL ,
UNIQUE ( `username` )
)
ENGINE = MYISAM ;
Выходим из консоли MySQL
mysql> quit;
Cоздадим пользователя vsftpd, от имени которого будут работать наши виртуальные пользователи:
# useradd –home /home/vsftpd –gid nogroup -m –shell /bin/false vsftpd
Отредактируем конфигурационный файл /etc/vsftpd.conf:
# Разрешать анонимный доступ
anonymous_enable=YES
# Корненая директория анонимного пользователя, где хранятся директории incoming и pub
anon_root=/home/ftp/
# Не требуется пароль для анонимного пользователя
no_anon_password=YES
# Включить локальных пользователей. В качестве них будут виртуальные пользователи. Чтобы системные пользователи имели доступ
# на ftp, необходимо их внести в базу, как будет указано ниже.
local_enable=YES
# Разрешить запись для анонимного пользователя в incoming
write_enable=YES
# Разрешить заливать файлы анонимным пользователям в incoming
anon_upload_enable=YES
# Разрешить создавать директории анонимным пользователям в incoming
anon_mkdir_write_enable=YES
# Разрешить запись в другие директории анонимному пользователю
anon_other_write_enable=YES
# Маска локального пользователя (rwxr-xr-x)
local_umask=0022
# Маска анонимного пользователя (rwxrwx—)
anon_umask=0007
# Режим для открытия файлов
file_open_mode=0777
# Если запускается самостоятельно. Если спользуется inetd или xinetd, необходимо установить значение listen=NO
listen=YES
# Порт, который будет слушать демон
listen_port=21
# Минимальный пассивный порт
pasv_min_port=30000
# Максимальный пассивный порт
pasv_max_port=30999
# Формат лога
xferlog_std_format=YES
# Файл лога
xferlog_file=/var/log/vsftpd.log
# Включить сообщения, которые выдаются при входе в определенную директорию
dirmessage_enable=YES
# Баннер, который выводится при подключении к фтп-серверу
ftpd_banner=Welcome to my FTP Service
# Пользователь, от имени которого будут вестись все действия на фтп
ftp_username=ftp
# Просмотр с помощью ls -R, рекомендую оставить, поскольку некоторые клиенты именно так и просматривают
ls_recurse_enable=YES
# Активируем виртуальных пользователей
guest_enable=YES
# Действия для виртуальных пользователей ведутся от имени пользователя vsftpd
guest_username=vsftpd
# Виртуальные пользователи имеют права локальных пользователей
virtual_use_local_privs=YES
# Файл, который используется для аутентификации виртуальных пользователей
pam_service_name=vsftpd
# Домашнии директории для каждого виртуального пользователя
user_sub_token=$USER
local_root=/home/vsftpd/$USER
# Привязать локального пользователя к замкнутой среде
chroot_local_user=YES
# Директория, которая используется для замкнутой среды
secure_chroot_dir=/var/run/vsftpd
# Отображает “ftp” вместо ID польователя при просмотре с помощью ls -l
hide_ids=YES
# Имя файл в /etc/pam.d/, где хранятся необходимые настройки vsftpd
pam_service_name=vsftpd
# Дадим скорость 1Mbit/s на скачку и закачку для анонимных пользователей
anon_max_rate=65536
# Дадим скорость 10Mbit/s на скачку и закачку для виртуальных пользователей
local_max_rate=655360
# Лог запросов для сервера. Может быть понадобится для ведения статистики. Если нет — можно отключить
log_ftp_protocol=YES
# Максимальное число клиентов:
max_clients=50
# Максимальное число клиентов для одного уникального IP адресса. Используется для предотвращения многопотоковых закачек,
# которые забивают канал
max_per_ip=1
При копипастинге конфига нужно быть осторожным в конце строк не должно быть пробелов, иначе демон не запустится.
Cоздадим необходимые директории:
# mkdir -p /home/ftp/incoming
# mkdir -p /home/ftp/pub
Выставим на них необходимые права:
# chmod 4775 /home/ftp/pub
# chmod 3773 /home/ftp/incoming
Устанавливаем пакет libpam-mysql, который является связующим звеном между VsFTPd и MySQL:
# aptitude install libpam-mysql
Отредактируем файл /etc/pam.d/vsftpd. Закоментируем или удалим все строки, оставив только эти:
# For VsFTPd virtual users:
auth required pam_mysql.so user=vsftpd passwd=vsftpd host=localhost db=vsftpd table=accounts usercolumn=username passwdcolumn=password crypt=2
account required pam_mysql.so user=vsftpd passwd=vsftpd host=localhost db=vsftpd table=accounts usercolumn=username passwdcolumn=password crypt=2
Перезапустим демон, чтобы он загрузил библиотеку pam_mysql.so:
# /etc/init.d/vsftpd restart
* Stopping FTP server: vsftpd [ OK ]
* Starting FTP server: vsftpd [ OK ]
Создадим виртуального пользователя “user1″ c паролем “password1″:
# mysql vsftpd -u vsftpd -pvsftpd
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -AWelcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 52
Server version: 5.0.67-0ubuntu6 (Ubuntu)Type “help;” or “\h” for help. Type “\c” to clear the buffer.
mysql> INSERT INTO accounts (username, password) VALUES(“user1″, PASSWORD (“password1″);
mysql> quit;
Создадим домашнюю директорию виртуального пользователя:
# mkdir /home/vsftpd/user1
Выставим на нее необходимые права:
# chown vsftpd:nogroup /home/vsftpd/user1
Тестируем:
# ftp localhost
Connected to localhost.
220 Welcome to my FTP Service
Name (localhost:root): anonymous
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
drwxrws-wt 2 ftp ftp 4096 Mar 29 14:40 incoming
drwsrwxr-x 2 ftp ftp 4096 Mar 29 14:41 pub
226 Directory send OK.
ftp> quit
221 Goodbye.# ftp localhost
Connected to localhost.
220 Welcome to my FTP Service
Name (localhost:root): user1
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
226 Directory send OK.
ftp> quit
221 Goodbye.
Сейчас я покажу на примере, как сделать, чтобы:
1) виртуальный пользователь porno-downloader мог скачивать содержимое директории /home/dim3dro1/Video/Porno/.
2) виртуальный пользователь cisco мог пополнять коллекцию литературы в /home/dim3dro1/Documents/Cisco/.
Создадим этих пользователей:
# mysql vsftpd -u vsftpd -pvsftpd
mysql> INSERT INTO accounts (username, password) VALUES(“porno-downloader”, PASSWORD (“porno”);
mysql> INSERT INTO accounts (username, password) VALUES(“cisco”, PASSWORD (“cisco”);
mysql> quit;
Создадим домашние директории этих пользователей:
# mkdir /home/vsftpd/porno-downloader
# mkdir /home/vsftpd/cisco
Выставим на них необходимые права:
# chown vsftpd:nogroup /home/vsftpd/porno-downloader
# chown vsftpd:nogroup /home/vsftpd/cisco
Теперь будем монтировать в домашние директории пользователей вышеуказаное содержимое. Для этого воспользуемся параметром –bind, который позволяет перемонтировать дерево в другом месте, так, что его содержимое доступно в обоих местах. Открываем файл /etc/fstab и добавляем в конец следующие строки:
# Mounts for user “porno-downloader”
/home/dim3dro1/Video/Porno /home/vsftpd/porno-downloader none ro,bind 0 0
# Mounts for user “cisco”
/home/dim3dro1/Documents/Cisco /home/vsftpd/cisco none rw,bind 0 0
Перемонтируем все точки монтирования, указанные в /etc/fstab:
# mount -a
В результате было получено:
1) пользователь porno-downloader имеет доступ к директории /home/dim3dro1/Video/Porno с правами только для чтения;
2) пользователь cisco имеет доступ к директории /home/dim3dro1/Documents/Cisco с правами на запись.
Снимать статистику FTP-траффика будем с помощью AWStats. Установим его:
# aptitude install awstats
Создаем конфигурационный файл для FTP-сервера:
# touch /etc/awstats/awstats.localhost.conf
Добавляем в него следующие строки:
SiteDomain=”localhost”
LogFile=”/var/log/vsftpd.log”
LogType=F
LogFormat=”%time3 %other %host %bytesd %url %other %other %method %other %logname %other %code %other %other”
LogSeparator=”\s”
NotPageList=”"
LevelForBrowsersDetection=0
LevelForOSDetection=0
LevelForRefererAnalyze=0
LevelForRobotsDetection=0
LevelForWormsDetection=0
LevelForSearchEnginesDetection=0
ShowLinksOnUrl=0
ShowMenu=1
ShowSummary=UVHB
ShowMonthStats=UVHB
ShowDaysOfMonthStats=HB
ShowDaysOfWeekStats=HB
ShowHoursStats=HB
ShowDomainsStats=HB
ShowHostsStats=HBL
ShowAuthenticatedUsers=HBL
ShowRobotsStats=0
ShowEMailSenders=0
ShowEMailReceivers=0
ShowSessionsStats=1
ShowPagesStats=PBEX
ShowFileTypesStats=HB
ShowFileSizesStats=0
ShowBrowsersStats=0
ShowOSStats=0
ShowOriginStats=0
ShowKeyphrasesStats=0
ShowKeywordsStats=0
ShowMiscStats=0
ShowHTTPErrorsStats=0
ShowSMTPErrorsStats=0
Устанавливаем Web-сервер apache2:
# aptitude install apache2
Создаем конфигурационный файл для AWStats:
# touch /etc/apache2/awstats.conf
Добавляем в него следующие строки:
Alias /awstatsclasses “/usr/share/awstats/lib/”
Alias /awstats-icon/ “/usr/share/awstats/icon/”
Alias /awstatscss “/usr/share/doc/awstats/examples/css”
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
ScriptAlias /awstats/ /usr/lib/cgi-bin/
Options ExecCGI -MultiViews +SymLinksIfOwnerMatch
Добавляем в конец файла /etc/apache2/apache2.conf такую строку:
Include /etc/apache2/awstats.conf
И перезапустим Web-сервер:
# /etc/init.d/apache2 restart
* Restarting web server apache2 [ OK ]
Сгенерируем статистику:
# sudo -u www-data /usr/bin/perl /usr/lib/cgi-bin/awstats.pl -update -config=localhost
Create/Update database for config “/etc/awstats/awstats.localhost.conf” by AWStats version 6.7 (build 1.892)
From data in log file “/var/log/vsftpd.log”…
Warning: HostAliases parameter is not defined, awstats choose “localhost localhost 127.0.0.1″.
Phase 1 : First bypass old records, searching new record…
Searching new records from beginning of log file…
Jumped lines in file: 0
Parsed lines in file: 4
Found 0 dropped records,
Found 0 corrupted records,
Found 4 old records,
Found 0 new qualified records.
Редактируем файл /etc/cron.d/awstats. Удаляем все и добавляем эту строку:
0,10,20,30,40,50 * * * * www-data [ -x /usr/lib/cgi-bin/awstats.pl -a -f /etc/awstats/awstats.localhost.conf -a -r /var/log/vsftpd.log ] && /usr/lib/cgi-bin/awstats.pl -config=localhost -update >/dev/null
Посмотреть на результаты работы можно, открыв в браузере страницу:
http://localhost/awstats/awstats.pl
БОНУС: VsFTPD + Active Directory.
Предполагается, что доменное имя — “example.com.ua”.
Устанавливаем аутентификационные сервисы для АД:
# aptitude install likewise-open
Присоединим машинку к домену (для этого необходимо знать пароль Администратора домена):
# domainjoin-cli join example.com.ua Administrator
Запустим демона:
# /etc/init.d/likewise-open start
* Starting the Likewise-open auth daemon [ OK ]
Далее редактируем файл /etc/pam.d/vsftpd. Удаляем все и добавляем следующие строки:
###
# Active Directory
###
auth required pam_nologin.so no_warn
auth sufficient pam_winbind.so krb5_auth
auth required pam_unix.so no_warn try_first_pass
account required pam_nologin.so no_warn
account sufficient pam_winbind.so krb5_auth
account required pam_unix.so
session required pam_permit.so
###
# MySQL
###
auth requisite pam_mysql.so user=vsftpd passwd=vsftpd host=localhost db=vsftpd table=accounts usercolumn=username passwdcolumn=password crypt=2
account requisite pam_mysql.so user=vsftpd passwd=vsftpd host=localhost db=vsftpd table=accounts usercolumn=username passwdcolumn=password crypt=2
Проверяем:
# ftp localhost
Connected to localhost.
220 Welcome to my FTP Service
Name (localhost:root): Administrator
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
226 Directory send OK.
ftp> quit
221 Goodbye.
Взято с http://jampo.com.ua

Leave a Reply