Как настроить 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
:
- 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 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
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/sammy/ftp/files
- sudo chown sammy:sammy /home/sammy/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/sammy/ftp/files/test.txt
Теперь, когда мы защитили каталог ftp
и разрешили пользователю доступ к каталогу files
, давайте изменим нашу конфигурацию.
Шаг 4 — Настройка FTP-доступа
Мы планируем разрешить одному пользователю с локальной учетной записью оболочки подключаться к FTP. Два ключевых параметра для этого уже заданы в vsftpd.conf
. Начните с открытия файла конфигурации, чтобы убедиться, что настройки в вашей конфигурации соответствуют приведенным ниже:
- 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
для добавления в файл:
- echo "sammy" | sudo tee -a /etc/vsftpd.userlist
Убедитесь, что он был добавлен, как вы ожидали:
- cat /etc/vsftpd.userlist
Outputsammy
Перезапустите демон, чтобы загрузить изменения конфигурации:
- sudo systemctl restart vsftpd
Создав конфигурацию, давайте перейдем к тестированию FTP-доступа.
Шаг 5 — Тестирование FTP-доступа
Мы настроили сервер так, чтобы только пользователь sammy
мог подключаться через FTP. Давайте удостоверимся, что это работает так, как ожидалось.
Анонимные пользователи не должны подключаться: мы отключили анонимный доступ. Давайте проверим это, попытавшись подключиться анонимно. Если наша конфигурация настроена правильно, анонимным пользователям должно быть отказано в доступе. Откройте другое окно терминала и выполните следующую команду. Обязательно замените 203.0.113.0
общедоступным IP-адресом вашего сервера:
- ftp -p 203.0.113.0
OutputConnected 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
OutputConnected 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
OutputConnected 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
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]: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
:
- 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
Когда вы закончите, сохраните и закройте файл.
Перезапустите сервер, чтобы изменения вступили в силу:
- sudo systemctl restart vsftpd
На этом этапе мы больше не сможем подключиться к небезопасному клиенту командной строки. Если бы мы попытались, мы бы увидели что-то вроде:
Outputftp -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
:
- 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@your_server_ip
Вы должны увидеть что-то вроде:
OutputThis account is limited to FTP access only.
Connection to 203.0.113.0 closed.
Это подтверждает, что пользователь больше не может ssh
подключаться к серверу и имеет доступ только к FTP.
Заключение
В этом руководстве мы рассмотрели настройку FTP для пользователей с локальной учетной записью. Если вам нужно использовать внешний источник аутентификации, вы можете изучить поддержку виртуальных пользователей в vsftpd
. Это предлагает богатый набор опций за счет использования PAM, подключаемых модулей аутентификации, и является хорошим выбором, если вы управляете пользователями в другой системе, такой как LDAP или Kerberos.