Как настроить vsftpd для пользовательского каталога в Ubuntu 18.04

Вступление

FTP, сокращение от File Transfer Protocol, является сетевым протоколом, который когда-то широко использовался для перемещения файлов между клиентом и сервером. С тех пор его заменили более быстрыми, более безопасными и более удобными способами доставки файлов. Многие обычные интернет-пользователи ожидают загрузки непосредственно из своего веб-браузера с помощью + https +, а пользователи командной строки с большей вероятностью будут использовать безопасные протоколы, такие как + scp + или https://www.digitalocean.com/community/. учебники / как в использовании, SFTP к гарантированной передача-файлы-с-дистанционному сервером [SFTP].

FTP по-прежнему используется для поддержки устаревших приложений и рабочих процессов с очень специфическими потребностями. Если у вас есть выбор, какой протокол использовать, рассмотрите возможность изучения более современных вариантов. Однако когда вам нужен FTP, vsftpd - отличный выбор. Оптимизированный для обеспечения безопасности, производительности и стабильности, vsftpd предлагает надежную защиту от многих проблем безопасности, обнаруженных на других FTP-серверах, и используется по умолчанию для многих дистрибутивов Linux.

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

Предпосылки

Чтобы следовать этому уроку, вам понадобится:

  • * Сервер Ubuntu 18.04 и пользователь без полномочий root с привилегиями sudo *: Подробнее о том, как настроить пользователя с этими привилегиями, вы можете узнать на нашем https://www.digitalocean.com/community/tutorials/initial-server -setup-with-ubuntu-18-04 [Начальная настройка сервера с Ubuntu 18.04].

Шаг 1 - Установка vsftpd

Давайте начнем с обновления списка пакетов и установки демона + vsftpd:

sudo apt update
sudo apt install vsftpd

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

sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.orig

Создав резервную копию конфигурации, мы готовы настроить брандмауэр.

Шаг 2 - Открытие брандмауэра

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

Проверьте состояние брандмауэра:

sudo ufw status

В этом случае только SSH разрешен через:

OutputStatus: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)

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

Давайте откроем порты + 20 + и + 21 + для FTP, порт + 990 + для включения TLS и порты + 40000-50000 + для диапазона пассивных портов, которые мы планируем установить в конфигурационный файл:

sudo ufw allow 20/tcp
sudo ufw allow 21/tcp
sudo ufw allow 990/tcp
sudo ufw allow 40000:50000/tcp
sudo ufw status

Наши правила брандмауэра теперь должны выглядеть так:

OutputStatus: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
990/tcp                    ALLOW       Anywhere
20/tcp                     ALLOW       Anywhere
21/tcp                     ALLOW       Anywhere
40000:50000/tcp            ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
20/tcp (v6)                ALLOW       Anywhere (v6)
21/tcp (v6)                ALLOW       Anywhere (v6)
990/tcp (v6)               ALLOW       Anywhere (v6)
40000:50000/tcp (v6)       ALLOW       Anywhere (v6)

Установив + vsftpd + и открыв необходимые порты, давайте перейдем к созданию выделенного пользователя FTP.

Шаг 3 - Подготовка каталога пользователя

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

Сначала добавьте тестового пользователя:

sudo adduser

Назначьте пароль при появлении запроса. Не стесняйтесь нажимать + ENTER через другие подсказки.

FTP обычно более безопасен, когда пользователи ограничены определенным каталогом. + vsftpd + выполняет это с помощью https://www.digitalocean.com/community/tutorials/how-to-configure-chroot-environments-for-testing-on-an-ubuntu-12-04-vps#what-is -a-chroot-environment [+ chroot +] тюрьмы. Когда + chroot + включен для локальных пользователей, они по умолчанию ограничены их домашним каталогом. Однако из-за того, как + vsftpd + защищает каталог, он не должен быть доступен для записи пользователю. Это хорошо для нового пользователя, который должен подключаться только через FTP, но существующий пользователь может нуждаться в записи в свою домашнюю папку, если у него также есть доступ к оболочке.

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

Создайте папку + ftp +:

sudo mkdir /home//ftp

Установите свою собственность:

sudo chown nobody:nogroup /home//ftp

Удалить права на запись:

sudo chmod a-w /home//ftp

Проверьте разрешения:

