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

Вступление

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

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

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

Предпосылки

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

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

После того, как у вас есть сервер Ubuntu, вы готовы начать.

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

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

  • sudo apt-get update
  • sudo apt-get install vsftpd

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

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

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

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

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

  • 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 для диапазона пассивных портов, которые мы планируем установить в файле конфигурации:

 

  • sudo ufw allow 20/tcp
  • sudo ufw allow 21/tcp
  • sudo ufw allow 990/tcp
  • sudo ufw allow 40000:50000/tcp
  • 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-доступе. Мы позаботимся о сохранении доступа существующих пользователей к их данным в следующих инструкциях. Тем не менее, мы рекомендуем начинать с нового пользователя до тех пор, пока вы не настроите и не проверили свою настройку.

Во-первых, мы добавим тестового пользователя:

  • sudo adduser sammy

При необходимости запросите пароль и не нажимайте «ENTER» в других приглашениях.

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

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

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

  • sudo mkdir /home/sammy/ftp
  • sudo chown nobody:nogroup /home/sammy/ftp
  • sudo chmod a-w /home/sammy/ftp

Давайте проверим разрешения:

  • 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каталоге должна возвращать следующее:

  • 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файл, который будет использоваться при тестировании позже:

  • echo «vsftpd test file» | sudo tee /home/sammy/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=YES
. . .

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

/etc/vsftpd.conf
. . .
chroot_local_user=YES
. . .

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

/etc/vsftpd.conf
user_sub_token=$USER
local_root=/home/$USER/ftp

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

/etc/vsftpd.conf
pasv_min_port=40000
pasv_max_port=50000

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

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

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

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

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

  • echo «sammy» | sudo tee -a /etc/vsftpd.userlist

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

cat /etc/vsftpd.userlist
Output
sammy

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

  • sudo systemctl restart vsftpd

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

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

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

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

  • 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>

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

  • bye

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

  • 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>

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

  • bye

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

  • 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командой для переноса тестового файла, который мы создали ранее, на наш локальный компьютер:

  • cd files
  • 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>

Мы вернемся назад и попробуем загрузить файл с новым именем для проверки разрешений на запись:

  • put test.txt upload.txtOutput
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)

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

  • bye

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

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

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

Вам будет предложено предоставить адресную информацию для вашего сертификата. Запишите свою информацию по следующим вопросам:

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снова откройте файл конфигурации:

  • 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
rsa_cert_file=/etc/ssl/private/vsftpd.pem
rsa_private_key_file=/etc/ssl/private/vsftpd.pem

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

/etc/vsftpd.conf
ssl_enable=YES

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

/etc/vsftpd.conf
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES

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

/etc/vsftpd.conf
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO

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

/etc/vsftpd.conf
require_ssl_reuse=NO
ssl_ciphers=HIGH

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

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

  • sudo systemctl restart vsftpd

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

  • 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, найдите значок Менеджера сайта чуть ниже слова «Файл», самый левый значок в верхней строке. Нажмите на нее:

Менеджер сайта Screent Shot

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

Новая кнопка сайта
В разделе «Мои сайты» появится новый значок со словами «Новый сайт». Вы можете назвать его сейчас или вернуться позже и использовать кнопку «Переименовать».

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

В поле «Тип входа» выберите «Спросить пароль». Заполните пользователя FTP, который вы создали в поле «Пользователь»:

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

Диалог с паролем
Нажмите «ОК» для подключения. Теперь вы должны подключиться к вашему серверу с помощью шифрования TLS / SSL.

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

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

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

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

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

Сначала откройте файл, который вызывается ftponlyв каталоге bin:

  • sudo nano /bin/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@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.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *