FTP или File Transfer Protocol - это достаточно древний, но в то же время надёжный и проверенный протокол выгрузки файлов на удалённый сервер или их скачивания. Также иногда этот протокол применяется веб-мастерами для управления файлами или организации хранилища данных.
В этой статье мы рассмотрим, как выполняется установка FTP на Ubuntu 20.04, как настроить все необходимые компоненты, в том числе и защищённое соединение. Мы будем использовать FTP-сервер VSFTPD или Very Secure FTP Daemon, который обеспечивает самую надёжную защиту от уязвимостей.
Содержание статьи
- Установка FTP в Ubuntu
- Настройка FTP Ubuntu
- Тестирование vsftpd
- Настройка домашних папок пользователей
- Настройка защищенного соединения
- Выводы
Установка FTP в Ubuntu
Программа доступна из официальных репозиториев, поэтому установка FTP на Ubuntu Server не должна вызвать проблем. Сначала обновите список пакетов в репозиториях, затем установите саму программу:
sudo apt update
sudo apt install vsftpd
Когда установка будет завершена, вам необходимо включить сервис vsftpd, поскольку он не будет запущен по умолчанию, а также добавить службу в автозагрузку:
sudo systemctl start vsftpd
sudo systemctl enable vsftpd
Если у вас установлен фаервол ufw, а такая ситуация возникает, когда вы пытаетесь установить FTP на Ubuntu Server, нужно открыть порты 20 и 21 для нормальной работы. Чтобы это сделать, выполните команды:
sudo ufw allow 20/tcp
sudo ufw allow 21/tcp
sudo ufw status
Установка FTP Ubuntu завершена, но теперь вам осталось настроить всё необходимое для обеспечения безопасной работы. Никогда не используйте FTP-сервер с настройками по умолчанию в производственных сетях, это небезопасно.
Настройка FTP Ubuntu
Теперь перейдём к настройке. Нам нужно поменять всего несколько параметров, чтобы полностью защитить ваш FTP-сервер. Сначала мы рассмотрим самые очевидные настройки: отключения анонимного входа и так далее. Сначала необходимо скопировать оригинальный файл настроек, чтобы в случае проблем вернуть всё как было:
sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.orig
Затем откройте файл в редакторе:
sudo vi /etc/vsftpd.conf
Затем добавьте такие настройки. Вам нужно будет найти и изменить значения указанных строк, добавлять новые, если они уже есть, не стоит. Сначала отключаем анонимный вход:
Разрешаем использовать имена локальных пользователей для входа:
Для авторизованных пользователей разрешаем команды, позволяющие изменять файловую систему:
Установим значение umask для новых файлов, создаваемых по FTP:
Включаем сообщение о необходимости выбрать каталог после регистрации:
Записывать в лог файл все транзакции по передаче файлов и использовать стандартный формат лога:
Использовать порт 20 для передачи данных вместо случайного, это нужно для нормальной работы фаервола:
Указываем, что нужно ожидать входящих соединений:
Использовать PAM-библиотеки:
На завершение разрешим аутентификацию только пользователей, перечисленных в файле userlist:
Указываем файл с нашими виртуальными пользователями:
По умолчанию таким пользователям запрещён вход в систему, но мы хотим совсем обратное, поэтому добавьте такую строчку:
При входе пользователей на FTP-сервер, они могут работать только в корневом каталоге FTP. Если вы хотите, чтобы пользователи были ограничены только своей домашней папкой, то необходимо раскомментировать эти строчки:
Первая строчка указывает, что нужно разместить пользователя в изолированном домашнем каталоге, а вторая, что ему можно разрешить запись в этот каталог. Настройка FTP Ubuntu почти завершена, сохраните изменения в конфигурационном файле и перезапустите vsftpd:
sudo systemctl restart vsftpd
Тестирование vsftpd
Сервер готов, но система настроена ещё не полностью. Сначала создадим нашего тестового пользователя с помощью useradd:
sudo useradd -m -c "Test User" -s /bin/bash testuser
sudo passwd testuser
Поскольку мы хотим подключаться от его имени к FTP-серверу, то нам нужно добавить его в vsftpd.userlist:
echo "testuser" | sudo tee -a /etc/vsftpd.userlist
cat /etc/vsftpd.userlist
Теперь самое время подключится к нашему FTP-серверу и проверить, как там всё работает. Попробуем войти от имени анонимного пользователя:
У нас ничего не получится. Теперь попробуем войти от имени нашего тестового пользователя, и всё заработает как нужно.
Обратите внимание, что опасно давать пользователям доступ на запись в их домашнюю папку. Делайте это, только если уверены в том, что это необходимо и безопасно.
Настройка домашних папок пользователей
Чтобы хоть как-то обойти проблемы с безопасностью, вы можете использовать другую папку вместо домашней для предоставления её пользователю. Сначала создадим такую папку для нашего пользователя:
sudo mkdir -p /home/testuser/ftp/files
Уберём право на запись для папки ftp:
sudo chown nobody:nogroup /home/testuser/ftp
sudo chmod a-w /home/testuser/ftp
Затем дайте необходимые полномочия пользователю на запись в подпапку.
sudo chown -R testuser:testuser /home/testuser/ftp/files
sudo chmod -R 0770 /home/testuser/ftp/files/
Теперь вернёмся к конфигурационному файлу vsftpd.conf. Сначала закомментируйте строчку:
allow_writeable_chroot = YES
Теперь добавьте такие строчки:
Первая из них добавляет переменную $USER, в которой содержится имя пользователя, а вторая задаёт корневую папку для каждого пользователя. Осталось снова перезапустить FTP-сервер:
sudo systemctl restart vsftpd
Теперь вы можете снова войти от имени этого пользователя и увидите, что сейчас используется указанная нами папка.
Настройка защищенного соединения
Установка FTP на Ubuntu 20.04 завершена, но в наше время небезопасно использовать открытую передачу данных через сеть. Всё, что только возможно, необходимо шифровать. Поэтому мы рассмотрим, как настроить защищённое соединение для vsftpd. Сначала создадим папку и сгенерируем сам сертификат, который будем использовать:
sudo mkdir /etc/ssl/private
sudo openssl req -x509 -nodes -days 720 -newkey rsa:2048 -keyout /etc/ssl/private/vsftpd.key -out /etc/ssl/private/vsftpd.pem
Затем нужно разрешить доступ к портам защищённого соединения FTP с фаерволе UFW:
sudo ufw allow 990/tcp
sudo ufw allow 40000:50000/tcp
sudo ufw status
И осталось внести несколько правок в настройку самого FTP-сервера. Нам нужно включить ssl_enable и отключить поддержку шифрования sslv2 и sslv3, оставляем только tlsv1:
Далее раскоментируйте такие строки:
Запретите вход анонимных пользователей по SSL:
Теперь установим самый сложный шифр SSL:
И настроим диапазон портов для передачи данных:
Осталось перезагрузить наш сервис:
sudo systemctl restart vsftpd
Теперь тестируем, что у нас получилось:
Как видите, мы уже не можем авторизоваться с помощью утилиты ftp. FTP-сервер выдаёт, что мы обязаны использовать шифрование. Поэтому для тестирования применим FileZilla:
Теперь все данные будут передаваться по зашифрованному соединению. Установка FTP-сервер Ubuntu завершена.
Выводы
В этой статье мы рассмотрели, как выполняется установка FTP на Ubuntu Server 20.04, также как настроить FTP для максимально безопасной работы, включая настройку работы по SSL. Если у вас остались вопросы, спрашивайте в комментариях!
Отличный мануал!
но я все равно останусь использовать sftp максимум... это безопаснее.
Отличная статья! Спасибо за работу.
Делал все по инструкции, все получилось, но:
1) Если создавать каталоги с кириллическими названиями они отображаются кракозябрами, вылечил так (подсмотрел на хабре)
sudo apt-get install console-cyrillic
echo cyr >> ~/.bashrc
2) Создал еще одного пользователя точно так же как описано в разделе "Тестирование vsftpd", но он не может подключится к серверу, Filezilla выдает ошибку
Статус: TLS соединение установлено.
Команда: USER testuser2
Ответ: 331 Please specify the password.
Команда: PASS ***********
Ошибка: Ошибка GnuTLS -15: An unexpected TLS packet was received.
Ошибка: Невозможно подключиться к серверу
В чем может быть проблема?
вот и у меня были подобные проблемы, в итоге плюнул на это!
Проверил логи vsftpd в них есть инфа о действиях пользователя testuser, но ничего о testuser2.
Попробовал сделать так:
$ sudo chown -R testuser2:testuser /home/testuser/ftp/files
$ sudo chmod -R 0770 /home/testuser/ftp/files/
не помогло, помогите пожалуйста, куда копать?
попробовал отключить настройки защищенного соединения и подключится, результат:
Команда: USER testuser2
Ответ: 331 Please specify the password.
Команда: PASS *********
Ответ: 500 OOPS: cannot change directory:/home/testuser2/ftp
Ошибка: Критическая ошибка: Невозможно подключиться к серверу
Проверил права пользователя testuser2 на каталог /home/testuser/ftp/files
все нормально, могу создавать и удалять каталоги например.
На форумах народ пишет что у них та же проблема с настройкой мультидоступа к vsfpd, если пользователь один то все работает нормально, либо пользователей несколько, но каждый сидит в своей домашней папке, рабочего варианта единой папки для нескольких пользователей не нашел =(
Как вариант - домашнюю папку всем юзерам фтп одинаковую сделай. В /etc/passwd можешь изменить.
Снова включил настройки защищенного соединения
вернул на исходную права пользователей, сделал все как в инструкции
и просто закомментил в vsftpd.conf строку
#chroot_local_user = YES
теперь пользователь testuser подключается с шифрованием и попадает в папку /home/testuser/ftp/files
а пользователь testuser2 попадает в свой домашний каталог, при этом видит домашние папки других пользователей, без права на запись, но в папку /home/testuser/ftp/files войти не может.
Как же сделать так чтоб все пользователи пользовались одной папкой?
[code]
$ sudo systemctl start vsftpd
$ sudo systemctl enable vsftpd
[/code]
подскажи, для ubuntu 14 аналоги команд.
p.s. на странице "попросить инструкцию" форма не выводится, только тег
sudo service vsftpd start должно работать.
Команда работает, спасибо.
Но в итоге что-то у меня не получилось что хотелось. Может попробую завтра на свежую голову еще раз.
Сегодня, настраивал vsftpd (3.0.3-3ubuntu2) по Вашей статье, столкнулся с ошибкой соединения "ftp: connect: Connection refused". Искал в чем проблема, нашел : при установке параметра listen=YES , параметр listen_ipv6 обязательно должен быть - NO , и также между параметром и его значением не должно быть пробелов, если копировать из статьи будет ошибка. Спасибо за статью - пригодилась.
А что делать если требуется выставить корневой каталог на NTFS разделе?
На нем не действует chmod та же ((((
Ещё бы про виртуальных пользователей...
чета не понятно а логин пароль то в оконцовке какой лол? или где его ставить
пароль то он берёт что из системы!
Доброго времени суток. Помогите пожалуйста, сделал все по вашей инструкции. До раздела про шифрование. Теперь в чем проблема заходит на FTP из по Windows но не дает добавлять туда файлы Выдает ошибки 200,227,550. Как это можно решить?
Все , понял в чем проблема. Сам олень , сам решил. Спасибо большое за инструкцию.
С момента userlist_file=/etc/vsftpd.userlist
вплоть до добавления пользователя в список пользователей, всё, filezilla получает отказы подключения!
Если пишет что неправильный логин. Нужно сделать домашний каталог пользователя только для чтения.
chmod a-w /home/testuser
и запуск
ftp [ваш ip]
Версия. vsftpd: version 3.0.3. Что-то с вашей инструкцией не так.
listen=YES
Если указывать этот параметр, то при любой попытке соединения к localhost или извне выходит:
ftp: connect: Connection refused
Насколько этот параметр критичен?
"sudo useradd -m -c "Test User" -s /bin/bash testuser"
Как его потом удалить?
Добрый день. У меня не получается настроить чтоб можно было обращаться к серверу не из локальной сети а из интернета . В чем может быть причина? как это исправить ? можете помочь ?
( в локалке все работает: подключаюсь Файлзилой и качаю-записываю. А если от мобильной сети то ж(если не включать пассивный режим , то ошибка что,мол сервер возвращает другой(я так понимаю внутренней сети) адрес...а в пассивном режиме другая ошибка - не дает чтото там перечитать директорию)
На некоторых системах (например в Ubuntu Server 16.04) указание в файле настроек параметров типа "userlist_enable = YES" вызывает ошибку запуска сервера.
Правильный вид параметров "userlist_enable=YES" т.е. БЕЗ пробелов в строке параметра.
Отличный мануал. Но ничего не заработало. Целый день искал причину. Оказалось что в строках с настройками не должно быть пробелов по сторонам от знака =. При копировании строки из мануала и вставке в конфиг не получится подключится. Убираем пробелы и все работает. Может кому-то пригодится
В точку! Сам долго искал, что за фигня при запуске.
Выдаёт:
vsftpd.service: Main process exited, code=exited, status=2/INVALIDARGUMENT
vsftpd.service: Failed with result 'exit-code'.
Ещё полезная команда для диагностики что именно не нравится vsftpd в конфиге:
vsftpd -olisten=NO /etc/vsftpd.conf
создавайте юзеров правильно, тогда и ошибок не будет
sudo useradd -m -c "Test User" -s /bin/bash testuser
Укажем пароль
sudo passwd testuser
Поскольку мы хотим подключаться от его имени к FTP-серверу, то нам нужно добавить его в vsftpd.userlist:
echo "testuser" | sudo tee -a /etc/vsftpd.userlist
В команде создания ключа/сертификата ошибка:
... -keyout /etc/ssl/private/vsftpd.key -out ... должно быть так!
А написано -keyout /etc/ssl/private/vsftpd.pem
Лучше бы мануал FileZilla Server, а не вот это вот консольное безобразие.
Самая лучшая и правильная статья (по настройкам) из всех которые в поиске. Спасибо!
Использовать в гайде текстовый редактор vi, на который нужен отдельный гайд... Месье знает толк в извращениях.