Настройка proftpd для работы с виртуальными пользователями и произвольными директориями

Большинство инструкций по настройке ftp сервера ограничивается базовой установкой.
Вот например — как установить:

В базовом варианте — сервер работает, пускает зарегистрированных в системе пользователей в их домашние папки. А анонимных в какую нибудь другую.

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

Если создавать системного пользователя и ем указывать эту папку — он логинится на ftp сервер, но не может даже перейти в эту директорию, так как где то посередине стоят права 700 на пользователя под которым работает апач. И менять их не было никакого желания.

Описание решения было найдено, оставалось только заставить работать

Создаем нового виртуального ftp-пользователя с логином tester, идентификатором 33, группой 33 и домашним каталогом /var/www/test.ru. (где 33 — id реального пользователя у которого есть доступ к указанной папке)

ftpasswd —passwd —file=/etc/proftpd/ftpd.passwd —name=tester —uid=33 —gid=33 —home=/var/www/test.ru —shell=/bin/false

После выполнения команды система попросит ввести дважды пароль пользователя.
В итоге, у нас появится файл /etc/proftpd/ftp.passwd с записью о пользователе.
Кстати, изменить пароль пользователя можно следующей командой:

ftpasswd —passwd —name=tester —change-password

Теперь редактируем /etc/proftpd/proftpd.conf, для подключения виртуального пользователя:

RequireValidShell off
AuthUserFile /etc/proftpd/ftpd.passwd

http://habrahabr.ru/sandbox/26850/

Почему то очень редко все работает, как описанно в советах пользователей. Но откуда начинать копать — уже более менее понятно

Чтобы работала авторизация с использованием созданного файла необходимо указать модули используемые для этого: mod_auth_file.c.

Системные и виртуальные пользователи

AuthUserFile /usr/local/etc/proftpd/ftpd.passwd
AuthGroupFile /usr/local/etc/proftpd/ftpd.group
AuthPAM off
AuthPAMConfig proftpd
AuthOrder mod_auth_pam.c* mod_auth_unix.c mod_auth_file.c
RequireValidShell off #обязательно добавить,иначе авторизация вирт.пользователей не работает

Только виртуальные пользователи

AuthUserFile /usr/local/etc/proftpd/ftpd.passwd
AuthGroupFile /usr/local/etc/proftpd/ftpd.group
AuthOrder mod_auth_file.c
RequireValidShell off #обязательно добавить,иначе авторизация вирт.пользователей не работает

http://kamaok.org.ua/?p=136

Подключение стало проходить, но листинг директории — не отдавал, зависал на команде PASV и закрывал соединение не дождавшись ответа.
Попробовал указать директиву с диапазоном портов — без эффекта.
Запретил на клиенте пассивный режим — все равно PASV отправлялась. (видимо надо было закрыть вкладку сервера и открыть заново в FileZilla)
Запретил на сервере пассивный режим — заработало.

<limit EPSV PASV>
DenyAll
</limit>

Полный список директив:
http://www.proftpd.org/docs/directives/configuration_full.html

То что в итоге получилось:
proftpd.conf

  • Ivan Kostrubin

    Я даже ваш конфиг перенял, просто поменял пользователя и группу ftp на
    User proftpd
    Group nogroup
    Прошел не только ваш мануал, и несколько других. Никак не удается заставить эту тварь работать.
    Сервер поднимается, но авторизация не проходит. Ни по виртуальной связке логинпароль, ни по существующим (по ним точно не должно пускать)
    И естественно листинг дирректорий не дается ибо не авторизирован.
    Уже и полностью сносил профтп с конфигами и проходил мануал заново, не удается мне заставить авторизироваться с виртуального пользователя для чтения и записи одной несчастной папки.

    • VladimirDolgov

      id пользователя и груп тоже меняли или только названия?

      • Ivan Kostrubin

        да, конечно, при создании виртуального пользователя указал id группы и пользователя идентичные proftpd.

        • VladimirDolgov

          а если указать модуль разрешающий пускать реальных пользователей, то пускает?

          права на чтение ftpd.passwd правильные стоят?

          адрес файла совпадает с адресом в конфиге?

          • Ivan Kostrubin

            При манипуляции со строкой
            RequireValidShell off — пускает реальных пользователей, как и по умолчанию. Вопрос по указанию модулей для разрешения доступа реальным — не исследовал, так как с умолчательным конфигом, им доступ есть.

            Какие права должны стоять на файле ftpd.passwd ?

            Про адрес файла с адресом в конфиге не совсем понял, поясните пожалуйста.

          • VladimirDolgov

            права на файл — так чтобы пользователь от которого запущен демон (в моем случае в этом конфиге — ftp) имел доступ к чтению. По умолчанию вреде так и должно быть, но мало ли.. можно вообще 777 поставить, чтобы проверить.

            в конфиге за адрес файла с паролями отвечает строка AuthUserFile (собственно если конфиг и комманды создания виртуального пользователя копировали, то должно совпадать)

          • Ivan Kostrubin

            Понял, хорошо, я проверю это как появится возможность и отпишусь.
            А пока что ограничился использованием одного реального пользователя и одной папки для всех запросов. Авторизация через логин пароль успешна.
            Спасибо за помощь!

  • freebsd

    извините, а почему у меня выдает такую ошибку?
    ftpasswd: missing required —passwd or —group
    ftpasswd: use ftpasswd —help for details on usage

  • Админ

    у меня все получилось. Только при входе на ftp выдает ошибку login incorrect

    Походу у меня все правильно настроено

  • Админ

    freebsd: если вы скопировали коды отсюда, то вместо — напишите —

  • Ivan Kostrubin

    Подскажите пожалуйста, есть ли у профтп возможность следующей реализации одновременно:
    1. Анонимный доступ только для записи в строго конкретную папку.
    2. Доступ виртуальному пользователю в другую конкретную папку только для чтения. (Возможно для записи так же.)
    ?

    • VladimirDolgov

      анонимный не пытался, но по любому можно…
      вот например описание навскидку нашел…

      http://securos.org.ua/proftpd-ustanovka-i-nastrojka-anonimnogo-dostupa/

      Виртуальная у меня описана.. правда не у всех работает…

      ограничения на чтение запись — директивой Limit (тоже там пример разобран)

  • point212

    Не подскажите каким алгоритмом должен быть зашифрован пароль в файле? А то я уже все перебрал. Все равно не могу авторизоваться.
    Кстати утилиты ftpasswd в моём дистрибутиве нет. А скачанная отдельно она не работает.

    • VladimirDolgov

      Алгоритм не знаю, но формат строки в файле /etc/proftpd/ftpd.passwd такой:

      user:$1$nbFjxIr4$5xMoTwMGJ9.ja5ovXgRFN1:500:500::/
      home/www/userdir/http:/bin/false

      • point212

        Ну про формат в документации написано. Не очень понятно с шифрованием. Судя по всему всё же MD5. Но почему-то пароль зашифрованный при помощи htpasswd этим алгоритмом не подошёл.
        Потом удалось всё же запустить утилиту ftpasswd (заработала если не указывать —file) и ей сгенерировать нужную строчку.