С чего такой интерес к ProFTPD
? Дело в том, что раз я пока на удаленке, то мне дают не просто задачи от пользователей, а либо проработать бесшовную работу различных сервисов, как организовать бекап и восстановление + уведомления, но и разобраться с порталами компании. И вот один из порталов и проработал как уйти со связки CentOS 7 Docker (Traefik + Portainer + Site)
в пользу того, в чем я профи — это Ubuntu 18.04 Server
. Я сделал это, я выложу на блог данную заметку может кто подчерпнет нюансы с которыми столкнулся. От предыдущего системного Администратора Кочеткова Александра я получал лишь одно «я не помню, давно было, надо смотреть». Но я не такой, я разберусь и разобрался. После от моего руководителя последовала задача развернуть сервис FTP
на доступ к порталу с возможностью записи и быть ограниченным лишь каталогом сайта, по-сути как было в Docker
. И вот родилась данная заметка.
Большая часть шагов и действия опирается на ранее разобранные заметки:
Схема которую я хочу реализовать
FTP
-
- (
nginx:sites-enabled
)
- (
-
-
- доступ к этому сайту должны иметь виртуальные
FTP
пользователи со своими логинами и паролями - доступ ограничен только каталогом сайта
- доступ к каталогу сайта с правами чтения и записи
- доступ к этому сайту должны иметь виртуальные
-
Шаг №1:
Подготавливаю систему Ubuntu 18.04 Server
к последующему использованию в рамках текущей заметки:
ekzorchik@srv-bionic:~$ hg clone --insecure https://ekzorchik@172.35.35.8/hg/dproject ekzorchik@srv-bionic:~$ sudo ./dproject/default
Шаг №2:
Устанавливаю Web
—сервис nginx:
ekzorchik@srv-bionic:~$ sudo apt-get install -y nginx
Шаг №3:
Устанавливаю приложение Proftpd on Ubuntu 18.04 Server
ekzorchik@srv-bionic:~$ apt-cache show proftpd-basic | grep Version Version: 1.3.5e-1build1 ekzorchik@srv-bionic:~$ sudo apt-get install -y proftpd-basic
Шаг №4:
Создаю свой конфигурационный файл на основе дефолтных настроек с учетом моих требований.
ekzorchik@srv-bionic:~$ sudo rm /etc/proftpd/proftpd.conf ekzorchik@srv-bionic:~$ sudo nano /etc/proftpd/proftpd.conf Include /etc/proftpd/modules.conf # Отключаем использование протокола IPv6 UseIPv6 off IdentLookups off # Имя FTP-сервера ServerName "srv-bionic" # Режим запуска FTP-сервера ServerType standalone DeferWelcome off MultilineRFC2228 on DefaultServer on ShowSymlinks on # Таймаут на передачу: вошел и не начал передачу выраженное в мили секундах TimeoutNoTransfer 600 # Подвисание во время передачи файлов выраженное в мили секундах TimeoutStalled 600 # Таймаут бездействия после входа выраженное в мили секундах TimeoutIdle 1200 DisplayLogin welcome.msg DisplayChdir .message true ListOptions "-l" # Запретить закачивать файлы, начинающиеся на точку DenyFilter \*.*/ DefaultRoot ~ AuthUserFile /etc/proftpd/ftpd.passwd Port 21 # запрещаем подключаться от имени суперпользователя RootLogin off PassivePorts 49152 65534 <IfModule mod_dynmasq.c> </IfModule> # Максимальное количество дочерних процессов MaxInstances 30 # Пользователь и группа, под которой работает демон User proftpd Group nogroup # маска для ограничения создания директорий и файлов Umask 022 022 # Разрешить перезаписывать существующие файлы AllowOverwrite on DebugLevel 10 TransferLog /var/log/proftpd/xfer.log SystemLog /var/log/proftpd/proftpd.log ExtendedLog /var/log/proftpd/auth.log AUTH auth SetEnv TZ :/etc/localtime <IfModule mod_quotatab.c> QuotaEngine off </IfModule> <IfModule mod_ratio.c> Ratios off </IfModule> <IfModule mod_delay.c> DelayEngine on </IfModule> <IfModule mod_ctrls.c> ControlsEngine off ControlsMaxClients 2 ControlsLog /var/log/proftpd/controls.log ControlsInterval 5 ControlsSocket /var/run/proftpd/proftpd.sock </IfModule> <IfModule mod_ctrls_admin.c> AdminControlsEngine off </IfModule> Include /etc/proftpd/tls.conf Include /etc/proftpd/conf.d/
Шаг №5:
Создаю файл в котором будут указаны виртуальные учетные записи ftp
и их пароли в зашифрованном виде:
ekzorchik@srv-bionic:~$ sudo touch /etc/proftpd/ftpd.passwd ekzorchik@srv-bionic:~$ sudo chmod 440 /etc/proftpd/ftpd.passwd ekzorchik@srv-bionic:~$ sudo chown proftpd.root /etc/proftpd/ftpd.passwd
Шаг №6:
Чтобы нельзя было подключаться к данному FTP
сервису под указанными пользователями перечисляем их:
ekzorchik@srv-bionic:~$ sudo bash -c "cat /etc/ftpusers | head -n 5" # /etc/ftpusers: list of users disallowed FTP access. See ftpusers(5). root daemon bin
Шаг №7:
Перезапускаю ProFTPD
сервис:
ekzorchik@srv-bionic:~$ sudo systemctl restart proftpd && sudo systemctl status proftpd && sudo netstat -tulpn | grep proftpd ● proftpd.service - LSB: Starts ProFTPD daemon Loaded: loaded (/etc/init.d/proftpd; generated) Active: active (running) since Wed 2020-04-08 12:48:51 MSK; 12ms ago Docs: man:systemd-sysv-generator(8) Process: 3699 ExecStop=/etc/init.d/proftpd stop (code=exited, status=0/SUCCESS) Process: 3754 ExecStart=/etc/init.d/proftpd start (code=exited, status=0/SUCCESS) Tasks: 1 (limit: 2336) CGroup: /system.slice/proftpd.service └─3763 proftpd: (accepting connections) Apr 08 12:48:51 srv-bionic systemd[1]: Starting LSB: Starts ProFTPD daemon... Apr 08 12:48:51 srv-bionic proftpd[3754]: * Starting ftp server proftpd Apr 08 12:48:51 srv-bionic proftpd[3754]: ...done. Apr 08 12:48:51 srv-bionic systemd[1]: Started LSB: Starts ProFTPD daemon. tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 3763/proftpd: (acce ekzorchik@srv-bionic:~$
Шаг №8:
Добавляю в файле где перечислены оболочки консоли которые можно назначать пользователям, что есть еще пустая (/bin/false
), т.е. без доступа к интерпретатору команд:
ekzorchik@srv-bionic:~$ sudo nano /etc/shells # /etc/shells: valid login shells /bin/sh /bin/bash /bin/rbash /bin/dash /usr/bin/tmux /bin/false
Шаг №9:
Получаю идентификатор учетной записи Web
—сервиса:
ekzorchik@srv-bionic:~$ id www-data uid=33(www-data) gid=33(www-data) groups=33(www-data)
Шаг №10:
Определяю, какой ID
пользователя самый последний в системе:
ekzorchik@srv-bionic:~$ cat /etc/passwd | tail -n1 | awk -F ":" '{print $3}' 108
значит виртуальных пользователей могу создавать начиная с этого ID
, либо выделить для этих целей, к примеру с 5000'сячного.
Шаг №11:
Создаю двух виртуальных пользователей:
ekzorchik@srv-bionic:~$ sudo ftpasswd --passwd --file=/etc/proftpd/ftpd.passwd --name=ftp1 --shell=/bin/false --home=/var/www/html --uid=5000 --gid=33 ftpasswd: using alternate file: /etc/proftpd/ftpd.passwd ftpasswd: creating passwd entry for user ftp1 Password: Aa1234567 Re-type password: Aa1234567 ftpasswd: entry created ekzorchik@srv-bionic:~$
и по аналогии для еще одного виртуального пользователя ftp2:
ekzorchik@srv-bionic:~$ sudo ftpasswd --passwd --file=/etc/proftpd/ftpd.passwd --name=ftp2 --shell=/bin/false --home=/var/www/html --uid=5001 --gid=33
Шаг №12:
Проверяю, каково содержимое файла /etc/proftpd/ftpd.passwd:
ekzorchik@srv-bionic:~$ cat /etc/proftpd/ftpd.passwd cat: /etc/proftpd/ftpd.passwd: Permission denied ekzorchik@srv-bionic:~$ sudo bash -c "cat /etc/proftpd/ftpd.passwd" ftp1:$1$QcbUEzvQ$xT6uWRS1hlOVC5U9PHV.W/:5000:33::/var/www/html:/bin/false ftp2:$1$Wlv2O3zH$w2Hs89GU8mp6ifWEvaKSJ.:5001:33::/var/www/html:/bin/false ekzorchik@srv-bionic:~$
Шаг №13:
Теперь с учетом задания которое я поставил себе оформляя ее как заметку нужно дать виртуальным пользователем доступ на запись в указанный домашним каталогом:
ekzorchik@srv-bionic:~$ sudo chown -R www-data:www-data /var/www/html/ ekzorchik@srv-bionic:~$ sudo chmod -R 770 /var/www/html/
Шаг №14:
Проверяю, что могу подключить к FTP
с другой машины и в качестве авторизации указываю один из созданных виртуальных логинов со своим паролем (Login: ftp1 Pass: Aa1234567
)
ekzorchik@navy:~$ ftp 172.33.33.21 21 Connected to 172.33.33.21. 220 ProFTPD 1.3.5e Server (srv-bionic) [172.33.33.21] Name (172.33.33.21:ekzorchik): ftp1 500 AUTH not understood 500 AUTH not understood SSL not available 331 Password required for ftp1 Password: 230 User ftp1 logged in Remote system type is UNIX. Using binary mode to transfer files. ftp> pwd 257 "/" is the current directory ftp> ls <= отобразить листинг домашнего каталога 200 PORT command successful 150 Opening ASCII mode data connection for file list -rwxrwx--- 1 33 www-data 612 Apr 8 09:37 index.nginx-debian.html 226 Transfer complete ftp> mkdir example <= создаю каталог 257 "/example" - Directory successfully created ftp> ls <= отобразить листинг домашнего каталога 200 PORT command successful 150 Opening ASCII mode data connection for file list drwxr-xr-x 2 ftp1 www-data 4096 Apr 8 10:05 example -rwxrwx--- 1 33 www-data 612 Apr 8 09:37 index.nginx-debian.html 226 Transfer complete ftp> rm example <= удаляю каталог 250 RMD command successful ftp> ls <= отобразить листинг домашнего каталога 200 PORT command successful 150 Opening ASCII mode data connection for file list -rwxrwx--- 1 33 www-data 612 Apr 8 09:37 index.nginx-debian.html 226 Transfer complete ftp> quit 221 Goodbye. ekzorchik@navy:~$
Шаг №15:
Если нужно через консоль передать с локальной системы на удаленную:
ftp> put out.txt
Шаг №16:
Если нужно через консоль с текущей передать на удаленную:
ftp> get out.txt out1.txt
т.е. на локальной системе с которой я инициализировал подключение через FTP
в каталоге откуда делал ftp IP-Address 21
будет файл out1.txt
ekzorchik@navy:~$ ls -l out1.txt
-rw-r--r-- 1 ekzorchik ekzorchik 286104 апр 8 13:32 out1.txt
итого доступ в назначенный /var/www/html/
каталог для виртуального пользователя сервиса ftp1
работает. Права на чтение, запись, выполнение есть, т.е. я могу обновлять файлы сайта.
Итого заметка работоспособна. В дальнейшем я покажу как настроить защиту данного сервиса
- от посягательств из вне к перебору пароля
- настройки безопасности подключения через сертификат «Доступ к ProFTPD только FTP через TLS«
- и т.д.
Если что не так будет, то заметка будет дописываться.
На этом у меня всё, с уважением автор блога Олло Александр aka ekzorchik.