Как установить FTP сервер vsftpd и настроить на Ubuntu 20


12 февраля 2021


Установка и настройка vsftpd на Ubuntu 20

Vsftpd это один из самых популярных сервисов для работы по FTP на Linux. Существуют похожие сервисы для работы с FTP - это PureFTPd и ProFTPD. В этой статье мы рассмотрим установку этого сервиса на Ubuntu и настройку SSL/TLS подключения, пользователей, папок и портов.

 

Установка и минимальная настройка

Для установки сервиса у вас должны быть права sudo. Следующей командой мы выполним установку:

sudo apt install vsftpd

Включим сервис и проверим его работу:

sudo systemctl enable --now vsftpd
systemctl status vsftpd

Запуск сервера FTP sftpd на Ubuntu 20

Если у вас отключен фаервол или разрешено FTP подключение - вы уже сможете выполнить подключение использовав учетные данные вашего пользователя. При подключении вы окажетесь в домашнем каталоге своего пользователя с возможностью перехода в другие.

Разрешение активного и пассивного режима в фаерволе

У вас могут быть запрещены порты для подключения к FTP. Что бы разрешить этот тип соединения откройте на Ubuntu порты:

sudo ufw allow 20/tcp
sudo ufw allow 21/tcp
sudo ufw allow 10100:10110/tcp
sudo ufw status

Включение правил для фаервола для сервера FTP sftpd на Ubuntu 20

Номера портов зависят от типа подключения, которые вы планируете использовать. FTP сервера работают в двух режимах:

  • активный - клиент передает данные для сессии, а сервер по этим данным сам устанавливает сессию/подключение;

  • пассивный - клиент передает данные для сессии и сам устанавливает сессию/подключение.

В активном режиме клиент выполняет подключение на 21 порт сервера и сообщает по какому порту к нему можно подключится. Сервер подключается к порту клиента, но уже с 20 порта.

В пассивном режиме клиент так же подключается на 21 порт, но теперь уже сервер сообщает номер порта для установки сессии. Клиент сам устанавливает сессию по этому порту. Номер портов, которые может использовать сервер, устанавливается в настройках. Мы, в примере выше, открыли порты с 10100 по 10110 для этого. Пассивный режим является более безопасным и рекомендуемым.

По умолчанию режим всегда активный. Если вы хотите это изменить, то вам нужно зайти в файл конфигурации vsftpd:

sudo vim /etc/vsftpd.conf

Добавите следующие строки (измените номера портов, если вы планируете использовать другие):

pasv_enable=YES
pasv_min_port=10100
pasv_max_port=10110

Включение пассивного режима FTP sftpd на Ubuntu 20

Перезапустите сервис и проверьте его работу:

sudo systemctl restart vsftpd.service
systemctl status vsftpd.service

Перезапуск сервиса FTP vsftpd Ubuntu 20

В клиенте FileZilla, например, есть возможность автоматического переключения между пассивным и активным методом передачи. Пассивный режим стоит предпочтительным умолчанию. Если у вас не удастся подключение - то вы можете попробовать явно установить этот режим в одной из настроек:

Включение пассивного режима на FileZilla

 

Разрешения

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

sudo vim /etc/vsftpd.conf

Если вам нужно такое право вы можете снять комментарий или просто добавить следующую строку:

write_enable=YES

Добавление права на запись в FTP сервере vsftpd Ubuntu 20

Каждое изменение этого файла нуждается в последующем перезапуске сервера vsftpd:

sudo systemctl restart vsftpd.service
systemctl status vsftpd.service

Каталоги

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

chroot_local_user=YES

Если мы попробуем подключиться не сделав дополнительные настройки, то получим ошибку:

  • 500 OOPS: vsftpd: refusing to run with writable root inside chroot()

Эта ошибка связана с разрешением на запись в каталог куда подключается пользователь. Исправляется это добавлением этой строки:

allow_writeable_chroot=YES

Добавление записи при chroot_local_user в Ubuntu 20

После этого вы сможете подключиться к вашему домашнему каталогу.

Если вы хотите установить другую папку для подключения - это можно сделать через следующую инструкцию (в моем случае папка заменена на /var/www/):

local_root=/var/www/

Каталоги могут быть динамическими, т.е. привязаны к разным учетным данным. Например у меня есть пользователи site1 и site2 и они должны подключаться к аналогичным директориям в /var/www. Это можно сделать так:

user_sub_token=$USER
local_root=/var/www/$USER/

Смена директорий в FTP сервере vsftpd на Ubuntu 20

Если у вас не будет создана папка для пользователя - появится ошибка:

  • 500 OOPS: cannot change directory:/var/www/user/

Похожая ошибка может произойти из-за отсутствия прав на чтение директории.

Перезапустите сервис что бы изменения вступили в силу.

 

Пользователи

В файле конфигурации '/etc/vsftpd.conf' по умолчанию прописаны настройки запрещающие подключение анонимным пользователям (без пары логин/пароль) и разрешающие локальным. Эти настройки изменить в следующих директивах:

