В этой статье я покажу как создать FTPS сервер на Linux (Debian 11) с отдельными каталогами для разных пользователей.
Реализуемая схема
В этой статье я покажу процесс подготовки FTPS сервера на Linux, при этом каждый пользователь будет видеть только свой каталог.
Установка и настройка FTP сервера
Я буду использовать Very Secure FTP Daemon (vsftpd), устанавливаем пакет:
# apt install vsftpd
После установки, у вас появится новая служба — vsftpd.service:
# systemctl status vsftpd.service ● vsftpd.service - vsftpd FTP server Loaded: loaded (/lib/systemd/system/vsftpd.service; enabled; vendor preset: enabled) Active: active (running) since Fri 2022-12-09 13:14:31 MSK; 26s ago Process: 1135 ExecStartPre=/bin/mkdir -p /var/run/vsftpd/empty (code=exited, status=0/SUCCESS) Main PID: 1136 (vsftpd) Tasks: 1 (limit: 4915) Memory: 1.0M CGroup: /system.slice/vsftpd.service └─1136 /usr/sbin/vsftpd /etc/vsftpd.conf
Перед настройками сервера, сделаем резервную копию конфига:
# cp /etc/vsftpd.conf /etc/vsftpd.conf.orig
Отредактируем конфиг:
# nano /etc/vsftpd.conf anonymous_enable=NO # запрещаем вход анонимных пользователей local_enable=YES # разрешаем вход по ftp для локальных пользователей write_enable=YES # разрешаем писать на ftp (загружать или удалять файлы) local_umask=077 # маска для вновь создаваемых файлов xferlog_enable=YES # записывать в лог файл все транзакции по передаче файлов xferlog_std_format=YES # использовать стандартный формат лога xferlog_file=/var/log/vsftpd.log # файл лога connect_from_port_20=YES # исходящие с сервера FTP-соединения по 20 порту вместо случайного listen=YES # ожидать входящие соединения listen_ipv6=NO # для ipv6 не ожидать входящие соединения pam_service_name=vsftpd # использовать PAM библиотеки userlist_enable=YES # разрешим вход только для перечисленных пользователей userlist_file=/etc/vsftpd.userlist # перечислим пользователей в этом файле userlist_deny=NO # пользователи, которые есть в списке не будут отбрасываться chroot_local_user=YES # пользователи ограничены только своей домашней папкой
Различные опции хорошо описаны здесь, на русском языке.
После настройки перезапустим службу:
# systemctl restart vsftpd.service
По желанию, проверим слушает ли наш ftp сервер входящие соединения:
# ss -ltupn | grep vsftpd tcp LISTEN 0 32 0.0.0.0:21 0.0.0.0:* users:(("vsftpd",pid=1273,fd=3))
Создание FTP-пользователей
Создадим первого и второго пользователя и запишем их в userlist. Все остальные, локальные пользователи, не смогут подключаться по протоколу FTP:
# adduser ftp_user1 # adduser ftp_user2 # nano /etc/vsftpd.userlist ftp_user1 ftp_user2
Включение TLS
Сейчас уже можно подключиться к нашему FTP-серверу, но логины и пароли, при этом, будут передаваться открытым текстом. Чтобы этого избежать включим поддержку TLS, превратив FTP-сервер в FTPS-сервер.
Создадим самоподписанный ssl сертификат на 10 лет:
# openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /etc/ssl/private/vsftpd.pem -out /etc/ssl/private/vsftpd.pem
И добавим опции в конфиг:
# nano /etc/vsftpd.conf ssl_enable=YES # включим ssl rsa_cert_file=/etc/ssl/private/vsftpd.pem # путь к файлу ключа rsa_private_key_file=/etc/ssl/private/vsftpd.pem # путь к файлу сертификата allow_anon_ssl=NO # запретим анонимные подключения по ssl force_local_data_ssl=YES # разрешим передачу данных только по ssl force_local_logins_ssl=YES # разрешим подключаться только по ssl ssl_tlsv1=YES # разрешим алгоритм tlsv1 ssl_sslv2=NO # запретим устаревший sslv2 ssl_sslv3=NO # запретим устаревший sslv3
Затем перезапустим службу:
# systemctl restart vsftpd.service
Подключение к серверу (FTP-клиенты)
Для подключения можно использовать FileZilla, WinSCP, или обычный Windows Проводник.
Я покажу как подключиться к FTP серверу с помощью приложения FileZilla. После запуска приложения вы увидите такое окно:
Слева будет локальная файловая система, а справа удалённая. Вы можете совершить быстрое подключение, указав: хост, имя пользователя, пароль и порт. Или можете сохранить подключение, чтобы использовать его в последующем несколько раз. Для того, чтобы сохранить подключение, откройте менеджер сайтов, выбрав в меню «Файл / Менеджер сайтов«. Каждый сайт — это сохранённое подключение. Создавая новый сайт вы можете указать ip-адрес, порт, логин и пароль и другое:
Дальше, используя созданные сайты, вы сможете подключаться к различным FTP серверам.
Формат логов
Далее я подключился с помощью FileZilla к своему FTP серверу. И выполнил некоторые действия:
- Скачал текстовый файл.
- Загрузил бинарный файл.
- Загрузил текстовый файл.
В журнале (/var/log/vsftpd.log) появились следующие записи:
Mon Dec 12 15:06:29 2022 1 192.168.0.5 6 /user2/test.txt a _ o r ftp_user2 ftp 0 * c Mon Dec 12 15:25:39 2022 1 192.168.0.5 7254 /user2/report.json b _ i r ftp_user2 ftp 0 * c Mon Dec 12 15:27:53 2022 1 192.168.0.5 6 /user2/test.txt a _ i r ftp_user2 ftp 0 * c
Здесь видна следующая информация:
- дата и время транзакции, а также ip-адрес клиента (
Mon Dec 12 15:06:29 2022 1 192.168.0.5
); - размер файла в байтах и сам файл (
7254 /user2/report.json
); - режим передачи: (a — ASCII, b — двоичный), символ (_) — означает, что не было произведено никаких специальных операций, и направление передачи (o — файл скачали, i — файл загрузили) — (
a _ o
) или (b _ i
); - символ (r) — означает что пользователь был зарегистрирован в системе, дальше идёт имя пользователя (
r ftp_user2
).
Логирование желательно включать, чтобы в случае чего знать, кто и что делал с файлами по FTP.
Итог
Из статьи вы узнали как подготовить FTPS сервер на Linux. Я все действия выполнял на системе Debian 11, но на Ubuntu 22.04 всё делается аналогично. Показал как защитить сервер с помощью TLS протокола, как использовать userlist, для создания списка разрешённых пользователей.