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

Вступление

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

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

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

Предпосылки

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

  • Сервер Debian 10 и пользователь без полномочий root с привилегиями + sudo +. Подробнее о том, как создать пользователя с этими привилегиями, вы можете узнать из нашего руководства Initial Server Setup с Debian 10.

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

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

sudo apt update
sudo apt install vsftpd

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

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

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

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

Давайте проверим состояние брандмауэра, чтобы увидеть, включен ли он. Если это так, мы обеспечим, чтобы трафик FTP был разрешен, чтобы правила брандмауэра не блокировали наши тесты. В этом руководстве предполагается, что у вас установлен UFW, выполнив шаг 4 в https://www.digitalocean.com/community/tutorials/initial-server-setup-with-debian-10#step-4-%E2%80%94. -set-up-a-basic-firewall [руководство по первоначальной настройке сервера].

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

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//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
Output229 Entering Extended Passive Mode (|||47398|)
150 Opening BINARY mode data connection for test.txt (17 bytes).
100% |**********************************|    17      146.91 KiB/s    00:00 ETA
226 Transfer complete.
17 bytes received in 00:00 (0.17 KiB/s)
ftp>

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

put test.txt upload.txt
Output229 Entering Extended Passive Mode (|||46598|)
150 Ok to send data.
100% |**********************************|    17        8.93 KiB/s    00:00 ETA
226 Transfer complete.
17 bytes sent in 00:00 (0.08 KiB/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

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

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.
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/vsftpd_debian_10/vsftpd_settings.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.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  -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