sudo ls -la /home/sammy/ftp
Outputtotal 8
4 dr-xr-xr-x  2 nobody nogroup 4096 Aug 24 21:29 .
4 drwxr-xr-x  3 sammy  sammy   4096 Aug 24 21:29 ..

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

sudo mkdir /home//ftp/files
sudo chown : /home//ftp/files

Проверка разрешений для каталога + ftp + должна вернуть следующее:

sudo ls -la /home/sammy/ftp
Outputtotal 12
dr-xr-xr-x 3 nobody nogroup 4096 Aug 26 14:01 .
drwxr-xr-x 3 sammy  sammy   4096 Aug 26 13:59 ..
drwxr-xr-x 2 sammy  sammy   4096 Aug 26 14:01 files

Наконец, давайте добавим файл + test.txt + для использования при тестировании:

echo "vsftpd test file" | sudo tee /home//ftp/files/test.txt

Теперь, когда мы защитили каталог + ftp + и разрешили пользователю доступ к каталогу + files +, давайте изменим нашу конфигурацию.

Шаг 4 - Настройка доступа по FTP

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

sudo nano /etc/vsftpd.conf

/etc/vsftpd.conf

. . .
# Allow anonymous FTP? (Disabled by default).
anonymous_enable=NO
#
# Uncomment this to allow local users to log in.
local_enable=YES
. . .

Далее, давайте дадим пользователю возможность загружать файлы, раскомментировав параметр + write_enable +:

/etc/vsftpd.conf

. . .
write_enable=
. . .

Мы также раскомментируем + chroot +, чтобы запретить пользователю, подключенному к FTP, доступ к любым файлам или командам вне дерева каталогов:

/etc/vsftpd.conf

. . .
chroot_local_user=
. . .

Давайте также добавим + user_sub_token +, чтобы вставить имя пользователя в наш путь + local_root directory +, чтобы наша конфигурация работала для этого пользователя и любых дополнительных будущих пользователей. Добавьте эти параметры в любое место файла:

/etc/vsftpd.conf

. . .

Давайте также ограничим диапазон портов, которые можно использовать для пассивного FTP, чтобы обеспечить достаточное количество подключений:

/etc/vsftpd.conf

. . .

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

/etc/vsftpd.conf

. . .

+ userlist_deny + переключает логику: если для него установлено значение + YES , пользователям в списке будет отказано в доступе по FTP. Когда он установлен на « NO +», доступ разрешен только пользователям в списке.

Когда вы закончите вносить изменения, сохраните файл и выйдите из редактора.

Наконец, давайте добавим нашего пользователя в + / etc / vsftpd.userlist +. Используйте флаг + -a + для добавления к файлу:

echo "" | sudo tee -a /etc/vsftpd.userlist

Проверьте, что это было добавлено, как вы ожидали:

cat /etc/vsftpd.userlist
Outputsammy

Перезапустите демон, чтобы загрузить изменения конфигурации:

sudo systemctl restart vsftpd

После настройки перейдем к тестированию доступа по FTP.

Шаг 5 - Тестирование FTP-доступа

Мы настроили сервер так, чтобы только пользователь + sammy + мог подключаться через FTP. Давайте удостоверимся, что это работает как ожидалось.

  • Анонимные пользователи не могут подключиться *: мы отключили анонимный доступ. Давайте проверим это, пытаясь подключиться анонимно. Если наша конфигурация настроена правильно, анонимным пользователям должно быть отказано в разрешении. Откройте другое окно терминала и выполните следующую команду. Обязательно замените ++ на публичный IP-адрес вашего сервера:

ftp -p
OutputConnected to 203.0.113.0.
220 (vsFTPd 3.0.3)
Name (203.0.113.0:default):
530 Permission denied.
ftp: Login failed.
ftp>

Закройте соединение:

bye
  • Пользователи, отличные от + sammy +, не смогут подключиться *: Теперь давайте попробуем подключиться как наш пользователь sudo. Им также должно быть отказано в доступе, и это должно произойти до того, как им разрешат ввести свой пароль:

ftp -p
OutputConnected to 203.0.113.0.
220 (vsFTPd 3.0.3)
Name (203.0.113.0:default):
530 Permission denied.
ftp: Login failed.
ftp>

Закройте соединение:

bye
  • Пользователь + sammy + должен иметь возможность подключаться, читать и записывать файлы *: Давайте удостоверимся, что наш назначенный пользователь может подключиться:

