Типо Preface
По данному вопросу гугл выдает десятки статей, передранных с одного и того же первоисточника. В свою очередь я, после того как передрал, снабдил свой вариант чуть более расширенными комментариями (что по моему убеждению способствует более глубокому осмыслению процесса) и внес кое-какие изменения, о которых далее по тексту.В качестве примера, ставить vsftpd буду на Linux openSUSE 11.0 и FreeBSD 7.1. Получить простейший функционал ftp-сервера для перегонки файлов туда-сюда с использованием анонимных аккаунтов не составляет труда. Чуть больший интерес представляет использование виртуальных пользователей, их аутентификация с помощью pam-модулей и авторизация on per user basis, с позволения сказать.
Установка и настройка vsftpd
В openSUSE можно легко установить vsftpd с помощью Yast. В списке репозиториев должен быть, например этот. Во FreeBSD - либо добавить пакет vsftpd,
pkg_add –r vsftpd
либо из портов:
cd /usr/ports/ftp/vsftpd && make install clean
(разумеется, так или иначе от имени su)
После этого в /etc для openSUSE, или в /usr/local/etc для FreeBSD, запишется дефолтный конфиг vsftpd.conf.dist, который скопируется в vsftpd.conf при первом запуске демона или в случае отсутствия наличия конфига вообще. Поскольку асилить конфиг целиком с первого раза довольно напряжно, по той простой причине, что в нем слишком много букаф, остановлюсь на необходимом минимуме. Подробную справку по параметрам конфига можно получить по man vsftpd.conf или, если угодно, здесь. Там же приведены значения параметров по-умолчанию. Если умолчальное значение параметра устраиваeт, его можно не упоминать вообще, если что-то нужно поменять, добавляю необходимый параметр с желаемым значением.
Демон vsftpd я предпочитаю запускать отдельно (standalone mode), а не через (x)inetd, в фоновом (background) режиме, поэтому открываю редактор (в моем случае – nano в openSUSE, или ee – во FreeBSD, ибо vi-подобные редакторы, признаюсь, мне даются туго) и пишу такое:
listen=YES
background=YES
Далее можно позволить вход на фтп-сервер анонимным (anonymous) или локально зарегистрированным в системе (local) пользователям. По-умолчанию, вход разрешен анонимусам и запрещен локал юзерам. Меня такое положение вещей не устраивает, ибо хочу отрубить анонимусов и разрешить локалов, поскольку на одного из них будут отображаться мои виртуальные пользователи (см. далее). Поэтому меняю дефолтные значения:
anonymous_enable=NO
local_enable=YES
По-умолчанию, ведение логов отключено. Поскольку логи могут оказаться полезными при устранении каких-либо затыков (почти со стопроцентной вероятностью могущих возникнуть), включаю:
xferlog_enable=YES
log_ftp_protocol=YES
Теперь о виртуальных пользователях. Чтобы не заморачиваться с созданием локальных пользователей в системе и не возиться потом с пермишнами, домашними директориями и прочим, можно создать базу данных, в которой будут храниться юзернеймы и пароли, аутентификация на сервере будет осуществляться на основе этих данных. При этом все виртуальные пользователи будут отображаться на одного локального с предельно урезанными полномочиями.
Так вот, чтобы разрешить виртуальных пользователей (guest), задать имя локального пользователя (например, ftp_virtual) на которого они будут отображаться (guest_username) и запереть (chroot) их всех в каталоге, предназначенном для доступа по фтп (например, /home/ftp), добавляю:
guest_enable=YES
guest_username=ftp_virtual
chroot_local_user=YES
secure_chroot_dir=/home/ftp
Для аутентификации виртуальных пользователей будет использоваться PAM (Pluggable authentication modules). В openSUSE использую связку библиотеки pam_userdb.so и берклиевской базы данных, во FreeBSD я предпочитаю pam_mysql.so и базу данных mysql. По-умолчанию pam запускается от имени пользователя ftp, что в моем случае приводило к его некорректной работе, поэтому умолчальное значение меняю:
pam_service_name=vsftpd
Так как планируется назначать пользователям индивидуальные права (разрешение/запрещение записи, скорость скачивания и т.п.), необходимо создать каталог, в котором будут храниться индивидуальные конфиги в одноименных файлах, которые будут подключаться к основному. Для этого создаю, например /usr/local/etc/vsftpd/user_conf во FreeBSD или /etc/vsftpd/user_conf в openSUSE, и укажу на них в конфиге vsftpd:
user_config_dir=/usr/local/etc/vsftpd/us er_conf
либо
user_config_dir=/etc/vsftpd/user_conf
соответственно
Ну, и немного лирики:
ftpd_banner=----Wellcome to my vsFTPd server----
После этого нужно сохранить полученный конфиг как /etc/vsftpd.conf в openSUSE, или /usr/local/etc/vsftpd.conf во FreeBSD.
pkg_add –r vsftpd
либо из портов:
cd /usr/ports/ftp/vsftpd && make install clean
(разумеется, так или иначе от имени su)
После этого в /etc для openSUSE, или в /usr/local/etc для FreeBSD, запишется дефолтный конфиг vsftpd.conf.dist, который скопируется в vsftpd.conf при первом запуске демона или в случае отсутствия наличия конфига вообще. Поскольку асилить конфиг целиком с первого раза довольно напряжно, по той простой причине, что в нем слишком много букаф, остановлюсь на необходимом минимуме. Подробную справку по параметрам конфига можно получить по man vsftpd.conf или, если угодно, здесь. Там же приведены значения параметров по-умолчанию. Если умолчальное значение параметра устраиваeт, его можно не упоминать вообще, если что-то нужно поменять, добавляю необходимый параметр с желаемым значением.
Демон vsftpd я предпочитаю запускать отдельно (standalone mode), а не через (x)inetd, в фоновом (background) режиме, поэтому открываю редактор (в моем случае – nano в openSUSE, или ee – во FreeBSD, ибо vi-подобные редакторы, признаюсь, мне даются туго) и пишу такое:
listen=YES
background=YES
Далее можно позволить вход на фтп-сервер анонимным (anonymous) или локально зарегистрированным в системе (local) пользователям. По-умолчанию, вход разрешен анонимусам и запрещен локал юзерам. Меня такое положение вещей не устраивает, ибо хочу отрубить анонимусов и разрешить локалов, поскольку на одного из них будут отображаться мои виртуальные пользователи (см. далее). Поэтому меняю дефолтные значения:
anonymous_enable=NO
local_enable=YES
По-умолчанию, ведение логов отключено. Поскольку логи могут оказаться полезными при устранении каких-либо затыков (почти со стопроцентной вероятностью могущих возникнуть), включаю:
xferlog_enable=YES
log_ftp_protocol=YES
Теперь о виртуальных пользователях. Чтобы не заморачиваться с созданием локальных пользователей в системе и не возиться потом с пермишнами, домашними директориями и прочим, можно создать базу данных, в которой будут храниться юзернеймы и пароли, аутентификация на сервере будет осуществляться на основе этих данных. При этом все виртуальные пользователи будут отображаться на одного локального с предельно урезанными полномочиями.
Так вот, чтобы разрешить виртуальных пользователей (guest), задать имя локального пользователя (например, ftp_virtual) на которого они будут отображаться (guest_username) и запереть (chroot) их всех в каталоге, предназначенном для доступа по фтп (например, /home/ftp), добавляю:
guest_enable=YES
guest_username=ftp_virtual
chroot_local_user=YES
secure_chroot_dir=/home/ftp
Для аутентификации виртуальных пользователей будет использоваться PAM (Pluggable authentication modules). В openSUSE использую связку библиотеки pam_userdb.so и берклиевской базы данных, во FreeBSD я предпочитаю pam_mysql.so и базу данных mysql. По-умолчанию pam запускается от имени пользователя ftp, что в моем случае приводило к его некорректной работе, поэтому умолчальное значение меняю:
pam_service_name=vsftpd
Так как планируется назначать пользователям индивидуальные права (разрешение/запрещение записи, скорость скачивания и т.п.), необходимо создать каталог, в котором будут храниться индивидуальные конфиги в одноименных файлах, которые будут подключаться к основному. Для этого создаю, например /usr/local/etc/vsftpd/user_conf во FreeBSD или /etc/vsftpd/user_conf в openSUSE, и укажу на них в конфиге vsftpd:
user_config_dir=/usr/local/etc/vsftpd/us
либо
user_config_dir=/etc/vsftpd/user_conf
соответственно
Ну, и немного лирики:
ftpd_banner=----Wellcome to my vsFTPd server----
После этого нужно сохранить полученный конфиг как /etc/vsftpd.conf в openSUSE, или /usr/local/etc/vsftpd.conf во FreeBSD.
База виртуальных пользователей
Напомню, в линуксе было решено создать берклиевскую БД, для работы с которой в openSUSE все установлено по-умолчанию. Поэтому создается текстовый файл (например, /etc/vsftpd/ftp_accounts.list), нечетная строка которого содержит логин, следующая – соответствующий пароль, например, для пользователя "ftpuser" с паролем "secret":
ftpuser
secret
В конце последней строки обязательно перейти Enter'ом на новую строку.
Далее из текстового файла создается база данных:
cd /etc/vsftpd
db_load –T –t hash –f ftp_accounts.list ftp_accounts.db
Чтобы запретить остальным пользователям изменять базу, можно сделать
chmod 755 ftp_accounts.db
Ну, и не помешало бы грохнуть исходный текстовик, который содержит в явном виде логины/пароли:
rm ftp_accounts.list
Во FreeBSD было решено создавать базу с помощью мускула, поэтому ставлю его:
cd /usr/ports/databases/mysql50-server && make install clean
и соответствующий модуль пам:
cd /usr/ports/security/pam-mysql && make install clean
говорят, после этого нужно сделать символьный линк:
ln -sf /usr/local/lib/pam_mysql.so /usr/lib/pam_mysql.so
Добавляю необходимые строки в /etc/rc.conf :
mysql_enable="YES"
mysql_limits="NO"
mysql_dbdir="/var/db/mysql"
Запускаю мускул и создаю каркас базы данных:
mysql –u root
CREATE DATABASE vsftpd;
Создаю таблицу, в которой будут храниться логины и пароли, при этом каждая запись будет под уникальным автоматически присваиваемым номером, а логины не должны повторяться, что отображено в constraints'ах соответствующих столбцов:
USE vsftpd;
CREATE TABLE ftp_accounts (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(30) NOT NULL UNIQUE,
password VARCHAR(50) NOT NULL
);
Прикинув было, что набирать логин длиной 30 символов или пароль длиной 50 символов мало кому хватит терпения, я попытался эти значения урезать, но pam_mysql это воспринял без энтузиазма и возвращал ошибку – хэш неправильной длины, видите ли ему не понравился.
Теперь нужно заполнить полученную таблицу хотя бы одной записью – все те же логин "ftpuser" с паролем "secret", который шифруется функцией PASSWORD( ). Поле "id" при этом не затрагиваю:
INSERT INTO ftp_accounts VALUES (NULL, 'ftpuser', PASSWORD('secret'));
Можно проверить, что получилось:
SELECT * FROM ftp_accounts;
Далее нужно установить разрешение на выборку значений из таблицы "ftp_accounts" для пользователя "vsftpd" на хосте "localhost" с паролем, скажем, "vsftpdpass", от имени которого будет запускаться пам.
GRANT SELECT ON vsftpd.ftp_accounts TO 'vsftpd'@'localhost' IDENTIFIED BY 'vsftpdpass';
Чтобы запретить кому-либо кроме рута осуществлять запись в базу, можно опять таки:
cd /var/db/mysql/
chown root:wheel vsftpd –R
chmod 755 vsftpd –R
Let's put things together
ftpuser
secret
В конце последней строки обязательно перейти Enter'ом на новую строку.
Далее из текстового файла создается база данных:
cd /etc/vsftpd
db_load –T –t hash –f ftp_accounts.list ftp_accounts.db
Чтобы запретить остальным пользователям изменять базу, можно сделать
chmod 755 ftp_accounts.db
Ну, и не помешало бы грохнуть исходный текстовик, который содержит в явном виде логины/пароли:
rm ftp_accounts.list
Во FreeBSD было решено создавать базу с помощью мускула, поэтому ставлю его:
cd /usr/ports/databases/mysql50-server && make install clean
и соответствующий модуль пам:
cd /usr/ports/security/pam-mysql && make install clean
говорят, после этого нужно сделать символьный линк:
ln -sf /usr/local/lib/pam_mysql.so /usr/lib/pam_mysql.so
Добавляю необходимые строки в /etc/rc.conf :
mysql_enable="YES"
mysql_limits="NO"
mysql_dbdir="/var/db/mysql"
Запускаю мускул и создаю каркас базы данных:
mysql –u root
CREATE DATABASE vsftpd;
Создаю таблицу, в которой будут храниться логины и пароли, при этом каждая запись будет под уникальным автоматически присваиваемым номером, а логины не должны повторяться, что отображено в constraints'ах соответствующих столбцов:
USE vsftpd;
CREATE TABLE ftp_accounts (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(30) NOT NULL UNIQUE,
password VARCHAR(50) NOT NULL
);
Прикинув было, что набирать логин длиной 30 символов или пароль длиной 50 символов мало кому хватит терпения, я попытался эти значения урезать, но pam_mysql это воспринял без энтузиазма и возвращал ошибку – хэш неправильной длины, видите ли ему не понравился.
Теперь нужно заполнить полученную таблицу хотя бы одной записью – все те же логин "ftpuser" с паролем "secret", который шифруется функцией PASSWORD( ). Поле "id" при этом не затрагиваю:
INSERT INTO ftp_accounts VALUES (NULL, 'ftpuser', PASSWORD('secret'));
Можно проверить, что получилось:
SELECT * FROM ftp_accounts;
Далее нужно установить разрешение на выборку значений из таблицы "ftp_accounts" для пользователя "vsftpd" на хосте "localhost" с паролем, скажем, "vsftpdpass", от имени которого будет запускаться пам.
GRANT SELECT ON vsftpd.ftp_accounts TO 'vsftpd'@'localhost' IDENTIFIED BY 'vsftpdpass';
Чтобы запретить кому-либо кроме рута осуществлять запись в базу, можно опять таки:
cd /var/db/mysql/
chown root:wheel vsftpd –R
chmod 755 vsftpd –R
Let's put things together
Чтобы собрать все докучи, нужно во-первых создать локального пользователя (ftp_virtual), на которого будут отображаться виртуалы:
pw useradd ftp_virtual –s /usr/sbin/nologin –d /home/ftp
во FreeBSD, или
useradd ftp_virtual –d /home/ftp
в линуксе
Далее, на всякий случай, отобрать у виртуала права на запись в домашнюю директорию, иначе vsftpd заругается:
cd /home
chow ftp_virtual:ftp_virtual ftp -R
chmod 555 ftp
для линукса аналогично:
cd /home
chow ftp_virtual:users ftp -R
chmod 555 ftp
Теперь можно создать внутри корневой папки фтпшника папки для даунлоада и аплоада:
cd /home/ftp
mkdir download
chmod 555 download –R
mkdir upload
chmod 755 upload –R
Чтобы разрешить аплоадные команды по фтп виртуальному пользователю "ftpuser", нужно создать в упомянутой в vsftpd.conf директории (FreeBSD: /usr/local/etc/vsftpd/user_conf, openSUSE: /etc/vsftpd/user_conf) текстовый файл с названием "ftpuser" и вписать в него необходимые строки:
write_enable=YES
anon_mkdir_write_enable=YES
anon_upload_enable=YES
anon_other_write_enable=YES
Последняя строка позволит не только создавать, но и удалять/переименовывать. Сюда же можно добавить ограничения скорости (см. man vsftpd.conf)
Для того, чтобы состыковать pam с vsftpd, нужно отредактировать (при необходимости создать) файл /etc/pam.d/vsftpd, внутри которого должны быть строки
auth required pam_mysql.so user=vsftpd host=localhost passwd=vsftpdpass db=vsftpd table=ftp_accounts usercolumn=username passwdcolumn=password crypt=2
account required pam_mysql.so user=vsftpd host=localhost passwd=vsftpdpass db=vsftpd table=ftp_accounts usercolumn=username passwdcolumn=password crypt=2
для FreeBSD, или
auth required /lib/security/pam_userdb.so db=/etc/vsftpd/ftp_accounts
account required /lib/security/pam_userdb.so db=/etc/vsftpd/ftp_accounts
для линукса
Если по каким-либо причинам во FreeBSD понадобится использовать для шифрования паролей в базе MySQL не PASSWORD( ), а MD5( ), то в /etc/pam.d/vsftpd нужно использовать crypt=3.
Ах, да... вот еще..
Для прикручивания виртуальных каталогов к фтп-серверу, симлинки, как известно, не катят. Нужно использовать
mount_nullfs во FreeBSD или mount --bind в openSUSE, но нужно помнить, что пермишны на прикрученные виртуальные каталоги сохраняются оригинальные. Например, чтобы примонтировать папку с логами в папку "download" на фтп:
mount_nullfs /var/log /home/ftp/download
или
mount --bind /var/log /home/ftp/download
Чтобы включить автозапуск vsftpd во время загрузки системы, во FreeBSD нужно добавить соответствующую строку в /etc/rc.conf:
vsftpd_enable="YES"
В openSUSE проще всего сделать с помощью яста - в настройках ранлевелов (экспертный режим) добавить автозапуск сервиса vsftpd на третьем ранлевеле, а можно руками сделать линк:
ln -s /etc/init.d/vsftpd /etc/init.d/rc3.d/S10vsftpd
Если нужно запускать вручную:
/usr/local/libexec/vsftpd
во FreeBSD, или
/usr/sbin/vsftpd
или
service vsftpd start
в линуксе
Вот теперь, вроде бы все.
pw useradd ftp_virtual –s /usr/sbin/nologin –d /home/ftp
во FreeBSD, или
useradd ftp_virtual –d /home/ftp
в линуксе
Далее, на всякий случай, отобрать у виртуала права на запись в домашнюю директорию, иначе vsftpd заругается:
cd /home
chow ftp_virtual:ftp_virtual ftp -R
chmod 555 ftp
для линукса аналогично:
cd /home
chow ftp_virtual:users ftp -R
chmod 555 ftp
Теперь можно создать внутри корневой папки фтпшника папки для даунлоада и аплоада:
cd /home/ftp
mkdir download
chmod 555 download –R
mkdir upload
chmod 755 upload –R
Чтобы разрешить аплоадные команды по фтп виртуальному пользователю "ftpuser", нужно создать в упомянутой в vsftpd.conf директории (FreeBSD: /usr/local/etc/vsftpd/user_conf, openSUSE: /etc/vsftpd/user_conf) текстовый файл с названием "ftpuser" и вписать в него необходимые строки:
write_enable=YES
anon_mkdir_write_enable=YES
anon_upload_enable=YES
anon_other_write_enable=YES
Последняя строка позволит не только создавать, но и удалять/переименовывать. Сюда же можно добавить ограничения скорости (см. man vsftpd.conf)
Для того, чтобы состыковать pam с vsftpd, нужно отредактировать (при необходимости создать) файл /etc/pam.d/vsftpd, внутри которого должны быть строки
auth required pam_mysql.so user=vsftpd host=localhost passwd=vsftpdpass db=vsftpd table=ftp_accounts usercolumn=username passwdcolumn=password crypt=2
account required pam_mysql.so user=vsftpd host=localhost passwd=vsftpdpass db=vsftpd table=ftp_accounts usercolumn=username passwdcolumn=password crypt=2
для FreeBSD, или
auth required /lib/security/pam_userdb.so db=/etc/vsftpd/ftp_accounts
account required /lib/security/pam_userdb.so db=/etc/vsftpd/ftp_accounts
для линукса
Если по каким-либо причинам во FreeBSD понадобится использовать для шифрования паролей в базе MySQL не PASSWORD( ), а MD5( ), то в /etc/pam.d/vsftpd нужно использовать crypt=3.
Ах, да... вот еще..
Для прикручивания виртуальных каталогов к фтп-серверу, симлинки, как известно, не катят. Нужно использовать
mount_nullfs во FreeBSD или mount --bind в openSUSE, но нужно помнить, что пермишны на прикрученные виртуальные каталоги сохраняются оригинальные. Например, чтобы примонтировать папку с логами в папку "download" на фтп:
mount_nullfs /var/log /home/ftp/download
или
mount --bind /var/log /home/ftp/download
Чтобы включить автозапуск vsftpd во время загрузки системы, во FreeBSD нужно добавить соответствующую строку в /etc/rc.conf:
vsftpd_enable="YES"
В openSUSE проще всего сделать с помощью яста - в настройках ранлевелов (экспертный режим) добавить автозапуск сервиса vsftpd на третьем ранлевеле, а можно руками сделать линк:
ln -s /etc/init.d/vsftpd /etc/init.d/rc3.d/S10vsftpd
Если нужно запускать вручную:
/usr/local/libexec/vsftpd
во FreeBSD, или
/usr/sbin/vsftpd
или
service vsftpd start
в линуксе
Вот теперь, вроде бы все.
p.s.
За упущения/неточности прошу не пинать, надеюсь данный материал будет кому-либо полезен. Переработанный вариант статьи доступен на моем сайте: http://redteapot.co.cc/articles/network-s w/14-vsftpd.html
Спасибо за статью
2011-07-18 08:50 pm (UTC)