Установим сам 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.
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 ;
`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
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
# mkdir -p /home/ftp/pub
Выставим на них необходимые права:
# chmod 4775 /home/ftp/pub
# chmod 3773 /home/ftp/incoming
# 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
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 ]
* 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 -A
Welcome 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;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Welcome 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.
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;
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
# mkdir /home/vsftpd/cisco
Выставим на них необходимые права:
# chown vsftpd:nogroup /home/vsftpd/porno-downloader
# chown vsftpd:nogroup /home/vsftpd/cisco
# 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
/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
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
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 ]
* 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.
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
Посмотреть на результаты работы можно, открыв в браузере страницу:
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 ]
* 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
# 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.
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.
Литература для прочтения:
1. VsFTPd и виртуальные пользователи в MySQL для FreeBSD www.lissyara.su/?id=1614
2. Установка и настройка VSFTPD + MYSQL (Ubuntu & Debian) sudouser.com/ustanovka-i-nastrojka-vsftpd-mysql-ubuntu-debian
3. Virtual Hosting With vsftpd And MySQL On Debian Etch howtoforge.com/vsftpd_mysql_debian_etch
4. Возможности vsftpd и примеры их использования. www.opennet.ru/base/net/vsftpd_overview.txt.html
5. Chroot Mount Trick. www.vinno.net/linux/server/chroot-mount-trick/
6. Setting up awstats with apache2 on debian-ubuntu. www.debuntu.org/2006/04/21/33-how-to-setting-up-awstats-with-apache-2-on-debianubuntu/
7. Vsftpd + AD && Vsftpd + MySQL. www.lissyara.su/?id=1916
8. ActiveDirectoryWinbindHowto. https://help.ubuntu.com/community/ActiveDirectoryWinbindHowto




.