Как установить FTP сервер на Ubuntu VPS
Содержание статьи
Вступление
В этом руководстве расскажем, как установить FTP сервер на VPS с ОС Ubuntu. Будем использовать сервер vsftpd, который считается самым быстрым и безопасным FTP сервером для UNIX-систем.
FTP или File Transfer Protocol – протокол приема и передачи файлов в сети. Используя модель клиент/сервер и безопасность SSL/TLS, FTP позволяет пользователям обмениваться файлами с удаленными компьютерами безопасно, эффективно и надежно, передавая данных по протоколу TCP/IP.
FTP работает подобно HTTP или SMTP, с единственным отличием, что он ответственен за безопасную передачу данных от отправителя к получателю, а не веб-страницы с сервера к пользователю или электронного письма через интернет. В этом руководстве рассмотрено создание FTP сервера на ОС Ubuntu версии 16.04.
Примечание: Текущее руководство основывается на версии ОС Ubuntu 16.04. Но вы можете применить те же шаги по созданию FTP сервера на Ubuntu 14.04.
Содержание
Шаг 1 – Установка Vsftpd
Прежде всего, давайте сделаем обновление всех пакетов перед началом установки демона vsftpd. Для этого выполним команду:
sudo apt—get update |
Дождитесь завершения всех процессов и вы увидите подтверждающее сообщение:
Затем установим демон vsftpd следующей командой:
sudo apt—get install vsftpd |
Вы получите уведомление требующее подтверждения, нажмите Y и Enter для продолжения установки.
По завершению установки, сделаем бэкап оригинального файла конфигурации, чтобы начать с чистого файла настроек:
sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.original |
Теперь мы можем переходить к следующему шагу и настраивать фаервол.
Шаг 2 – Разрешение FTP трафика на фаерволе
Чтобы позволить серверу FTP, развёрнутому на ОС Ubuntu взаимодействовать с внешним миром, нужно настроить путь через фаервол. Для начала посмотрим включён ли фаервол. Запустите следующую команду для определения статуса:
sudo ufw status |
Если вы увидите такое сообщение:
ufw: command not found |
Это значит, что фаервол не установлен и можно перходить к следующему шагу.
Если же на выходе будут показаны правила или сообщение о том, что фаервол активен, нужно определить, как он будет обрабатывать FTP-трафик. Давайте сделаем следующее, откроем порты 20 и 21 для трафика FTP; порты 40000-50000 будут зарезервированы, как диапазон пассивных портов, который в конечном итоге будет установлен в файле конфигурации; порт 990 будет использоваться, когда TLS будет включен. Выполним следующие команды:
sudo ufw allow 20/tcp sudo ufw allow 21/tcp sudo ufw allow 990/tcp sudo ufw allow 40000:50000/tcp |
Теперь посмотрим на статус:
sudo ufw status |
Результат будет выглядеть где-то так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <span class=«crayon-e»>Output</span> <span class=«crayon-v»>Status</span><span class=«crayon-o»>:</span> <span class=«crayon-e»>active</span> <span class=«crayon-st»>To</span><span class=«crayon-h»> </span><span class=«crayon-e»>Action </span><span class=«crayon-v»>From</span> <span class=«crayon-o»>—</span><span class=«crayon-h»> </span><span class=«crayon-o»>—</span><span class=«crayon-o»>—</span><span class=«crayon-o»>—</span><span class=«crayon-h»> </span><span class=«crayon-o»>—</span><span class=«crayon-o»>—</span> <span class=«crayon-cn»>990</span><span class=«crayon-o»>/</span><span class=«crayon-e»>tcp </span><span class=«crayon-e»>ALLOW </span><span class=«crayon-i»>Anywhere</span> <span class=«crayon-cn»>20</span><span class=«crayon-o»>/</span><span class=«crayon-e»>tcp </span><span class=«crayon-e»>ALLOW </span><span class=«crayon-i»>Anywhere</span> <span class=«crayon-cn»>21</span><span class=«crayon-o»>/</span><span class=«crayon-e»>tcp </span><span class=«crayon-e»>ALLOW </span><span class=«crayon-i»>Anywhere</span> <span class=«crayon-cn»>40000</span><span class=«crayon-o»>:</span><span class=«crayon-cn»>50000</span><span class=«crayon-o»>/</span><span class=«crayon-e»>tcp </span><span class=«crayon-e»>ALLOW </span><span class=«crayon-i»>Anywhere</span> <span class=«crayon-cn»>20</span><span class=«crayon-o»>/</span><span class=«crayon-e»>tcp</span> <span class=«crayon-sy»>(</span><span class=«crayon-v»>v6</span><span class=«crayon-sy»>)</span><span class=«crayon-h»> </span><span class=«crayon-e»>ALLOW </span><span class=«crayon-e»>Anywhere</span> <span class=«crayon-sy»>(</span><span class=«crayon-v»>v6</span><span class=«crayon-sy»>)</span> <span class=«crayon-cn»>21</span><span class=«crayon-o»>/</span><span class=«crayon-e»>tcp</span> <span class=«crayon-sy»>(</span><span class=«crayon-v»>v6</span><span class=«crayon-sy»>)</span><span class=«crayon-h»> </span><span class=«crayon-e»>ALLOW </span><span class=«crayon-e»>Anywhere</span> <span class=«crayon-sy»>(</span><span class=«crayon-v»>v6</span><span class=«crayon-sy»>)</span> <span class=«crayon-cn»>990</span><span class=«crayon-o»>/</span><span class=«crayon-e»>tcp</span> <span class=«crayon-sy»>(</span><span class=«crayon-v»>v6</span><span class=«crayon-sy»>)</span><span class=«crayon-h»> </span><span class=«crayon-e»>ALLOW </span><span class=«crayon-e»>Anywhere</span> <span class=«crayon-sy»>(</span><span class=«crayon-v»>v6</span><span class=«crayon-sy»>)</span> <span class=«crayon-cn»>40000</span><span class=«crayon-o»>:</span><span class=«crayon-cn»>50000</span><span class=«crayon-o»>/</span><span class=«crayon-e»>tcp</span> <span class=«crayon-sy»>(</span><span class=«crayon-v»>v6</span><span class=«crayon-sy»>)</span><span class=«crayon-h»> </span><span class=«crayon-e»>ALLOW </span><span class=«crayon-e»>Anywhere</span> <span class=«crayon-sy»>(</span><span class=«crayon-v»>v6</span><span class=«crayon-sy»>)</span> |
Теперь, все необходимые порты открыты и доступны для нас и мы можем переходит к следующему шагу.
Шаг 3 – Создание каталога пользователя
На третьем шаге создания Ubuntu FTP сервера, нужно выбрать пользователя, который будет подключатся по FTP. Для этого создадим нового пользователя, выполнив такую команду:
<span class=«crayon-e»>sudo </span><span class=«crayon-e»>adduser </span><span class=«crayon-v»>alex</span> |
Заполните пароль и другие детали, когда запросит. В идеале, с точки зрения безопасности, FTP должен быть ограничен одним специальным каталогом. Vsftpd использует chroot для создания этой защиты. Со включённым chroot, локальный пользователь ограничивается его домашним каталогом (по умолчанию). Однако, может оказаться, что из-за защиты vsftpd, пользователь не сможет ничего создавать в каталоге. Мы не убираем права на запись в домашнем каталоге, вместо этого мы сделаем каталог ftp, который будет вести себя как chroot вместе с сохранением способности к записи, что будет позволять хранить файлы. Используйте такую команду для создания каталога FTP:
<span class=«crayon-e»>sudo </span><span class=«crayon-v»>mkdir</span> <span class=«crayon-o»>/</span><span class=«crayon-v»>home</span><span class=«crayon-o»>/</span><span class=«crayon-v»>alex</span><span class=«crayon-o»>/</span><span class=«crayon-v»>ftp</span> |
Установите права владения:
<span class=«crayon-e»>sudo </span><span class=«crayon-e»>chown </span><span class=«crayon-v»>nobody</span><span class=«crayon-o»>:</span><span class=«crayon-v»>nogroup</span> <span class=«crayon-o»>/</span><span class=«crayon-v»>home</span><span class=«crayon-o»>/</span><span class=«crayon-v»>alex</span><span class=«crayon-o»>/</span><span class=«crayon-v»>ftp</span> |
Наконец, удалите права на запись:
<span class=«crayon-e»>sudo </span><span class=«crayon-i»>chmod</span> <span class=«crayon-v»>a</span><span class=«crayon-o»>—</span><span class=«crayon-v»>w</span> <span class=«crayon-o»>/</span><span class=«crayon-v»>home</span><span class=«crayon-o»>/</span><span class=«crayon-v»>alex</span><span class=«crayon-o»>/</span><span class=«crayon-v»>ftp</span> |
Теперь, используя следующую команду проверьте права доступа:
<span class=«crayon-e»>sudo </span><span class=«crayon-v»>ls</span> <span class=«crayon-o»>—</span><span class=«crayon-v»>la</span> <span class=«crayon-o»>/</span><span class=«crayon-v»>home</span><span class=«crayon-o»>/</span><span class=«crayon-v»>alex</span><span class=«crayon-o»>/</span><span class=«crayon-v»>ftp</span> |
На выходе мы увидим приблизительно это:
<span class=«crayon-i»>total</span> <span class=«crayon-cn»>8</span> <span class=«crayon-v»>dr</span><span class=«crayon-o»>—</span><span class=«crayon-v»>xr</span><span class=«crayon-o»>—</span><span class=«crayon-v»>xr</span><span class=«crayon-o»>—</span><span class=«crayon-i»>x</span> <span class=«crayon-cn»>2</span> <span class=«crayon-e»>nobody </span><span class=«crayon-i»>nogroup</span> <span class=«crayon-cn»>4096</span> <span class=«crayon-i»>Jun</span> <span class=«crayon-cn»>29</span> <span class=«crayon-cn»>11</span><span class=«crayon-o»>:</span><span class=«crayon-cn»>32</span> <span class=«crayon-sy»>.</span> <span class=«crayon-v»>drwxr</span><span class=«crayon-o»>—</span><span class=«crayon-v»>xr</span><span class=«crayon-o»>—</span><span class=«crayon-i»>x</span> <span class=«crayon-cn»>3</span> <span class=«crayon-e»>alex </span><span class=«crayon-i»>alex</span><span class=«crayon-h»> </span><span class=«crayon-cn»>4096</span> <span class=«crayon-i»>Jun</span> <span class=«crayon-cn»>29</span> <span class=«crayon-cn»>11</span><span class=«crayon-o»>:</span><span class=«crayon-cn»>32</span> <span class=«crayon-sy»>.</span><span class=«crayon-sy»>.</span> |
На следующем этапе мы создадим файл, содержащий каталоги и права доступа к ним:
<span class=«crayon-e»>sudo </span><span class=«crayon-v»>mkdir</span> <span class=«crayon-o»>/</span><span class=«crayon-v»>home</span><span class=«crayon-o»>/</span><span class=«crayon-v»>alex</span><span class=«crayon-o»>/</span><span class=«crayon-v»>ftp</span><span class=«crayon-o»>/</span><span class=«crayon-e»>files</span> <span class=«crayon-e»>sudo </span><span class=«crayon-e»>chown </span><span class=«crayon-v»>alex</span><span class=«crayon-o»>:</span><span class=«crayon-v»>alex</span> <span class=«crayon-o»>/</span><span class=«crayon-v»>home</span><span class=«crayon-o»>/</span><span class=«crayon-v»>alex</span><span class=«crayon-o»>/</span><span class=«crayon-v»>ftp</span><span class=«crayon-o»>/</span><span class=«crayon-v»>files</span> |
И наконец, добавим в каталог тестовый файл, который мы будет использовать во время тестирования чего-либо:
<span class=«crayon-i»>echo</span> <span class=«crayon-s»>«vsftpd sample file»</span> <span class=«crayon-o»>|</span> <span class=«crayon-e»>sudo </span><span class=«crayon-v»>tee</span> <span class=«crayon-o»>/</span><span class=«crayon-v»>home</span><span class=«crayon-o»>/</span><span class=«crayon-v»>alex</span><span class=«crayon-o»>/</span><span class=«crayon-v»>ftp</span><span class=«crayon-o»>/</span><span class=«crayon-v»>files</span><span class=«crayon-o»>/</span><span class=«crayon-v»>sample</span><span class=«crayon-sy»>.</span><span class=«crayon-v»>txt</span> |
Шаг 4 – Настройка vsftpd
Чтобы продолжить устанавливать FTP сервер на Ubuntu VPS, нам нужно настроить vsftpd и наш FTP-доступ. В этом руководстве мы разрешим одному пользователю подключаться по FTP, используя локальную консоль. Необходимая для этого двух этапная настройка уже установлена в конфигурационном файле (vsftpd.conf). Вначале проверьте, чтобы настройки в файле совпадали с указанными ниже, используя команду nano:
<span class=«crayon-e»>sudo </span><span class=«crayon-v»>nano</span> <span class=«crayon-o»>/</span><span class=«crayon-v»>etc</span><span class=«crayon-o»>/</span><span class=«crayon-v»>vsftpd</span><span class=«crayon-sy»>.</span><span class=«crayon-v»>conf</span> |
1 2 3 4 5 6 7 8 9 10 11 12 13 | <span class=«crayon-sy»>.</span> <span class=«crayon-sy»>.</span> <span class=«crayon-sy»>.</span> <span class=«crayon-p»># Allow anonymous FTP? (Disabled by default).</span> <span class=«crayon-v»>anonymous_enable</span><span class=«crayon-o»>=</span><span class=«crayon-v»>NO</span> <span class=«crayon-p»>#</span> <span class=«crayon-p»># Uncomment this to allow local users to log in.</span> <span class=«crayon-v»>local_enable</span><span class=«crayon-o»>=</span><span class=«crayon-i»>YES</span> <span class=«crayon-sy»>.</span> <span class=«crayon-sy»>.</span> <span class=«crayon-sy»>.</span> |
В этом же файле, продолжим удаляя # включаем write_enable:
<span class=«crayon-sy»>.</span> <span class=«crayon-sy»>.</span> <span class=«crayon-sy»>.</span> <span class=«crayon-v»>write_enable</span><span class=«crayon-o»>=</span><span class=«crayon-i»>YES</span> <span class=«crayon-sy»>.</span> <span class=«crayon-sy»>.</span> <span class=«crayon-sy»>.</span> |
Chroot также раскоментируем, чтобы убедиться, что пользователь, подключившийся по FTP имеет доступ к файлам внутри разрешённой директории:
<span class=«crayon-sy»>.</span> <span class=«crayon-sy»>.</span> <span class=«crayon-sy»>.</span> <span class=«crayon-v»>chroot_local_user</span><span class=«crayon-o»>=</span><span class=«crayon-i»>YES</span> <span class=«crayon-sy»>.</span> <span class=«crayon-sy»>.</span> <span class=«crayon-sy»>.</span> |
Несколько новых значений будут также нужны для добавления вручную. Вы можете просто вставить их в конец файла. Вначале, user_sub_token добавим к пути каталога local_root. Это позволит конфигурации работать с текущим пользователем и любым другим пользователем, который будет добавлен позже:
<span class=«crayon-v»>user_sub_token</span><span class=«crayon-o»>=</span><span class=«crayon-sy»>$</span><span class=«crayon-e»>USER</span> <span class=«crayon-v»>local_root</span><span class=«crayon-o»>=</span><span class=«crayon-o»>/</span><span class=«crayon-v»>home</span><span class=«crayon-o»>/</span><span class=«crayon-sy»>$</span><span class=«crayon-v»>USER</span><span class=«crayon-o»>/</span><span class=«crayon-v»>ftp</span> |
Чтобы быть уверенным, что доступно достаточное количество соединений, мы ограничим количество портов, используемое в конфигурационном файле:
<span class=«crayon-v»>pasv_min_port</span><span class=«crayon-o»>=</span><span class=«crayon-cn»>40000</span> <span class=«crayon-v»>pasv_max_port</span><span class=«crayon-o»>=</span><span class=«crayon-cn»>50000</span> |
В этом руководстве мы планируем дать доступ индивидуальной основе, поэтому давайте установим настройки так, чтобы дать доступ только тем пользователям, которые непосредственно добавлены в список:
<span class=«crayon-v»>userlist_enable</span><span class=«crayon-o»>=</span><span class=«crayon-e»>YES</span> <span class=«crayon-v»>userlist_file</span><span class=«crayon-o»>=</span><span class=«crayon-o»>/</span><span class=«crayon-v»>etc</span><span class=«crayon-o»>/</span><span class=«crayon-v»>vsftpd</span><span class=«crayon-sy»>.</span><span class=«crayon-e»>userlist</span> <span class=«crayon-v»>userlist_deny</span><span class=«crayon-o»>=</span><span class=«crayon-v»>NO</span> |
Флаг userlist_deny отвечает за переключение логики, когда он установлен в “NO”, только те пользователи, которые есть в списке имеет доступ. По завершению нажмите CTRL+X и подтвердите сохранения изменений в файле.
В завершение, продолжим создание и добавление нашего пользователя в файл:
<span class=«crayon-i»>echo</span> <span class=«crayon-s»>«alex»</span> <span class=«crayon-o»>|</span> <span class=«crayon-e»>sudo </span><span class=«crayon-v»>tee</span> <span class=«crayon-o»>—</span><span class=«crayon-v»>a</span> <span class=«crayon-o»>/</span><span class=«crayon-v»>etc</span><span class=«crayon-o»>/</span><span class=«crayon-v»>vsftpd</span><span class=«crayon-sy»>.</span><span class=«crayon-v»>userlist</span> |
Проверим, что пользователь действительно активен запуском команды:
<span class=«crayon-v»>cat</span> <span class=«crayon-o»>/</span><span class=«crayon-v»>etc</span><span class=«crayon-o»>/</span><span class=«crayon-v»>vsftpd</span><span class=«crayon-sy»>.</span><span class=«crayon-v»>userlist</span> |
Вывод должен быть “alex”, как показано на скриншоте:
Перезапустите демона, используя следующую команду, чтобы запустить изменения настроек:
<span class=«crayon-e»>sudo </span><span class=«crayon-e»>systemctl </span><span class=«crayon-e»>restart </span><span class=«crayon-v»>vsftpd</span> |
Шаг 5 – Делаем защищенный FTP
По умолчанию, FTP не делает никакого шифрование данных, поэтому мы будем использовать TLS/SSL, чтобы позаботиться о безопасности. В качестве первого шага нам нужно создать SSL сертификат и использовать его для защиты Ubuntu FTP сервера. Для начала выполним следующую команду:
sudo openssl req —x509 —nodes —days 365 —newkey rsa:2048 —keyout /etc/ssl/private/vsftpd.pem —out /etc/ssl/private/vsftpd.pem |
Флаг –days делает сертификат действующим в течение года и мы включаем 2048-битный приватный ключ RSA в этой же команде. Когда запросит нужные данные введите их в предоставленном поле.
После создания сертификата ещё раз откройте конфигурационный файл:
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 и убедимся, что только пользователи со включённым SSL могут с нами связываться. Измените значение ssl_enable на YES:
<span class=«crayon-v»>ssl_enable</span><span class=«crayon-o»>=</span><span class=«crayon-v»>YES</span> |
Теперь добавьте следующие строки для продолжения создания защиты (это запретить какие-либо анонимные соединения с использованием SSL):
allow_anon_ssl=NO force_local_data_ssl=YES force_local_logins_ssl=YES |
Настройте TLS используя:
ssl_tlsv1=YES ssl_sslv2=NO ssl_sslv3=NO |
Здесь мы добавим ещё 2 опции. Во-первых, повторное использование SSL не будет необходимым, потому что это может привести к разрывам у большого количества клиентов. Во-вторых, мы будем использовать высокозащищенный код шифрования, что будет означать, что длина ключа соответствует (или больше, чем) 128 бит.
require_ssl_reuse=NO ssl_ciphers=HIGH |
Сделаем ещё раз перезапуск, для вступления изменений в силу:
sudo systemctl restart vsftpd |
Прекрасно! Вот вы и настроили FTP сервер на вашем Ubuntu VPS для работы с протоколом SSL/TLS.
Шаг 6 – Проверка подключения, используя FileZilla
Сегодня FTP клиенты поддерживают настройку шифрования TLS, поэтому это прекрасная возможность проверить, работает ли наш Ubuntu FTP сервер как следует. Чтобы проверить соединение, будем использовать FileZilla FTP клиент. Для начала запустите FileZilla, нажатием на иконку Site Manager.
Нажмите на кнопку New Site в появившемся окне начните заполнять данные о Ubuntu FTP сервере.
Заполните необходимые поля информацией о недавно созданном Ubuntu FTP сервере. Так как мы настроили его с использованием TLS, мы может отметить настройку шифрования в “explicit FTP over TLS” положение. Окончательное окно настроек выглядит так:
Как только настроите, нажимайте Connect и появится окошко с запросом для введения пароля пользователя FTP.
В заключение вам нужно будет подтвердить SSL сертификат на вашем FTP сервере на Ubuntu VPS.
После подтверждения, корневой root-каталог с тестовым файлом появятся на вашем экране.
Это всё! Теперь вы можете производить любую передачу файлов с вашего компьютера на Ubuntu FTP сервер и обратно.
Заключение
В этом руководстве мы прошли шаг за шагом путь создания для локального пользователя безопасного способа передачи файлов через FTP с SSL/TLS на Ubuntu FTP сервере. Также мы протестировали соединения, используя FileZilla, чтобы убедиться, что всё работает.