Простой FTP-сервер на базе Ubuntu (vsftpd).

Время от времени у каждого системного администратора возникает потребность в FTP-сервере, чаще всего это связано с необходимостью обеспечить обмен информацией в автоматическом режиме между приложениями, например, при автообмене распределенной информационной базы 1С, или для доступа к файлам на веб-сервере.

Для нашего сервера мы будем использовать vsftpd — простой, быстрый и безопасный FTP сервер. Так как он будет обслуживать как внешнюю, так и внутреннюю сети, то имеет смысл добавить эту роль нашему роутеру. Установка сервера предельно проста:

# apt-get update

# apt-get install vsftpd

Настройка сервера производится через конфигурационный файл /etc/vsftpd.conf он имеет простую структуру, хорошо откомментирован и позволяет настроить сервер без какой-либо инструкции при наличии минимальных знаний. Рассмотрим его основные параметры.

Сначала необходимо скопировать оригинальный файл настроек, чтобы в случае проблем вернуть всё как было:

# cp /etc/vsftpd.conf /etc/vsftpd.conf.orig

Сервер может быть запущен постоянно, как служба или стартовать при необходимости, нам больше подходит первый вариант: 

Затем откройте файл в редакторе:

# mcedit etc/vsftpd.conf

1. Указываем, что нужно ожидать входящих соединений:

listen=YES 

2. Данная опция имеет взаимоисключающую запись, которую следует привести к виду:

listen_ipv6=NO

3. Разрешим вход только локальным пользователям:

anonymous_enable=NO
local_enable=
YES 

4. Разрешим пользователям записывать файлы и укажем серверу автоматически выставлять нужные права (755 на папки и 644 на файлы):

write_enable=YES
local_umask=
022 

Если требуется установить иной набор прав: 775 и 664, то umask должен быть равен 002.

5. По умолчанию сервер использует время GMT, чтобы файлам устанавливалось время вашего часового пояса, используйте опцию: 

use_localtime=YES

6. Включим лог загружаемых и скачиваемых файлов: 

xferlog_enable=YES 

7. Разрешим серверу устанавливать соединения для передачи данных на порт 20 (активный режим):

connect_from_port_20=YES 

8. Следующие опции задают место и формат хранения логов:

xferlog_file=/var/log/vsftpd.log
xferlog_std_format=
YES 

9. Зададим таймауты сессии:

idle_session_timeout=600
data_connection_timeout=120
 

10. Также в целях безопасности изолируем пользователя в его домашнем каталоге и сразу разрешим запись в его корень:

chroot_local_user=YES
allow_writeable_chroot=
YES

11. Для коррекной работы с текстовыми данными можно включить поддержку ASCII, это позволит при передаче текстового файла с Windows системы в UNIX (Linux) корректно заменить символы переноса строки с CR+LF на LF для корректного отображение содержимого и выполнить обратное преобразование при передаче его назад.

ascii_upload_enable=YES
ascii_download_enable=
YES

Можно включить только одну опцию, для закачки или скачивания. Обратите внимание, что при передаче бинарного файла в режиме ASCII последний может быть поврежден.

12. Достаточно интересная опция:

ls_recurse_enable=YES 

Она позволяет рекурсивный просмотр каталогов, с одной стороны это удобно, с другой способно вызвать большую нагрузку на сервер, если, например, получить листинг директории, содержащей большое количество файлов и каталогов. 

13. Все остальные опции оставляем по умолчанию, хотя можете отредактировать приветствие сервера, написав там все что вам нравится:

ftpd_banner=Welcome to Roga i Kopyta LLC FTP 

14. В конце конфигурационного файла зададим настройки для пассивного режима, рекомендуется явно задать порты, чтобы была возможность указать их при форвардинге, если сервер стоит за NAT или в правилах брандмауера: 

pasv_enable=YES
pasv_min_port=
62000
pasv_max_port=
62999 

Перезапускаем сервер (это нужно делать всякий раз после внесения изменений в конфигурацию): 

# service vsftpd restart 

и пробуем подключиться любым FTP-клиентом используя учетные данные существующего пользователя. Мы должны попасть в его домашнюю директорию и быть изолированы в ней.

В случае появления ошибки, связанной с некорректной работой vsftpd и системы безопасности seccomp:

500 OOPS: prctl PR_SET_SECCOMP failed 

добавьте в файл недокументированную опцию:

seccomp_sandbox=NO

Однако помните, что FTP — небезопасный протокол, поэтому пускать на сервер любого локального пользователя, как это сделано сейчас, не самый лучший вариант. Чтобы избежать такой ситуации vsftpd имеет встроенный механизм контроля пользователей. Добавим в конфигурационный файл опцию: 

userlist_enable=YES 

и создадим файл списка пользователей:

# touch /etc/vsftpd.user_list

# mcedit etc/vsftpd.user_list

По умолчанию vsftpd запрещает доступ к серверу пользователям, указанным в данном списке еще до ввода пароля, т.е. реализует принцип разрешено всем, кому не запрещено. Но гораздо лучше будет реализовать иной подход: запрещено всем, кому не разрешено. Т.е. разрешать доступ только указанным пользователям. Для этого добавим опцию:

userlist_deny=NO 

Теперь доступ к FTP-серверу будут иметь только явно указанные пользователи, их следует указывать в vsftpd.user_list по одному в строку, например:

ivanov
petrov

Если не указано иное, то подключившись по FTP пользователи попадают в свой домашний каталог. Это не всегда удобно, часто нужно перенаправлять их в иную директорию. Если это общая для всех папка, скажем /var/ftp, то можно задать опцию: 

local_root=/var/ftp 

Которая перенаправит всех пользователей в указанный каталог и изолирует их там.

Пользовательские настройки, которые перекрывают настройки основного конфигурационного файла.

Это самая простая ситуация, реальные задачи обычно сложнее, допустим нам надо установить пользователю Иванову в качестве корневой директории /var/www/example1.com, а Петрову /var/www/example2.com, чтобы каждый из них работал со своей папкой. Для этих целей можно использовать еще одну возможность vsftpd — пользовательские настройки, которые перекрывают настройки основного конфигурационного файла.

Для этого добавим опцию:

user_config_dir=/etc/vsftpd_user_conf 

Затем создадим саму директорию

mkdir /etc/vsftpd_user_conf 

Чтобы задать пользователю собственные настройки в данной директории следует создать файл с именем пользовтаеля и добавить в него необходимые опции. Изменения применяются без перезапуска FTP-сервера при следующем подключении клиента. 

Создадим файл с настройками для Иванова:

tocuh /etc/vsftpd_user_conf/ivanov 

и внесем в него опцию:

local_root=/var/www/example1.com 

При следующем подключении корневая директория пользователя изменится на указанную. Также в этом файле мы можем задавать любые персональные опции, например, другой umask или права на доступ к файлам. Однако мы не можем использовать здесь глобальные настройки: опции подключения, логгирования, аутентификации, они будут просто игнорироваться. 

Если вам нужно скрыть реальных владельцев файлов и папок, то можно использовать опцию:

hide_ids=YES 

В этом случае вместо реальных владельцев и групп будет указано ftp:ftp, это может быть полезным в случае публичного сервера или наличия в списке пользователей посторонних лиц, которым вы не хотите раскрывать реальные имена пользователей вашей системы.

Как видим, мы действительно создали рабочий FTP-сервер менее чем за полчаса.


ИСТОЧНИКИ.

Простой FTP-сервер на базе Ubuntu (vsftpd).

Автор: Уваров А.С. 27.02.2012