понедельник, 6 августа 2012 г.

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

Задача: поднять 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
Часть 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.

Если данная инструкция оказалась полезной для вас, напишите, пожалуйста, об этом в комментарии.

21 комментарий:

  1. Подскажите 2 и 3 часть обязательны? Сейчас я остановился на первой часте и подключаюсь вроде без ошибок. И ещё sudo -R chown proftpd:nogroup /home/ftp -R Ставится же после chown

    ОтветитьУдалить
  2. 2 и 3 части не обязательны. Правильно, конечно же, пишется так: sudo chown -R proftpd:nogroup /home/ftp

    ОтветитьУдалить
  3. Подскажите, как сделать, чтобы работал анонимный вход. Ничего не получается. Вот proftpd.conf:


    # отключаю протокол
    UseIPv6 off

    AllowOverwrite on
    AuthAliasOnly on

    AuthUserFile /etc/proftpd/ftpd.passwd

    AuthGroupFile /etc/proftpd/ftpd.group
    # Здесь присваивается alias пользователю (в качестве примера присвоено имя test, его нужно изменить на свое)
    UserAlias user_ user
    UserAlias user2_ user2
    UserAlias user3_ user3



    ServerName "server"
    ServerType standalone
    DeferWelcome on

    MultilineRFC2228 on
    DefaultServer on
    ShowSymlinks off

    TimeoutNoTransfer 600
    TimeoutStalled 100
    TimeoutIdle 2200

    DisplayChdir .message
    ListOptions "-l"

    RequireValidShell off

    TimeoutLogin 20

    RootLogin off

    # пути для логов
    ExtendedLog /var/log/ftp.log
    TransferLog /var/log/xferlog
    SystemLog /var/log/syslog.log

    #DenyFilter \*.*/

    # Я не использую файл /etc/ftpusers (здесь вводим имена пользователей, для ограничения их доступа)
    UseFtpUsers off

    # Allow to restart a download
    AllowStoreRestart on

    # Стандартный порт для фтп 21, для повышения безопасности можно выбрать другой (произвольный):
    Port 21

    # повышение безопасности
    MaxInstances 8

    # пользователь и группа
    User ftp
    Group nogroup

    # Umask 022 ограничение на создание файлов и папок
    Umask 022 022

    PersistentPasswd off

    MaxClients 8 "Достигнут предел на количество клиентов"
    MaxClientsPerHost 8 "Достигнут предел на количество клиентов с Вашего хоста"
    MaxClientsPerUser 8 "Достигнут предел на количество подключений (%m)"
    MaxHostsPerUser 8 "Больше нельзя"

    # вывод приветствия после успешного входа
    AccessGrantMsg "Ласкаво просимо!!!"
    # идентификация
    ServerIdent on "Мій домашній сервер"

    # делаем /home/FTP-shared папку домашней
    DefaultRoot /media/Data/FTP-shared

    # запрещаем выходить пользователям за пределы домашней папки (строго рекомендуется)
    DefaultRoot ~

    MaxLoginAttempts 5 "Количество попыток входа исчерпано - придется подождать, ничего не поделаешь, безопасность превыше всего"

    #VALID LOGINS

    AllowUser user, user2, user3
    DenyALL



    Umask 022 022
    AllowOverwrite off

    DenyAll




    Umask 022 022
    AllowOverwrite off

    DenyAll




    Umask 022 022
    AllowOverwrite on

    DenyAll



    AllowAll



    # анонимный доступ

    User ftp
    Group nogroup
    UserAlias anonymous ftp
    MaxClients 8 "Извините, максимум %m пользователей - попробуйте подключиться позже"
    DisplayChdir .message


    AllowUser ftp
    DenyALL




    DenyAll



    ОтветитьУдалить
  4. а если рестарт не работает через

    /etc/init.d/proftpd restart
    ProFTPD is started from inetd/xinetd.

    и

    service proftpd restart
    ProFTPD is started from inetd/xinetd.

    то как еще можно ?

    ОтветитьУдалить
    Ответы
    1. Тогда смотрим сюда: http://www.proftpd.org/docs/howto/Stopping.html

      Удалить
  5. Анонимный20 мая 2013 г., 19:03

    Спасибо за статью, очень позновательно
    есть опечатка:
    # Пусть petr имеет полный доступ к своей папке (закачивать файлы, скачивать файлы, создавать папки, удалять )

    AllowUser vasya ----- не вася а петр

    ОтветитьУдалить
  6. спасибо! очень полезная статья. установил часть1 на минт13. всЁ с первого раза.

    ОтветитьУдалить
  7. Анонимный4 марта 2014 г., 7:00

    Дружище, спасибо тебе, ты очень помог этой статьей!

    ОтветитьУдалить
  8. Посмотрите пожалуйста что я не правельно сделал?
    Нужно чтобы пользователь alex имел полный доступ к каталогу mnt/data/VideoMon
    Конфиг такой:
    AllowOverwrite on

    RequireValidShell off
    AuthUserFile /etc/proftpd/ftpd.passwd
    AuthGroupFile /etc/proftpd/ftpd.group

    # Don't use IPv6 support by default.
    UseIPv6 off

    ServerName "ftp-server"
    ServerType standalone
    DeferWelcome on


    # Эти две команды убыстряют работу сервака, гуглите для подробностей.
    UseReverseDNS off
    IdentLookups off

    MultilineRFC2228 on
    DefaultServer on
    ShowSymlinks off

    TimeoutNoTransfer 600
    TimeoutStalled 100
    TimeoutIdle 2200

    DisplayChdir .message
    ListOptions "-l"

    TimeoutLogin 20

    #Запрещаем подключаться на сервер как root, полезно для безопасности

    RootLogin off

    # Создаём журналы
    # ExtendedLog /var/log/ftp.log
    # TransferLog /var/log/xferlog
    # SystemLog /var/log/syslog.log
    #Запрещаем заливать на сайт файлы начинающиеся с точки, полезно для безопасности
    DenyFilter \*.*/

    # Используем файлик /etc/ftpusers в нём перечислены те пользователи, которым запрещено входить на сервер, полезно для безопасности
    UseFtpUsers on

    # Разрешаем докачивать файлы
    AllowStoreRestart on

    # задаём порт, на котором будет работать сервак, обычно 21
    Port 21

    # Против DDOS атаки, полезно для безопасности
    MaxInstances 8

    # Сервер запускается и работает под этим пользователем и группой
    User alex
    Group alex

    # Umask 022 is a good standard umask to prevent new files and dirs
    # (second parm) from being group and world writable.
    Umask 022 022

    MaxClients 8
    MaxClientsPerHost 8
    MaxClientsPerUser 8
    MaxHostsPerUser 8

    # Сообщение после успешного захода на сервер
    AccessGrantMsg "Welcome to Server"
    #Идентификатор сервера, показывается всем при заходе на сервер
    ServerIdent on "privet :))"

    # Устанавливаем домашний каталог
    DefaultRoot /mnt/data/VideoMon

    # Запираем всех в домашнем каталоге, чтобы не могли просмотреть каталоги выше, важно для безопасности
    DefaultRoot ~

    MaxLoginAttempts 5
    #VALID LOGINS

    AllowUser user
    DenyALL



    Umask 022 022
    AllowOverwrite on




    Ошибки при запуске:
    alex@Server:/etc/proftpd$ /etc/init.d/proftpd start
    * Starting ftp server proftpd Server proftpd[23999]: unable to bind to Unix domain socket at '/var/run/test.sock': Permission denied
    Server proftpd[23999] 127.0.1.1: ROOT PRIVS: unable to seteuid(): Операция не позволена
    Server proftpd[23999] 127.0.1.1: ROOT PRIVS: unable to setegid(): Операция не позволена
    Server proftpd[23999] 127.0.1.1: RELINQUISH PRIVS: unable to seteuid(PR_ROOT_UID): Операция не позволена
    Server proftpd[23999] 127.0.1.1: RELINQUISH PRIVS: unable to setegid(session.gid): Операция не позволена
    Server proftpd[23999] 127.0.1.1: RELINQUISH PRIVS: unable to seteuid(session.uid): Операция не позволена
    Server proftpd[23999] 127.0.1.1: mod_delay/0.7: error opening DelayTable '/var/run/proftpd.delay': Отказано в доступе
    Server proftpd[23999] 127.0.1.1: unable to set daemon groups: Операция не позволена
    Server proftpd[23999] 127.0.1.1: ROOT PRIVS: unable to seteuid(): Операция не позволена
    Server proftpd[23999] 127.0.1.1: ROOT PRIVS: unable to setegid(): Операция не позволена
    Server proftpd[23999] 127.0.1.1: RELINQUISH PRIVS: unable to seteuid(PR_ROOT_UID): Операция не позволена

    ОтветитьУдалить
    Ответы
    1. А если дать такую команду:
      alex@Server:/etc/proftpd$ sudo /etc/init.d/proftpd start

      Удалить
  9. Спасибо помогло. Не подумал что для запуска нужны рутовые права. Но есть проблема - с виндвой машины не могу попасть на FTP пишет нет прав доступа. Как сделать чтобы выводилось окно с запросом имени и пароля пользователя???
    Спасибо за ответ.

    ОтветитьУдалить
  10. Анонимный29 мая 2014 г., 16:09

    спасибо! все очень понятно и полностью)

    ОтветитьУдалить
  11. Анонимный8 июня 2014 г., 20:44

    помоги пожалуйста . все делал по статье, но при входе пишет 530 некорректные аутентификационные данные

    ОтветитьУдалить
  12. Поставил первый дома, работает идеально...
    Поставил второй на работе и столкнулся с ошибкой 530...
    Согласно логу и как результат вмешательства, рабочего сервера...
    Причина была в том что файл с паролями и домашними директориями виртуальных пользователь из за прав...
    Сам же ProFTPd не мог считать...

    Лечится просто...
    Для файла /etc/proftpd/proftpd.conf
    Установил права на чтение для всех...

    Может это не совсем правильно по безопасности
    и надо добавлять именно пользователя от которого происходит запуск FTP сервера,
    но у меня не супер секретный сервер...

    ОтветитьУдалить
  13. Пардон...
    для файла ftpd.passwd конечно же...
    тот что указываете при создании пользователей...

    ОтветитьУдалить
  14. у меня странная ошибка
    пробовал на 2х компах оба ubuntu 1204
    приделал SFTP
    один работает нормально а второй при подключении коверкает имена каталогов
    вместо имени 20150323 дает расшифровку 23 марта 2015
    и соответственно не получается считать каталог...

    ОтветитьУдалить
  15. уточнение...
    в имя каталога вносится дата создания.....

    ОтветитьУдалить
  16. Гавно. Не работает ничего!

    ОтветитьУдалить
  17. Спаси! Клево все рассказал, пиши еще!!!

    ОтветитьУдалить
  18. Доброго времени суток! Спасибо статья что надо! (FreeBSD 11.1 proftpd 1.3.6)
    вопрос по правам доступа к каталогам сервера. Структура каталогов такова
    /root/data/UPLOAD
    /root/data/DOWNLOAD
    если с DOWNLOAD все понятно права 0550 дают юзерам возможность только скачивать то с UPLOAD сложнее в этом каталоге необходимо дать полную свободу, но вот беда, эта свобода с правами распространяется и на сам каталог. Как сделать так чтоб юзер не мог удалить каталог а лишь его содержимое. Спасибо

    ОтветитьУдалить