среда, 27 апреля 2016 г.

FTP-сервер (ProFTPd) Ubuntu14.04.2


FTP-сервер (ProFTPd) на Ubuntu 12.04 LTS 

часть 1 проверена на Ubuntu14.04.2

 
Задача: поднять FTP-сервер (возможно, с шифрованием) в локальной сети, а именно установить и настроить ProFTPd на Ubuntu 12.04 LTS
Источники:
1. http://vdsadmin.ru/ftp-proftp-ftpasswd
2. http://www.proftpd.org/docs/
3. http://www.proftpd.org/docs/directives/linked/config_ref_Limit.html
4. http://www.debianadmin.com/list-of-ftp-clients-available-in-linux.htm
5. https://forums.proftpd.org/smf/index.php?topic=1198.0
6. http://www.masterit.ru/5-besplatnyx-sftp-menedzherov-dlya-windows/
7. http://www.coreftp.com/download.html
8. http://proftpd.org/docs/contrib/mod_tls.html
9. sysadmins.ru/topic347156.html
10. http://www.castaglia.org/proftpd/modules/mod_sftp.html

Выполнение:
Часть 1. Ставим простой FTP-сервер на Ubuntu 12.04 LTS
1. Устанавливаем ProFTPd:
sudo apt-get install proftpd-basic
В процессе установки выбираем ответ standalone, т.е. самостоятельный запуск FTP-сервера, а не через суперсервер inetd.
2. Пусть каталоги будущих пользователей будут находится в /home/ftp . Создаем этот каталог:
sudo mkdir /home/ftp
Пусть у нас будут два пользователя: vasya и petr. Для каждого из них заведем отдельную папку в каталоге /home/ftp:
sudo mkdir /home/ftp/vasya
sudo mkdir /home/ftp/petr
3. Перед тем, как создавать пользователей нашего FTP-сервера, необходимо отметить следующее. Поскольку эти пользователи являются виртуальными по отношению к ОС, то возникает проблема обращения к каталогам и файлам FTP-сервера. Предположение о том, что доступ к файлам и каталогам будет осуществлять сам FTP-сервер с именем proftpd и группой nogroup, неверно. При обращении к кокому-либо файлу будет использоваться UID и GID конкретного пользователя FTP-сервера. Поэтому логично будет создавать пользователей с такими же UID, что и у какого-либо реального пользователя в системе, прописанного в /etc/passwd . Далее в качестве такого пользователя возмем сам proftpd . Чтобы узнать его UID, выполним команду:
cat /etc/passwd | grep proftpd
результат будет примерно таким
proftpd:x:110:65534::/var/run/proftpd:/bin/false
Следовательно, пользователей будем создавать с UID 110.
3.1  Создаем пользователей vasya и petr:
sudo ftpasswd --passwd --file=/etc/proftpd/ftpd.passwd --name=vasya --shell=/bin/false --home=/home/ftp/vasya --uid=110 --gid=65500
sudo ftpasswd --passwd --file=/etc/proftpd/ftpd.passwd --name=petr --shell=/bin/false --home=/home/ftp/petr --uid=110 --gid=65501
3.2 Сменим владельца и группу для всех созданных каталогов, чтобы пользователи FTP-сервера (с UID=110, как мы уже условились) смогли что-либо делать с ними:
sudo chown -R proftpd:nogroup /home/ftp
4. Правим конфигурационный файл /etc/proftpd/proftpd.conf :
Include /etc/proftpd/modules.conf
# Отключаем использование протокола IP v6
UseIPv6 off
# Имя FTP-сервера
ServerName "Ubunftp"
# Режим запуска FTP-сервера
ServerType standalone
DeferWelcome off
# Порт, который будет слушать FTP-сервер
Port 21
# выдавать многострочные сообщения в стандарте RFC 959 или RFC 2228
MultilineRFC2228 on
DefaultServer on
ShowSymlinks on
# Таймаут на передачу - вошел и не начал передачу (мс.)
TimeoutNoTransfer 600
# Подвисание во время передачи файлов (мс.)
TimeoutStalled 600
# Таймут бездействия после входа (мс.)
TimeoutIdle 1200
# Сообщение, которое будет показываться пользователю при входе
DisplayLogin                    welcome.msg
ListOptions                 "-l"
# Запретить закачивать файлы, начинающиеся на точку
DenyFilter \*.*/
# Максимальное количество дочерних процессов
MaxInstances 30
# Пользователь, под которым будет запускаться FTP-сервер
User proftpd
# Группа, с которой будет запускаться FTP-сервер
Group nogroup
# Маска (права доступа) для файлов (первое значение 022) и каталогов (второе значение 022), создаваемых в каталогах
Umask 022  022
# Разрешить перезаписывать существующие файлы
AllowOverwrite on
# Для каждого пользователя в качестве корневого каталога устанавливаем его домашнюю папку. В этом случае пользователь не сможет выйти выше, т.е. попасть в /home/ftp или /home/ftp/petr
DefaultRoot ~
# Настраиваем права доступа к пользовательским каталогам
# для каталога  /ftp/vasya:
<Directory /home/ftp/vasya>
# Пусть vasya не сможет редактировать содержимое каталога (закачивать файлы, создавать папки, ...)
<Limit WRITE>
DenyALL
</Limit>
# , но сможет читать файлы
<Limit READ>
AllowUser vasya
</Limit>
# и, как исключение из первого правила, удалять их
<Limit DELE>
AllowUser vasya
</Limit>
</Directory>
# для каталога  /ftp/petr:
<Directory /home/ftp/petr>
# Пусть petr имеет полный доступ к своей папке (закачивать файлы, скачивать файлы, создавать папки, удалять )
<Limit WRITE>
AllowUser petr
</Limit>
</Directory>
# Настраиваем логи
TransferLog /var/log/proftpd/xferlog
SystemLog   /var/log/proftpd/proftpd.log
# Отключаем проверку командного интерпретатора пользователя
RequireValidShell off
# указываем файл с учетными записями для авторизации пользователей
AuthUserFile        /etc/proftpd/ftpd.passwd
# Include other custom configuration files
Include /etc/proftpd/conf.d/
5. Перезапускаем ProFTPd:sudo service proftpd restart
sudo service proftpd restart
Должно все работать. Проверить работу FTP-сервера можно так:
 
