FTP (File Transfer Protocol) сетевой протокол до сих использующийся для передачи данных для работы с устаревшими приложениями и при других специфических задачах а также при разработке сайтов. В общем сегодня на повестке настройка ftp сервера vsftpd в операционной системе Debian.
- Базовая настройка сервера Debian для ftp
- Установка и базовая настройка брандмауэра UFW
- Установка vsftpd в Debian
- Подготовка каталога пользователей для загрузки файлов по ftp
- Vsftpd. Настройка доступа по ftp
- Проверка доступа ftp для пользователей vsftpd в Debian
- Защита транзакций. Настройка шифрования ftp
- Тестирование FTP сервера с помощью клиента Filezilla
- Отключаем пользователю доступ к командной оболочке shell
- Добавление нового пользователя ftp на vsftpd сервер
- Как удалить пользователя ftp
- Резюме
Создадим пользователя чтобы он могут загружать файлы в свою папку. Подробнее про vsftpd (Very Secure FTP Daemon) можно прочитать в википедии поэтому не будем отвлекаться.
Базовая настройка сервера Debian для ftp
После покупки сервера нужно обязательно установить фаерволл (firewall) чтобы его не взломали. Для этого подключаемся по ssh из консоли или с помощью putty. Команда:
1 | $ ssh root@ваш_сервер_ip |
Пользователь root является самым привилегированным пользователем системы. Поэтому для регулярной работы лучше создать отдельную учетную запись и добавить её в группу sudo . Я буду использовать имя user вы можете задать любое какое хотите. Для этого выполните команду:
1 | # adduser user |
Будут заданы вопросы для ответов на которые можно просто нажать Enter главное задать надежный пароль. Более подробно про работу с пользователями в linux читайте в этой статье.
Предоставим пользователю user привилегии администратора. Команда:
1 | # usermod -aG sudo user |
теперь пользователь user может выполнять команды от имени root используя команду sudo .
Установка и базовая настройка брандмауэра UFW
Для того чтобы разрешить подключение только к определенным портам и службам нужно установить firewall или брандмауэр. Эти названия идентичны. Я буду использовать ufw так как он прост в настройке и надежен. Подробнее про него читайте в вики.
1 2 | # apt update # apt install ufw |
В ufw используются профили. Полный список их можно посмотреть командой:
1 | # ufw app list |
Нам нужно разрешить ssh соединение. Для этого укажем команду:
1 | # ufw allow openssh |
Теперь включаем ufw командой:
1 | # ufw enable |
Если будет выдан запрос укажите y (yes) и подтвердите нажав Enter.
1 2 3 | Вывод: Command may disrupt existing ssh connections. Proceed with operation (y|n)? y Firewall is active and enabled on system startup |
Наш фаерволл запущен и будет включатся при запуске системы. Можно подключиться к серверу с обычной учетной записью user и работать с помощью sudo .
Проверить статус брандмауэра можно командой :
1 | # ufw status |
1 2 3 4 5 6 7 | Вывод: Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) |
Наш firewall сейчас настроен для доступа только по протоколу ssh. Открыть возможность работы по протоколу ftp можно указав новые правила.
Сделаем доступными порты 20 и 21. После включения TLS потребуется порт 990. Также откроем диапазон портов для работы в пассивном режиме ftp 40000-50000.
Для этого даем команды:
1 2 3 4 | $ sudo ufw allow 20/tcp $ sudo ufw allow 21/tcp $ sudo ufw allow 990/tcp $ sudo ufw allow 40000:50000/tcp |
Убедимся что все сделали правильно командой:
1 | $ sudo ufw status |
Настройки должны отобразится таким образом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | Вывод: Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere 20/tcp ALLOW Anywhere 21/tcp ALLOW Anywhere 990/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 в Debian
Теперь когда подготовительные работы завершены можно установить ftp сервер vsftpd. Для этого обновим систему и дадим команду для инсталляции:
1 2 | $ sudo apt update $ sudo apt install vsftpd |
После завершения установки желательно сделать копию исходного файла конфигурации, чтобы в случае неудачной настройки можно было легко откатиться к оригинальному варианту. Команда:
1 | $ sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.orig |
Переходим к настройке.
Подготовка каталога пользователей для загрузки файлов по ftp
Это пример создания на новом сервере но такая конфигурация будет работать если у вас уже есть действующие пользователи и им нужно сохранить доступ к ftp серверу. Но я создам нового пользователя. Команда:
1 | $ sudo adduser chuzhoy007 |
После запроса создайте надежный пароль. Не забывайте, что при введении пароля не будут выводиться символы. На остальные вопросы можно просто нажать Enter.
Для безопасной работы с ftp необходимо, чтобы функционирование пользователей ограничивалась одним определенным каталогом. Vsftpd решает это с помощью механизма chroot jails.
После включения этого параметра, локальные пользователи по умолчанию будут ограничены своим домашним каталогом. При этом сервер vsftpd не разрешает запись в эту директорию.
Такое поведение верно для нового пользователя созданного для подключения только для работы по ftp протоколу но для существующих возможно есть необходимость для записи в домашнюю папку. Поэтому у них останется возможность записи в свой каталог.
В этом руководстве я создам каталог ftp для пользователя chuzhoy007 для ограничения в chroot и каталог для записи и хранения файлов files .
Итак создаем папку:
1 | $ sudo mkdir /home/chuzhoy007/ftp |
Установим владельца для папки:
1 | $ sudo chown nobody:nogroup /home/chuzhoy007/ftp |
Запретим запись в этот каталог:
1 | $ sudo chmod a-w /home/chuzhoy007/ftp |
Проверим разрешения:
1 | $ sudo ls -la /home/chuzhoy007/ftp |
1 2 3 4 | Вывод: итого 8 drwxr-xr-x 2 root root 4096 мая 20 07:19 . drwxr-xr-x 3 chuzhoy007 chuzhoy007 4096 мая 20 07:19 .. |
Теперь создадим каталог для загрузки файлов:
1 | $ sudo mkdir /home/chuzhoy007/ftp/files |
Назначим владельцем каталога пользователя chuzhoy007 командой:
1 | $ sudo chown chuzhoy007:chuzhoy007 /home/chuzhoy007/ftp/files |
Проверим разрешения для каталога ftp:
1 | $ sudo ls -la /home/chuzhoy007/ftp |
1 2 3 4 5 | Вывод: итого 12 drwxr-xr-x 3 root root 4096 мая 20 07:22 . drwxr-xr-x 3 chuzhoy007 chuzhoy007 4096 мая 20 07:19 .. drwxr-xr-x 2 chuzhoy007 chuzhoy007 4096 мая 20 07:22 files |
Vsftpd. Настройка доступа по ftp
Настроим доступ одному пользователю с возможностью подключаться по ftp протоколу имеющему учетную запись с оболочкой shell. Все необходимые настройки находятся в файле vsftpd.conf . Откроем его для редактирования:
1 | $ sudo nano /etc/vsftpd.conf |
Проверьте параметры они должны соответствовать приведенным в списке:
1 2 3 4 5 6 7 | . . . # Allow anonymous FTP? (Disabled by default). anonymous_enable=NO # # Uncomment this to allow local users to log in. local_enable=YES . . . |
Чтобы пользователь мог загружать файлы параметр write_enable не должен быть закомментирован (перед опцией не должно быть знака #) а его значение должно быть YES.
1 | write_enable=YES |
Чтобы пользователь подключившийся по ftp не мог получить доступ к другим папкам кроме своей раскомментируем chroot .
1 | chroot_local_user=YES |
Теперь в любое место файла (удобнее всего это сделать в самом конце) добавьте директиву user_sub_token это позволит вставлять имя пользователя в путь local_root directory .
1 2 | user_sub_token=$USER local_root=/home/$USER/ftp |
Ограничим диапазон портов для пассивного подключения по ftp:
1 2 | pasv_min_port=40000 pasv_max_port=50000 |
Именно эти порты открывали ранее в брандмауэре. Если вы указывали другие то укажите их.
Добавим директиву чтобы пользователи могли подключаться только если добавлены в список разрешенных для доступа.
1 2 3 | userlist_enable=YES userlist_file=/etc/vsftpd.userlist userlist_deny=NO |
userlist_deny изменяет логику: при установленном значении YES, пользователям из списка доступ по FTP запрещен. Если значение равно NO, доступ открыт только для пользователей из списка.
Теперь сохраните внесенные изменения и закройте файл (в редакторе nano это делается командами ctrl+o – сохранить, ctrl+x – выход, для вставки удобно использовать сочетание shift+insert).
Создадим список и добавим в него нашего пользователя:
1 | echo "chuzhoy007" | sudo tee -a /etc/vsftpd.userlist |
Проверьте добавление пользователя командой:
1 | cat /etc/vsftpd.userlist |
1 2 | Вывод: chuzhoy007 |
Обновим настройки перезапустив демон командой:
1 | $ sudo systemctl restart vsftpd |
Проверка доступа ftp для пользователей vsftpd в Debian
У нас сервер настроен для подключения по ftp протоколу только для пользователя chuzhoy007. Всем остальным должно быть отказано. Чтобы в этом убедиться попробуйте создать соединение используя имя anonymous .
1 | ftp -p ip_вашего_сервера |
*Если программы ftp нет то установите её командой:
1 | $ sudo apt install ftp |
Ответ должен быть примерно такой:
1 2 3 4 5 6 7 | Вывод: Connected to 192.168.1.98. 220 (vsFTPd 3.0.3) Name (192.168.1.98:user): anonymous 530 Permission denied. Login failed. ftp> |
Так как анонимный доступ мы запретили то установить соединение не получилось.
Для выхода укажите:
1 | ftp>bye |
Любой пользователь кроме chuzhoy007 не сможет подключится и это правильно. Теперь попробуйте подключиться указав данные нашего пользователя.
1 2 3 4 5 6 7 8 9 10 | Вывод: Connected to 192.168.1.98. 220 (vsFTPd 3.0.3) Name (192.168.1.98:user): chuzhoy007 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> |
Как видим соединение успешно выполнено можно закрыть его. В целом сервреом уже можно пользоваться но лучше сначала настроить защиту.
Защита транзакций. Настройка шифрования ftp
Передаваемые по протоколу данные отправляются в открытом виде то есть без шифрования. Включая учетные данные пользователя, что небезопасно. Поэтому нужно настроить tls/ssl шифрование.
Для этого будем использовать программу openssl и создадим сертификат для vsftpd с ключом -days , чтобы ограничить его действие одним годом (если хотите задать другой период то укажите его в днях).
Добавим частный ключ RSA- длиной 2048-бит. Для расположения закрытого и открытого ключа в одном файле флагам -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 |
Откроется окно с предложением записать информацию о нахождении. Можно вписать любую но для значения “Common Name (e.g. server FQDN or YOUR name) []:” укажите ip вашего сервера.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | Вывод: ..+++++ ....................................................................+++++ 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]:RU State or Province Name (full name) [Some-State]:Moscow Locality Name (eg, city) []:Moscow Organization Name (eg, company) [Internet Widgits Pty Ltd]:Deb Organizational Unit Name (eg, section) []: Common Name (e.g. server FQDN or YOUR name) []: ip_вашего_сервера Email Address []: |
После создания сертификатов нужно снова открыть файл vsftpd.conf для редактирования:
1 | $ sudo nano /etc/vsftpd.conf |
Найдите строки начинающиеся с RSA_ и закомментируйте их (поставьте знак # в начале строки).
Выглядеть должно так:
1 2 | # rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem # rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key |
Ниже добавьте путь до наших созданных сертификатов:
1 2 | rsa_cert_file=/etc/ssl/private/vsftpd.pem rsa_private_key_file=/etc/ssl/private/vsftpd.pem |
Теперь нужно включить принудительное использование SSL, чтобы клиенты не способные работать по защищенному каналу использующему TLS не могли подключиться. Так мы зашифруем весь трафик.
Для директивы ssl_enable укажите значение YES :
1 | ssl_enable=YES |
Теперь запретим анонимные подключения через ssl для передачи данных и для подключения. Добавьте эти значения:
1 2 3 | allow_anon_ssl=NO force_local_data_ssl=YES force_local_logins_ssl=YES |
Добавим поддержку TLS (альтернативы ssl):
1 2 3 | ssl_tlsv1=YES ssl_sslv2=NO ssl_sslv3=NO |
Добавим еще два значения. Первое отключает требование повторного использования ssl, чтобы не нарушить работу ftp-клиентов. Второе будет указывать, что необходимо использовать шифрование с длиной ключа от 128 бит и выше:
1 2 | require_ssl_reuse=NO ssl_ciphers=HIGH |
В конечном итоге файл vsftpd.conf должен выглядеть так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | # 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 |
Проверяем все значения, сохраняем и закрываем файл. Перезагружаем сервер для применения внесенных изменений командой:
1 | $ sudo systemctl restart vsftpd |
Теперь подключиться с помощью клиента без поддержки шифрования будет невозможно. Проверить это можно используя уже известную команду:
1 | ftp -p ip_вашего_сервера |
вывод будет примерно таким:
1 2 3 4 5 6 7 | Connected to 192.168.1.98. 220 (vsFTPd 3.0.3) Name (192.168.1.98:user): chuzhoy007 530 Non-anonymous sessions must use encryption. Login failed. 421 Service not available, remote server has closed connection ftp> |
Как видим попытка не удалась. Можно выйти.
Тестирование FTP сервера с помощью клиента Filezilla
Настройка vsftpd в Debian закончена. Теперь пора проверить работоспособность. В качестве клиента для работы я использую программу FileZilla, подробнее про неё читайте в этой статье а здесь рассмотрим быстрое подключение. Сначала установите программу:
1 2 | $ sudo apt update $ sudo apt install filezilla |
Итак запускаем программу. В поле «Хост» укажите ip адрес вашего сервера. В поле «Имя пользователя» задайте логин вашего пользователя, в моем примере это chuzhoy007 и в поле «Пароль» введите пароль этого пользователя. Затем нажмите кнопку «Быстрое соединение».
При выводе сообщения о сохранении пароли выберите нужный вам вариант.
Когда будет отображен сертификат с запросом на принятие. Чтобы каждый раз не подтверждать можно поставить флаг «Всегда принимать в будущих сессиях» и нажмите кнопку «Ок».
После подключения будет доступна папка file. Можно закачивать в неё файлы и наоборот передавать на локальный компьютер.
Отключаем пользователю доступ к командной оболочке shell
Этот пункт необязателен. Если по каким-то причинам вы не хотите шифровать ftp трафик или хотите использовать клиент не поддерживающий tls соединение то нужно отключить возможность использовать командную оболочку shell ftp пользователю.
Это повысит безопасность сервера за счет ограничения уязвимой учетной записи. Для этого откройте файл ftponly который находится в каталоге bin :
1 | $ sudo nano /bin/ftponly |
Добавьте сообщение для пользователя по какой причине он не может зайти в систему:
1 2 | #!/bin/sh echo "This account is limited to FTP access only." |
Сохраните изменения и закройте файл.
Сделайте его исполняемым:
1 | $ sudo chmod a+x /bin/ftponly |
Откройте документ со списком оболочек доступных в системе:
1 | $ sudo nano /etc/shells |
В конце списка добавьте запись:
1 | /bin/ftponly |
Обновите оболочку для пользователя с помощью команды:
1 | $ sudo usermod chuzhoy007 -s /bin/ftponly |
Для проверки попробуйте авторизоваться на сервере как chuzhoy007:
1 | $ ssh chuzhoy007@IP_вашего_сервера |
вы должны получить сообщение:
1 2 | This account is limited to FTP access only. Connection to 192.168.1.98 closed. |
То есть выведено сообщение о том, что для данного пользователя доступно только ftp подключение и соединение сброшено. Все работает так как нужно.
Добавление нового пользователя ftp на vsftpd сервер
Итак сервер настроен и трафик зашифрован. Но у нас пока есть только один пользователь. Наверняка понадобится добавлять дополнительные учетные записи.
Приведу краткую инструкцию — vsftpd настройка пользователей, из пяти действий, для быстрого добавления новых аккаунтов.
Чтобы работали vsftpd пользователи первым делом создаем его. Для примера это будет vasiliy , вы укажите то имя которое нужно.
Первое. создаем пользователя:
1 | $ sudo adduser vasiliy |
Второе. Работа с папкой пользователя:
1 2 3 | $ sudo mkdir /home/vasiliy/ftp $ sudo chown nobody:nogroup /home/vasiliy/ftp $ sudo chmod a-w /home/vasiliy/ftp |
Третье. Папка для файлов:
1 2 | $ sudo mkdir /home/vasiliy/ftp/files $ sudo chown vasiliy:vasiliy /home/vasiliy/ftp/files |
Четвертое. Добавим нового пользователя в список разрешенных для подключения. Открываем список:
1 | $ sudo nano /etc/vsftpd.userlist |
Вписываем имя новой учетной записи под существующей.
Пятое. Перезапустить демон командой:
1 | $ sudo systemctl restart vsftpd |
Можно дополнительно отключить возможно подключения к серверу как обычный пользователь:
1 | $ sudo usermod vasiliy -s /bin/ftponly |
Проверяем и пользуемся.
Как удалить пользователя ftp
Для работы с фтп сервером необходимо не только создавать новых пользователей но и удалять ставшие не актуальными учетные записи. Более подробно о работе пользователями читайте в статье как создать пользователя в Linux. А сейчас кратко рассмотрим данную операцию.
Чтобы удалить пользователя ftp, без удаления пользовательских файлов и каталогов выполните команду:
1 | $ sudo deluser имя_пользователя |
Например чтобы удалить учетную запись vasiliy команда будет такой:
1 | $ sudo deluser vasiliy |
Для того, чтобы удалить и пользователя и все его данные используйте флаг —remove-home username. Пример команды:
1 | $ sudo deluser --remove-home имя_пользователя |
Учтите, что после этой команды все файлы созданные или загруженные этим пользователем будут потеряны! Так, что будьте внимательны!
Резюме
В этой инструкции я рассказал как создать и настроить ftp сервер vsftpd на Debian с локальной учетной записью и ограничить пользователя домашним каталогом. Такой метод хорошо подойдет для личного использования если хотите создать безопасное и надежное удаленное хранилище.
Программа vsftpd является хорошим выбором. Расшифровывается как — Very Secure FTP Daemon, то есть очень защищенный ftp демон. Является ftp — сервером по умолчанию для многих дистрибутивов.
На официальном сайте вы найдете много дополнительной информации и документации. Если вам нужно больше.
С помощью фтп можно удобно управлять файлами (загружать видео, фото, аудиозаписи, текстовые файлы и т.д.), создавать и хранить резервные копии своих проектов, сайтов, образы систем и т.п.. Хотя чаще используется для подключения к хостингу и управления файлами сайтов. Для покупки сервера рекомендую воспользоваться услугами FirstVds качественные vps по доступным ценам. При переходе по этой ссылке скидка 25%.
Зачем создавать пользователя если в системе и так есть пользователь? Я не про рута, а про того кого мы указываем при установки системы. Объясните пожалуйста, может я от жизни отстал. Спасибо!
Если совсем кратко то для разграничения полномочий и как следствие для удобства и безопасности. Так же как рут и другие пользователи. Каждый для своих задач.