vim /etc/vsftpd.conf
anonymous_enable=NO
local_enable=YES

Включение анонимных и локальных пользователей в vsftpd на Ubuntu 20

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

userlist_enable=YES
userlist_file=/etc/vsftpd_user_list

В моем примере создан файл '/etc/vsftpd_user_list' и в нем мы описываем логины пользователей с новой строки.

Если в файл конфигурации vsftpd добавить следующую строку, то список пользователей станет тем кому разрешено подключаться, а не запрещено:

userlist_deny=NO

Использование списка пользователей vsftpd на Ubuntu 20

Перезапустите сервис:

sudo systemctl reload vsftpd.service
systemctl status vsftpd.service

Отдельная учетная запись

В примерах выше рассматривались случаи, когда пользователи подключающееся в vsftpd так же имели права подключаться через ssh. Это не всегда является желательным случаем и вы можете это запретить. Один из способов - просто создать пользователя, который вместо shell будет запускать /sbin/nologin (запрещающее вход пользователя):

sudo usermod testuser -s /sbin/nologin

Второй способ - создать отдельную точку входа для FTP пользователей. Создадим файл с сообщением если такие пользователи будут пробовать зайти в систему:

echo -e '#!/bin/sh\necho "FTP access only."' | sudo tee -a  /bin/ftponly
sudo chmod a+x /bin/ftponly

Добавим новую оболочку в файл /etc/shells:

echo "/bin/ftponly" | sudo tee -a /etc/shells

Изменим у существующего пользователя оболочку:

sudo usermod testuser -s /bin/ftponly

Этого же пользователя нужно добавить в список разрешенных пользователей, если вы его ведете.

Теперь, при попытке входа используя ssh у вас будет появляться следующее сообщение:

Блокировка FTP пользователей для доступа через ssh

 

SSL/TLS

По умолчанию подключение к FTP серверу не шифруется, а это сильно упрощает перехват ваших личных данных злоумышленниками. Что бы этого избежать вы можете зашифровать соединения. Подобные соединения шифруются сертификатами. Такой сертификат можно сделать самому, а можно купить. Минус в самодельном сертификате будет в том, что вы потеряете одну из степеней проверки сертификата (это можно исправить, но не описано в рамках этой статьи).

В Ubuntu уже должен быть установлен openssl сервер - вы это можете проверить с помощью следующей команды:

sudo apt list openssl

Проверка установки openssl

С помощь следующей команды мы создадим ключ сроком в 10 лет по пути '/etc/vsftpd.pem'. У вас так же появятся дополнительные параметры, которые вы можете заполнить по желанию:

sudo openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /etc/ssl/private/vsftpd.pem -out /etc/ssl/private/vsftpd.pem

Создание сертификата для FTP сервера vsftpd

Далее нам нужно открыть файл конфигурации vsftpd:

sudo vim /etc/vsftpd.conf

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

rsa_cert_file=/etc/ssl/private/vsftpd.pem
rsa_private_key_file=/etc/ssl/private/vsftpd.pem
ssl_enable=YES

Включение работы ssl/tls для работы в vsftpd

Перезапустим сервис:

sudo systemctl reload vsftpd.service

После этого, при подключении к FTP (на моем примере клиент FileZilla), появится следующее окно:

Запрос сертификата в FileZilla

Сертификат помечается неизвестным т.к. его не получается проверить (описано в начале главы), но соединение будет зашифрованным.

Вы можете установить дополнительные параметры для работы с ssl:

# Запрещаем анонимные подключения через SSL
allow_anon_ssl=NO

# Требует использования SSL для входа и передачи данных
force_local_data_ssl=YES
force_local_logins_ssl=YES

По умолчанию, при включении ssl через ssl_enable, преимущество всегда у TLS v1. С помощью следующих инструкций вы можете отключить более старые протоколы, что бы они не использовались:

ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO

Implicit и explicit FTP

Пример выше демонстрировал работу FTP на тех же портах, что и при обычном подключении (20,21). Такой вид подключения называется explicit (явный). Такой способ говорит о том, что ваш FTP клиент обязан сам запросить шифрование иначе соединение будет обычным.

В vsftpd предусмотрена возможность использования зашифрованного подключения используя другой порт. Такое подключение называют Implicit (не явный), и оно будет срабатывать в любом случае. Для такого подключения, обычно, используется 990 порт и вы должны открыть его на фаерволе:

sudo ufw allow 990/tcp

И установить настройки в файле конфигурации:

implicit_ssl=YES
listen_port=990

После перезагрузки сервиса у вас будет работать только 990 порт.

...

Теги: #ftp #linux


Каналы
Telegram FixMyPc Telegram Лента FixMyPC RSS Rss
Популярные тэги
О блоге
Этот блог представляет собой конспекты выученного материала, приобретённого опыта и лучшие практики в системном администрировании и программировании.