Вступление
FTP, сокращение от File Transfer Protocol, является сетевым протоколом, который когда-то широко использовался для перемещения файлов между клиентом и сервером. С тех пор его заменили более быстрыми, более безопасными и более удобными способами доставки файлов. Многие обычные интернет-пользователи ожидают загрузки непосредственно из своего веб-браузера с помощью + https +
, а пользователи командной строки с большей вероятностью будут использовать безопасные протоколы, такие как + scp +
или https://www.digitalocean.com/community/. учебники / как в использовании, SFTP к гарантированной передача-файлы-с-дистанционному сервером [SFTP].
FTP по-прежнему используется для поддержки устаревших приложений и рабочих процессов с очень специфическими потребностями. Если у вас есть выбор, какой протокол использовать, рассмотрите возможность изучения более современных вариантов. Однако когда вам нужен FTP, vsftpd - отличный выбор. Оптимизированный для обеспечения безопасности, производительности и стабильности, vsftpd предлагает надежную защиту от многих проблем безопасности, обнаруженных на других FTP-серверах, и используется по умолчанию для многих дистрибутивов Linux.
В этом руководстве мы покажем вам, как настроить vsftpd, чтобы пользователь мог загружать файлы в свой домашний каталог с использованием FTP с учетными данными для входа, защищенными с помощью SSL / TLS.
Предпосылки
Чтобы следовать этому уроку, вам понадобится:
-
* Сервер Ubuntu 16.04 с некорневым пользователем с привилегиями
+ sudo +
*. Подробнее о том, как настроить пользователя с этими привилегиями, вы можете узнать на нашем https://www.digitalocean.com/community/tutorials/initial -server-setup-with-ubuntu-16-04 [Начальная настройка сервера с 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 разрешен через:
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 +
и открыв необходимые порты, мы готовы перейти к следующему шагу.
Шаг 3 - Подготовка каталога пользователя
В этом руководстве мы собираемся создать пользователя, но у вас, возможно, уже есть пользователь, которому требуется доступ по FTP. Мы позаботимся о том, чтобы сохранить доступ существующего пользователя к его данным в следующих инструкциях. Тем не менее, мы рекомендуем начать с нового пользователя, пока вы не настроите и не протестируете свои настройки.
Сначала добавим тестового пользователя:
sudo adduser
При появлении запроса назначьте пароль и не стесняйтесь нажимать «ENTER» через другие запросы.
FTP обычно более безопасен, когда пользователи ограничены определенным каталогом. + Vsftpd + выполняет это с
+ chroot + jails. Когда `+ 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/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//ftp/files
sudo chown : /home//ftp/files
Проверка разрешений для каталога + files +
должна вернуть следующее:
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 +
переключает логику. Если для этого параметра установлено значение «ДА», пользователям в списке будет отказано в доступе по FTP. Когда установлено «НЕТ», доступ разрешен только пользователям в списке. Когда вы закончите вносить изменения, сохраните и выйдите из файла.
Наконец, мы создадим и добавим вашего пользователя в файл. Мы будем использовать флаг + -a +
для добавления в файл:
echo "" | sudo tee -a /etc/vsftpd.userlist
Еще раз проверьте, что это было добавлено, как вы ожидали:
cat /etc/vsftpd.userlist
Outputsammy
Перезапустите демон, чтобы загрузить изменения конфигурации:
sudo systemctl restart vsftpd
Теперь мы готовы к тестированию.
Шаг 5 - Тестирование FTP-доступа
Мы настроили сервер так, чтобы только пользователь + sammy +
мог подключаться через FTP. Давайте удостоверимся, что это так.
-
Анонимные пользователи не могут подключиться *: мы отключили анонимный доступ. Здесь мы проверим это, пытаясь подключиться анонимно. Если мы сделали это правильно, анонимным пользователям должно быть отказано в разрешении:
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 +
должен иметь возможность подключаться, а также читать и записывать файлы *: Здесь мы позаботимся о том, чтобы наш назначенный пользователь canconnect:
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
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 не не шифрует любые передаваемые данные, включая учетные данные пользователя, мы включим 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
Вам будет предложено указать адресную информацию для вашего сертификата. Подставьте свою собственную информацию для вопросов ниже:
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
Когда вы закончите, сохраните и закройте файл.
Теперь нам нужно перезапустить сервер, чтобы изменения вступили в силу:
sudo systemctl restart vsftpd
На данный момент мы больше не сможем соединиться с небезопасным клиентом командной строки. Если бы мы попробовали, мы бы увидели что-то вроде:
ftp -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.
421 Service not available, remote server has closed connection
ftp>
Затем мы проверим, что мы можем подключиться с помощью клиента, который поддерживает TLS.
Шаг 7 - Тестирование TLS с FileZilla
Большинство современных FTP-клиентов могут быть настроены на использование шифрования TLS. Мы продемонстрируем, как подключиться с помощью FileZilla из-за его кроссплатформенной поддержки. Обратитесь к документации для других клиентов.
Когда вы впервые откроете FileZilla, найдите значок «Менеджер сайта» чуть ниже слова «Файл», самый левый значок в верхней строке. Нажмите это:
изображение: http: //assets.digitalocean.com/articles/vsftp-user/site-manager.png [Диспетчер сайта Screent Shot]
Откроется новое окно. Нажмите кнопку «Новый сайт» в правом нижнем углу:
image: http: //assets.digitalocean.com/articles/vsftp-user/new-site.png [Кнопка нового сайта] + Под «Моими сайтами» появится новый значок со словами «Новый сайт». Вы можете назвать его сейчас или вернуться позже и использовать кнопку Rename.
Вы должны заполнить поле «Хост» именем или IP-адресом. В раскрывающемся меню «Шифрование» выберите «Требовать явный FTP через TLS».
Для «Тип входа в систему» выберите «Запросить пароль». Введите пользователя FTP, которого вы создали, в поле «Пользователь»:
image: http: //assets.digitalocean.com/articles/vsftp-user/site-config2.png [вкладка «Общие настройки»] + нажмите «Подключиться» в нижней части интерфейса. Вам будет предложено ввести пароль пользователя:
image: http: //assets.digitalocean.com/articles/vsftp-user/user-pass.png [Диалог пароля] + Нажмите «ОК» для подключения. Теперь вы должны быть подключены к вашему серверу с шифрованием TLS / SSL.
image: http: //assets.digitalocean.com/articles/vsftp-user/site-cert.png [Диалог сертификата сайта] + Когда вы приняли сертификат, дважды щелкните папку + files +
и перетащите кнопку загрузки. TXT слева, чтобы подтвердить, что вы можете загружать файлы.
+ изображение: http: //assets.digitalocean.com/articles/vsftp-user/file-test.png [скачать test.txt] + Когда вы это сделаете, щелкните правой кнопкой мыши на локальной копии, переименуйте ее, чтобы загрузить tls.txt` и перетащите его обратно на сервер, чтобы подтвердить возможность загрузки файлов.
image: http: //assets.digitalocean.com/articles/vsftp-user/file-upload.png [Переименовать и загрузить] + Теперь вы подтвердили, что можете безопасно и успешно передавать файлы с включенным 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@
Вы должны увидеть что-то вроде:
OutputThis account is limited to FTP access only.
Connection to 203.0.113.0 closed.
Это подтверждает, что пользователь больше не может + ssh +
к серверу и ограничен только FTP-доступом.
Заключение
В этом уроке мы рассмотрели настройку FTP для пользователей с локальной учетной записью. Если вам нужно использовать внешний источник аутентификации, вы можете обратиться к поддержке виртуальных пользователей vsftpd. Это предлагает богатый набор опций благодаря использованию PAM, подключаемых модулей аутентификации, и является хорошим выбором, если вы управляете пользователями в другой системе, такой как LDAP или Kerberos.