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

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


Введение

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

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

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

Предпосылки

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

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

Когда у вас есть сервер Ubuntu, вы готовы начать.

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

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

  1. sudo apt-get update
  2. sudo apt-get 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 и открыв необходимые порты, мы готовы перейти к следующему шагу.

Шаг 3 — Подготовка пользовательского каталога

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

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

  1. sudo adduser sammy

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

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

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

Создайте папку ftp, установите ее владельца и обязательно удалите права на запись с помощью следующих команд:

  1. sudo mkdir /home/sammy/ftp
  2. sudo chown nobody:nogroup /home/sammy/ftp
  3. 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

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

  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

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

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

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

userlist_deny переключает логику. Если установлено значение \ДА, пользователям из списка будет отказано в доступе к FTP. Если установлено значение \НЕТ, доступ разрешен только пользователям из списка. Когда вы закончите вносить изменения, сохраните и закройте файл.

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

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

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

cat /etc/vsftpd.userlist
Output
sammy

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

  1. sudo systemctl restart vsftpd

Теперь мы готовы к тестированию.

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

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

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

  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 должен иметь возможность подключаться, а также читать и записывать файлы: Здесь мы убедимся, что наш назначенный пользователь _can_connect:

  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 не шифрует передаваемые данные, включая учетные данные пользователя, мы включим TTL/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_IP_address 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

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

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

  1. sudo systemctl restart vsftpd

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

  1. ftp -p 203.0.113.0
  2. Connected to 203.0.113.0.
  3. 220 (vsFTPd 3.0.3)
  4. Name (203.0.113.0:default): sammy
  5. 530 Non-anonymous sessions must use encryption.
  6. ftp: Login failed.
  7. 421 Service not available, remote server has closed connection
  8. ftp>

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

Шаг 7 — Тестирование TLS с помощью FileZilla

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

Когда вы впервые открываете FileZilla, найдите значок «Диспетчер сайтов» чуть ниже слова «Файл», самый левый значок в верхнем ряду. Щелкните по нему:

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

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

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

Шаг 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@203.0.113.0

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

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

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

Заключение

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