Одним из наиболее защищенных FTP-серверов для unix-подобных ОС по праву считается vsftpd. Функционал демона позволяет организовать фтп-сервер от простейшего с анонимными аккаунтами до сравнительно защищенного с виртуальными пользователями, которым можно назначить индивидуальные права, и шифрованием передаваемых данных по протоколу SSL/TLS. В качестве примера ниже рассмотрены установка, настройка и использование vsftpd на OpenSUSE Linux 11.0 и FreeBSD7.1.Установка и настройка 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 при первом запуске демона или в случае отсутствия конфига вообще.
Подробное руководство по опциям vsftpd.conf можно получить по
man vsftpd.conf либо на
оффсайте. Там же приведены значения по-умолчанию для каждой поддерживаемой опции. При редактировании конфига можно приводить только строки, в которых значение опции не совпадает с установленным по-умолчанию.
Для запуска демона самостоятельно (standalone mode), а не из (x)inetd в фоновом (background) режиме в конфиге должны присутствовать следующие строки:
listen=YES
background=YES
Для редактирования конфигов лично я предпочитаю пользоваться консольными редакторами nano в OpenSUSE и ee во FreeBSD, vi-подобные редакторы, несмотря на всю их мощь и гибкость, мне осилить не удалось.
Практически сразу после установки vsftpd может функционировать как фтп-сервер со включенным анонимным аккаунтом. По соображениям безопасности и для обеспечения более гибкой конфигурации прав доступа для отдельных пользователей, предпочтительнее все же использовать виртуальных пользователей, которые будут отображаться на некоего локального пользователя с предельно урезанными полномочиями. Поэтому следующими строками конфига следует запретить анонимный доступ, а также разрешить вход локальных пользователей.
anonymous_enable=NO
local_enable=YES
По-умолчанию ведение логов отключено. Поскольку логи могут быть полезными в процессе траблшутинга их будет не лишним включить:
xferlog_enable=YES
log_ftp_protocol=YES
Чтобы разрешить доступ к серверу виртуальных пользователей и обозначить имя локального пользователя, на которого они будут отображаться, нужно добавить строки:
guest_enable=YES
guest_username=ftp_virtual
Чтобы ограничить перемещение по локальным директориям и запереть фтп-пользователей в отведенном для них каталоге:
chroot_local_user=YES
secure_chroot_dir=/home/ftp
Аутентификация виртуальных пользователей может осуществляться с помощью модуля PAM (Pluggable authentication module). PAM модуль, запущенный от некоего имени (к примеру, vsftpd) в случае успешной аутентификации будет предоставлять доступ к серверу. Указать на это обстоятельство в конфиге можно строкой:
pam_service_name=vsftpd
Для более гибкого конфигурирования прав доступа различных пользователей к ресурсам сервера необходимо создать директорию, в которой будут храниться индивидуальные конфиги пользователей. О создании соответствующей директории и индивидуальных конфигов чуть позже, а пока можно просто указать в vsftpd.conf путь к директории с пользовательскими конфигами:
user_config_dir=/usr/local/etc/vsftpd/user_conf
для FreeBSD, либо
user_config_dir=/etc/vsftpd/user_conf
для OpenSUSE
Чтобы сделать сервер более дружелюбным, можно добавить немного лирики:
ftpd_banner=----Wellcome to my vsFTPd server----
Сохранить полученный конфиг нужно в /etc/vsftpd.conf на OpenSUSE, или в /usr/local/etc/vsftpd.conf на FreeBSD.
Подготовка базы виртуальных пользователейДля авторизации с помощью PAM, который сверял бы вводимый пользователем логин и пароль с хранящимся в базе зарегистрированных пользователей, в Linux можно использовать библиотеку pam_userdb.so в сочетании с берклиевской базой данных, а во FreeBSD - библиотеку pam_mysql.so вместей с базой данных MySQL.
Чтобы создать берклиевскую БД фтп-пользователей в Linux, потребуется создать текстовый файл с исходными данными (например, /etc/vsftpd/ftp_accounts.list):
cat > /etc/vsftpd/ftp_accounts.list
ftpuser
secret
Перед тем как прервать выполнение команды cat необходимо после ввода последней строки перейти на новую, иначе возникнут недоразумения при создании БД. Формат файла вполне очевиден - строка с именем пользователя, за ней строка с соответствующим паролем.
Чтобы создать БД на основе полученного текстового файла:
cd /etc/vsftpd
db_load –T –t hash –f ftp_accounts.list ftp_accounts.db
Чтобы ограничить доступ на запись в БД всем, кроме рута:
chmod 755 ftp_accounts.db
После этого можно подчистить исходный файл:
rm /etc/vsftpd/ftp_accounts.list
Во FreeBSD можно создать БД в MySQL, записать в нее логины и хэшированные пароли, а затем предельно ограничить доступ на запись и чтение. Для реализации этого замысла потребуется сначала поставить MySQL:
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
Чтобы разрешить запуск MySQL и обозначить директорию, в которой будут храниться БД, потребуется добавить в rc.conf строки
mysql_enable="YES"
mysql_limits="NO"
mysql_dbdir="/var/db/mysql"
Теперь можно запустить MySQL и создать каркас БД:
mysql –u root
CREATE DATABASE vsftpd;
В созданной базе данных нужно сформировать таблицу, в соответствующих столбцах которой будут фиксироваться цифровой id учетной записи фтп-пользователя, его логин и хэш пароля.
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
);
Если ограничения на длину логина не столь существенны, то длину поля пароля следует устанавливать соответственно выбранному алгоритму хэширования. К примеру, если вместо функции password() будет использована функция MD5(), то для хранения MD5-хэша пароля потребуется поле длиной не 50, а 32-символа.
Чтобы внести в созданную таблицу информацию о пользователе (например, логин "ftpuser", пароль "secret") нужно выполнить
INSERT INTO ftp_accounts VALUES (NULL, 'ftpuser', PASSWORD('secret'));
Столбец с id учетной записи при этом не задается вручную, а устанавливается автоматически.
Чтобы убедиться, что данные успешно занесены в таблицу:
SELECT * FROM ftp_accounts;
Поскольку выборку из таблицы ftp_accounts БД vsftpd достаточно разрешить только процессу PAM, запускаемому от имени vsftpd при вводе пароля (например, 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После того, как vsftpd настроен, а базы данных пользователей готовы, можно собрать все воедино. Во-первых нужно создать локального пользователя с минимальными полномочиями на которого будут отображаться виртуальные пользователи. Во FreeBSD это можно сделать командой
pw useradd ftp_virtual –s /usr/sbin/nologin –d /home/ftp
В Linux тоже самое можно проделать командой
useradd ftp_virtual –d /home/ftp
У вновь созданного пользователя нужно отобрать права на запись в домашнюю директорию:
cd /home
chown ftp_virtual:ftp_virtual ftp -R
chmod 555 ftp
Во FreeBSD, или
cd /home
chown ftp_virtual:users ftp -R
chmod 555 ftp
Теперь можно сформировать структуру директорий фтп-сервера. К примеру, можно создать внутри директории, отведенной под нужды фтп директории для закачивания и скачивания файлов и установить на них соответствующие права доступа:
cd /home/ftp
mkdir download
chmod 555 download –R
mkdir upload
chmod 755 upload –R
Далее можно создать индивидуальные конфиги пользователей. Чтобы назначить, к примеру, пользователю ftpuser права на запись и удаление файлов, создание и переименование, нужно в директории с индивидуальными конфигами (например, FreeBSD - /usr/local/etc/vsftpd/user_conf, Linux - /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
(то же для Linux)
В случае, если во FreeBSD будет использоваться функция MD5() для хэширования паролей, нужно задать crypt=3.
...И последние штрихиЧтобы примонтировать к фтп-серверу произвольный каталог нужно использовать
mount_nullfs во FreeBSD или mount --bind в openSUSE, при этом следует помнить, что права на папки останутся прежними. Например, чтобы примонтировать директорию с логами к фтп-серверу:
mount_nullfs /var/log /home/ftp/download
и
mount --bind /var/log /home/ftp/download
соответственно
Чтобы включить автозапуск vsftpd во время загрузки системы, во FreeBSD нужно добавить соответствующую строку в /etc/rc.conf:
vsftpd_enable="YES"
В openSUSE проще всего сделать с помощью Yast - в настройках ранлевелов (экспертный режим) добавить автозапуск сервиса vsftpd на третьем ранлевеле, а можно вручную сделать симлинк:
ln -s /etc/init.d/vsftpd /etc/init.d/rc3.d/S10vsftpd
Чтобы включить шифрование по SSL/TLS потребуется установить OpenSSL и добавить в vsftpd.conf соответствующие строки:
ssl_enable=YES
ssl_ciphers=RC4-SHA
force_local_data_ssl=YES
force_local_logins_ssl=YES
ssl_tlsv1=YES
rsa_cert_file=/usr/local/etc/vsftpd/certs/vsftpd.pem
В качестве клиента при установлении защищенного соединения можно использовать например Total Commander, но предварительно придется опять-таки установить OpenSSL.
Запуск, остановку и рестарт демона проще всего делать во FreeBSD с помощью соответствующего скрипта, например:
/usr/local/etc/rc.d/vsftpd start
В Linux то же можно проделать с помощью стартовых скриптов:
/etc/rc.d/vsftpd start
или
service vsftpd start