Опрос

Какая направленность контента сайта была бы вам наиболее интересна

Проводные сети
Беспроводные сети
Сетевое ПО
Общие аспекты сетей
Архив записей
Облако тегов
 

Сетевое ПО: FTP-сервер в *nix

Автор: eugene210682 | 11-11-2009, 13:32 Просмотров: 5154

Одним из наиболее защищенных 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
Ключевые теги: FreeBSD, Linux, unix-like, vsftpd
Уважаемый посетитель, вы вошли на сайт как незарегистрированный пользователь. Чтобы получить полный доступ к материалам сайта, рекомендуем вам зарегистрироваться либо войти под своим именем.

Комментарии: (1)    Распечатать

 connect
3 июля 2010 11:11
db_load –T –t hash –f ftp_accounts.list ftp_accounts.db
usage: db_load [-nTV] [-c name=value] [-f file]
[-h home] [-P password] [-t btree | hash | recno | queue] db_file
usage: db_load -r lsn | fileid [-h home] [-P password] db_file

что-то поменялось в синтаксисе опций

man db_load
Ничего про db_load в руководстве нет

awk -F: '{print}' < ftp_accounts.list | db_load -T -t hash ftp_accounts.db

О!

http://linuxportal.ru/forums/index.php/m/83765/
Комментариев: 1    
Информация

Посетители, находящиеся в группе Гости, не могут оставлять комментарии в данной новости.

Регистрация/Вход
Логин:
Пароль:

регистрация / восстановление
 

На главную / Регистрация / Статьи / Книги / Форум / О ресурсе / Обратная связь

 

Доменное имя зарегистрировано с помощью co.cc; хостинг предоставлен byethost.com; при построении сайта использованы скрипты DataLife Engine nulled. При копировании материалов, размещенных на сайте, просьба указывать ссылку на первоисточник. По всем вопросам, связанным с работой сайта, обращаться через форму обратной связи, либо по электронной почте: supervisor@redteapot.co.cc.