Поиск по сайту:

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


Введение

FTP, сокращение от File Transfer Protocol, — это сетевой протокол, который когда-то широко использовался для перемещения файлов между клиентом и сервером. С тех пор его заменили более быстрые, безопасные и удобные способы доставки файлов. Многие случайные пользователи Интернета ожидают загрузки непосредственно из своего веб-браузера с помощью https, а пользователи командной строки чаще используют безопасные протоколы, такие как scp или SFTP.

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

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

Предпосылки

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

  • Сервер Ubuntu 18.04 и пользователь без полномочий root с привилегиями sudo: вы можете узнать больше о том, как настроить пользователя с этими привилегиями, в нашем руководстве по начальной настройке сервера с Ubuntu 18.04.

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

Начнем с обновления нашего списка пакетов и установки демона vsftpd:

  1. sudo apt update
  2. sudo apt install vsftpd

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

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

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

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

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

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

  1. sudo ufw status

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

Output
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6)

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

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

  1. sudo ufw allow 20/tcp
  2. sudo ufw allow 21/tcp
  3. sudo ufw allow 990/tcp
  4. sudo ufw allow 40000:50000/tcp
  5. sudo ufw status

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

Output
Status: 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. Мы позаботимся о сохранении доступа существующего пользователя к своим данным в следующих инструкциях. Тем не менее, мы рекомендуем вам начать с нового пользователя, пока вы не настроите и не протестируете свою установку.

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

  1. sudo adduser sammy

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

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

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

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

  1. sudo mkdir /home/sammy/ftp

Установите его владельца:

  1. sudo chown nobody:nogroup /home/sammy/ftp

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

  1. sudo chmod a-w /home/sammy/ftp

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

  1. sudo ls -la /home/sammy/ftp
Output
total 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 ..

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

  1. sudo mkdir /home/sammy/ftp/files
  2. sudo chown sammy:sammy /home/sammy/ftp/files

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

  1. sudo ls -la /home/sammy/ftp
Output
total 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 для использования при тестировании:

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

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

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

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

  1. sudo nano /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:

. . .
write_enable=YES
. . .

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

. . .
chroot_local_user=YES
. . .

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

. . .
user_sub_token=$USER
local_root=/home/$USER/ftp

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

. . .
pasv_min_port=40000
pasv_max_port=50000

Примечание. На шаге 2 мы открыли порты, которые мы установили здесь для диапазона пассивных портов. Если вы меняете значения, обязательно обновите настройки брандмауэра.

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

. . .
userlist_enable=YES
userlist_file=/etc/vsftpd.userlist
userlist_deny=NO

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

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

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

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

Убедитесь, что он был добавлен, как вы ожидали:

  1. cat /etc/vsftpd.userlist
Output
sammy

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

  1. sudo systemctl restart vsftpd

Создав конфигурацию, давайте перейдем к тестированию FTP-доступа.

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

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

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

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

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

  1. bye

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

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

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

  1. bye

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

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

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

  1. cd files
  2. get test.txt
Output
227 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>

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

  1. put test.txt upload.txt
Output
227 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)

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

  1. bye

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

Шаг 6 — Защита транзакций

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

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

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

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

Output
Generating 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]:US State or Province Name (full name) [Some-State]:NY Locality Name (eg, city) []:New York City Organization Name (eg, company) [Internet Widgits Pty Ltd]:DigitalOcean Organizational Unit Name (eg, section) []: Common Name (e.g. server FQDN or YOUR name) []: your_server_ip Email Address []:

Для получения более подробной информации о флагах сертификата см. OpenSSL Essentials: Работа с SSL-сертификатами, закрытыми ключами и CSR.

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

  1. sudo nano /etc/vsftpd.conf

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

. . .
# 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, что предотвратит подключение клиентов, которые не могут работать с TLS. Это необходимо для обеспечения шифрования всего трафика, но это может заставить вашего FTP-пользователя сменить клиентов. Измените ssl_enable на YES:

. . .
ssl_enable=YES
. . .

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

. . .
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
. . .

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

. . .
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
. . .

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

. . .
require_ssl_reuse=NO
ssl_ciphers=HIGH
. . .

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

# 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

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

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

  1. sudo systemctl restart vsftpd

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

Output
ftp -p 203.0.113.0 Connected to 203.0.113.0. 220 (vsFTPd 3.0.3) Name (203.0.113.0:default): sammy 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, найдите значок «Диспетчер сайтов» чуть выше слова «Хост», самый левый значок в верхнем ряду. Щелкните по нему:

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

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

В поле «Тип входа» выберите «Запрашивать пароль». Введите своего пользователя FTP в поле «Пользователь»:

Нажмите «Подключиться» в нижней части интерфейса. Вам будет предложено ввести пароль пользователя:

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

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

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

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

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

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

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

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

  1. sudo nano /bin/ftponly

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

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

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

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

  1. sudo chmod a+x /bin/ftponly

Откройте список допустимых оболочек:

  1. sudo nano /etc/shells

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

. . .
/bin/ftponly

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

  1. sudo usermod sammy -s /bin/ftponly

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

  1. ssh sammy@your_server_ip

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

Output
This account is limited to FTP access only. Connection to 203.0.113.0 closed.

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

Заключение

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