ftp -p
OutputConnected to 203.0.113.0.
220 (vsFTPd 3.0.3)
Name (203.0.113.0:default):
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>

Давайте перейдем в каталог + files in и с помощью команды` + get` перенесем созданный ранее тестовый файл на нашу локальную машину:

cd files
get test.txt
Output227 Entering Passive Mode (203,0,113,0,169,12).
150 Opening BINARY mode data connection for test.txt (16 bytes).
226 Transfer complete.
16 bytes received in 0.0101 seconds (1588 bytes/s)
ftp>

Далее, давайте загрузим файл с новым именем, чтобы проверить права на запись:

put test.txt upload.txt
Output227 Entering Passive Mode (203,0,113,0,164,71).
150 Ok to send data.
226 Transfer complete.
16 bytes sent in 0.000894 seconds (17897 bytes/s)

Закройте соединение:

bye

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

Шаг 6 - Обеспечение транзакций

Поскольку FTP не не шифрует любые передаваемые данные, включая учетные данные пользователя, мы включим TLS / SSL для обеспечения этого шифрования. Первым шагом является создание SSL-сертификатов для использования с + vsftpd +.

Давайте используем + openssl + для создания нового сертификата и используем флаг + -days +, чтобы сделать его действительным в течение одного года. В этой же команде мы добавим закрытый 2048-битный ключ RSA. Если для обоих флагов + -keyout + и + -out + установлено одинаковое значение, закрытый ключ и сертификат будут расположены в одном файле:

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

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

OutputGenerating a 2048 bit RSA private key
............................................................................+++
...........+++
writing new private key to '/etc/ssl/private/vsftpd.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:

Для получения более подробной информации о флагах сертификатов см. Https://www.digitalocean.com/community/tutorials/openssl-essentials-working-with-ssl-certificates-private-keys-and-csrs[OpenSSL Essentials: Работа с SSL Сертификаты, частные ключи и CSR]

Создав сертификаты, снова откройте файл конфигурации + vsftpd +:

sudo nano /etc/vsftpd.conf

Внизу файла вы увидите две строки, которые начинаются с + rsa_ +. Прокомментируйте их так, чтобы они выглядели так:

/etc/vsftpd.conf

. . .
rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
. . .

Под ними добавьте следующие строки, которые указывают на сертификат и закрытый ключ, который мы только что создали:

/etc/vsftpd.conf

. . .


. . .

После этого мы будем принудительно использовать SSL, что предотвратит подключение клиентов, которые не могут работать с TLS. Это необходимо для обеспечения шифрования всего трафика, но это может заставить вашего пользователя FTP менять клиентов. Измените + ssl_enable + на + YES +:

/etc/vsftpd.conf

. . .
ssl_enable=
. . .

После этого добавьте следующие строки, чтобы явно запретить анонимные подключения через SSL и требовать SSL как для передачи данных, так и для входа в систему:

/etc/vsftpd.conf

. . .



. . .

После этого настройте сервер на использование TLS, предпочтительного преемника SSL, добавив следующие строки:

/etc/vsftpd.conf

. . .



. . .

Наконец, мы добавим еще два варианта. Во-первых, мы не будем требовать повторного использования SSL, поскольку это может привести к поломке многих клиентов FTP Нам потребуются «высокие» наборы шифров для шифрования, что в настоящее время означает длину ключа, равную или превышающую 128 бит:

/etc/vsftpd.conf

. . .


. . .

Готовый раздел файла должен выглядеть так:

/etc/vsftpd.conf

# This option specifies the location of the RSA certificate to use for SSL
# encrypted connections.
#rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
#rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
rsa_cert_file=/etc/ssl/private/vsftpd.pem
rsa_private_key_file=/etc/ssl/private/vsftpd.pem
ssl_enable=YES
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
require_ssl_reuse=NO
ssl_ciphers=HIGH

Когда вы закончите, сохраните и закройте файл.

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

sudo systemctl restart vsftpd

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

Outputftp -p
Connected to 203.0.113.0.
220 (vsFTPd 3.0.3)
Name (203.0.113.0:default):
530 Non-anonymous sessions must use encryption.
ftp: Login failed.
421 Service not available, remote server has closed connection
ftp>