ftp localhost

Дополнительно настраиваем права (иточник)
sudo chmod 440 /etc/proftpd/ftpd.passwd && sudo chown proftpd.root /etc/proftpd/ftpd.passwd
Еще одна возмодная проблема:

The workaround is to edit the service file, to add a retry.
/etc/init.d/proftpd
Find this line:
start-stop-daemon --stop --signal $SIGNAL --quiet --pidfile "$PIDFILE"
Change to this:
start-stop-daemon --stop --signal $SIGNAL --retry 1 --quiet --pidfile "$PIDFILE"
This change solved it for me.


 Часть 2. FTP-сервер с SSL/TLS-шифрованием на Ubuntu 12.04 LTS
 
6. Сейчас можно прикрутить к нашему серверу SSL/TLS-шифрование. Сначала сгенерируем сертификат и ключ:
openssl req -new -x509 -days 365 -nodes -out /etc/proftpd/proftpd.cert.pem -keyout /etc/proftpd/proftpd.key.pem
 
7. Теперь отредактируем файл конфигурации /etc/proftpd/tls.conf, но сперва скопируем его, на свякий случай:
cp /etc/proftpd/tls.conf /etc/proftpd/tls.conf.old
  и добавляем в /etc/proftpd/tls.conf следующее: 
TLSEngine                  on
TLSLog                     /var/log/proftpd/tls.log
TLSProtocol                SSLv23
TLSOptions                 NoCertRequest
TLSRSACertificateFile      /etc/proftpd/proftpd.cert.pem
TLSRSACertificateKeyFile   /etc/proftpd/proftpd.key.pem
TLSVerifyClient            off
# если хотите всё таки разрешить обычное соединение, поставьте TLSRequired off
TLSRequired                on

8. В конец конфигурационного файла /etc/proftpd/proftpd.conf добавим строку
Include /etc/proftpd/tls.conf
9. Перезапускаем Proftpd:
sudo service proftpd restart 
Сейчас проверим, работает ли шифрование. Установим ftp-ssl :
sudo apt-get install ftp-ssl
и попробуем подключиться:
ftp-ssl localhost
 Если после ввода логина и пароля выходит приглашение ftp> , значит все работает.
На Windows мне не удалось подключиться к такому FTP ни через Total Commander (с плагинами), ни через FileZilla Client: в /var/log/proftpd/tls.log было видно, что соединение заканчивается с ошибкой
SSL/TLS required but absent on control channel, denying ... command
По видимому, эта ошибка возникала из-за того, что клиент начинал подключаться так, как подключается к обычному FTP, в то время, как требовалось установление SSL/TLS сессии.
 Подключиться смог только CoreFTP. Но для этого пришлось в /etc/proftpd/proftpd.conf добавить следующее: 
<IfModule mod_tls.c>
TLSOptions NoSessionReuseRequired
</IfModule>
Эта опция, как я понял, отменяем требование к клиенту работать в одной продолжиющейся сессии. Клиент может выполнять новую команду, создав новую SSL сессию. Это и делает CoreFTP. На рисунке ниже привожу настройки соединения CoreFTP.
 Часть 3. SFTP-сервер на базе ProFTPd и Ubuntu 12.04 
10. Теперь попробуем приктутить SFTP.
Закомментируем все строки в /etc/proftpd/proftpd.conf, относящиеся к использованию tls, а именно:
#<IfModule mod_tls.c>
#TLSOptions NoSessionReuseRequired
#</IfModule>
...
#Include /etc/proftpd/tls.conf
 Продолжаем реадктировать конфигурационный файл /etc/proftpd/proftpd.conf: добавляем следующее
#Если есть модуль SFTP, то применять следующие настройки 
<IfModule mod_sftp.c>
SFTPEngine            on
SFTPHostKey           /etc/ssh/ssh_host_dsa_key
SFTPHostKey           /etc/ssh/ssh_host_rsa_key
SFTPLog               /var/log/proftpd/sftp.log
SFTPCompression       delayed 
SFTPAuthMethods password # метод авторизации - пароль
</IfModule>
 # запрещаем подключаться всем (DenyALL) для того, чтобы пользователи из /etc/passwd не могли подключаться, и разрешаем пользователям vasya и petr  
<Limit LOGIN>
DenyALL
AllowUser vasya, petr
</Limit>
Проверим как работает:
sftp -P 21 petr@localhost
Если после ввода пароля выходит приглашение sftp> , значит работает. Для того, чтобы удостоверится в том, что сервер пускает только пользователей из файла /etc/proftpd/ftpd.passwd , выполним команду:
sftp -P 21 localhost
Даже если введем верный пароль текущего пользователя, все равно получим отказ
Permission denied, please try again.
При использовании SFTP с Windows-машины уже можно легко подключиться через FileZilla client.

Комментариев нет:

Отправить комментарий