Далее, давайте проверим, что мы можем подключиться с помощью клиента, который поддерживает TLS.

Шаг 7 - Тестирование TLS с FileZilla

Большинство современных FTP-клиентов могут быть настроены на использование шифрования TLS. Мы покажем, как подключиться к FileZilla благодаря его кроссплатформенной поддержке. Обратитесь к документации для других клиентов.

Когда вы впервые откроете FileZilla, найдите значок «Менеджер сайта» прямо над словом «Хост» *, самый левый значок в верхней строке. Нажмите это:

изображение: https: //assets.digitalocean.com/articles/vsftpd_18_04/vsftpd_images/filezilla_site_manager_vsftpd_18_04.png [Снимок экрана менеджера сайта]

Откроется новое окно. Нажмите кнопку * Новый сайт * в правом нижнем углу:

image: https: //assets.digitalocean.com/articles/vsftp-user/new-site.png [Кнопка нового сайта] + Под * Моими сайтами * появится новый значок со словами * Новый сайт *. Вы можете назвать его сейчас или вернуться позже и использовать кнопку * Rename *.

Заполните поле * Host * именем или IP-адресом. В раскрывающемся меню * Шифрование * выберите * Требовать явный FTP через TLS *.

Для * Тип входа в систему * выберите * Запросить пароль *. Введите вашего пользователя FTP в поле * User *:

изображение: https: //assets.digitalocean.com/articles/vsftp-user/site-config2.png [вкладка «Общие настройки»]

Нажмите * Connect * в нижней части интерфейса. Вам будет предложено ввести пароль пользователя:

изображение: https: //assets.digitalocean.com/articles/vsftp-user/user-pass.png [Диалог пароля]

Нажмите * OK * для подключения. Теперь вы должны быть подключены к вашему серверу с шифрованием TLS / SSL.

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

изображение: https: //assets.digitalocean.com/articles/vsftpd_18_04/vsftpd_images/filezilla_certificate_vsftpd_three.png [Диалог сертификата сайта]

Когда вы приняли сертификат, дважды щелкните папку + files + и перетащите + upload.txt + влево, чтобы подтвердить, что вы можете загружать файлы:

изображение: https: //assets.digitalocean.com/articles/vsftpd_18_04/vsftpd_images/filezilla_file_test_vsftpd_18_04.png [загрузить test.txt]

Когда вы это сделаете, щелкните правой кнопкой мыши локальную копию, переименуйте ее в + upload-tls.txt + и перетащите ее обратно на сервер, чтобы подтвердить, что вы можете загружать файлы:

изображение: https: //assets.digitalocean.com/articles/vsftpd_18_04/vsftpd_images/filezilla_file_upload_vsftpd_18_04.png [Переименовать и загрузить]

Теперь вы подтвердили, что можете безопасно и успешно передавать файлы с включенным SSL / TLS.

Шаг 8 - Отключение доступа к оболочке (необязательно)

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

Сначала откройте файл с именем + ftponly + в каталоге + bin +:

sudo nano /bin/ftponly

Добавьте сообщение, сообщающее пользователю, почему он не может войти в систему:

/ Бен / ftponly

#!/bin/sh
echo "This account is limited to FTP access only."

Сохраните файл и выйдите из редактора.

Измените разрешения, чтобы сделать файл исполняемым:

sudo chmod a+x /bin/ftponly

Откройте список действительных оболочек:

sudo nano /etc/shells

Внизу добавьте:

/ и т.д. / снаряды

. . .
/bin/ftponly

Обновите оболочку пользователя с помощью следующей команды:

sudo usermod sammy -s /bin/ftponly

Теперь попробуйте войти на свой сервер как + sammy +:

ssh sammy@

Вы должны увидеть что-то вроде:

OutputThis account is limited to FTP access only.
Connection to 203.0.113.0 closed.

Это подтверждает, что пользователь больше не может + ssh + к серверу и ограничен только FTP-доступом.

Заключение

В этом уроке мы рассмотрели настройку FTP для пользователей с локальной учетной записью. Если вам нужно использовать внешний источник аутентификации, вам может понадобиться поддержка виртуальных пользователей в + vsftpd +. Это предлагает богатый набор опций благодаря использованию PAM, подключаемых модулей аутентификации, и является хорошим выбором, если вы управляете пользователями в другой системе, такой как LDAP или Kerberos.

Related