Чужой опыт экономит время и увеличивает шансы для удачи

ProFTPd - некоторые тонкости настройки

Сборник некоторых подробностей настройки FTP (ProFTPd), которые почему-то приходилось долго выискивать, постоянно натыкаясь только на не отвеченные вопросы.

Позднее возможно сделаю из этого сборника полноценную статью, хотя сам по-себе ProFTPd достаточно прост и как правило не нуждается в каких-то особых настройках.

В данный момент здесь присутствует следующее:

  • Аутентификация из файла - малоизвестная проблема
  • Подмена владельца для закачиваемых файлов
  • AllowOverwrite и AllowOverride - в чем разница
и пр.



В этой статье собраны заметки по настройке ProFTPd, с которыми я сталкивался, и которые вызвали некоторые затруднения.

Это скорее конспект-шпаргалка, чем достоверный справочник. Кроме ответов здесь могут присутствовать вопросы.

Содержание

  1. Аутентификация из файла - нужен модуль
  2. Подмена владельца файлов для виртуального пользователя
  3. AllowOverwrite и AllowOverride - в чем разница

Аутентификация из файла - нужен модуль

В многочисленных инструкциях в Интернет подробно описывается как завести виртуального пользователя, но часто не указывают одну важную настройку, которая не прописывается в конфиге по умолчанию.

В итоге в логах может отображаться странная ошибка:
"USER ...: no such user found from...".
а в FTP-клиенте такая:
"530 Login incorrect.",
при том что настроено все вроде бы правильно.

Итак, в конфиге ProFTPd нужно обязательно прописать модуль аутентификации из файла:

/etc/proftpd.conf :

...
AuthOrder			mod_auth_file.c
...

Пример настройки аутентификации - см. далее.


Подмена владельца файлов для виртуального пользователя

Бывает нужно чтобы файлы на сервер сохранялись сразу ("на лету", во время закачки) под каким-то системным юзером (например "www-data" или "apache"), независимо от того под каким виртуальным пользователем ProFTPd происходит закачивание. Это намного удобнее, чем запускать специальные скрипты меняющие у файлов права пользователя после закачки или делать это из консоли.

Убил много времени на поиск того как это делается, перепробовав разные настройки ( UserOwner, GroupOwner, UserAlias и пр.) - оказалось есть простой способ.

При создании виртуального юзера, нужно его логин и пароль указывать новые, а ID юзера/группы - такие как у необходимого уже имеющегося системного юзера и/или группы (например это может быть 48 для "www-data"). Это самое простое решение проблемы.

Если виртуальному юзеру указать ID системных юзера/группы, то его файлы будут сохраняться от имени системных

Итак - подмена владельца закачиваемых файлов через указание ID системного пользователя, по порядку
(*здесь описана файловая аутентификация, но для SQL варианта, подмена ID системного юзера/группы обычному виртуальному прописывается схожим образом):


1. Создаем папку если ее нет (под root в консоли):

mkdir /etc/proftpd

Права - root:root 755


2. Прописываем виртуального пользователя в файл (под root в консоли):

ftpasswd --passwd --file=/etc/proftpd/ftpd.passwd --name=vuser1 --uid=48 --gid=48 --home=/var/www/html/vuser1 --shell=/bin/false
где:
--file=/etc/proftpd/vuser1.passwd - файл с паролями виртуальных юзеров
--name=vuser1 - имя первого/очередного виртуального юзера
--uid=48 - ID необходимого системного юзера (например "www-data")
--gid=48 - ID необходимой системной группы (например "www-data")
--home=/var/www/html/vuser1 - домашний каталог виртуального пользователя
ВАЖНО!
- владельцем файла "/etc/proftpd/ftpd.group" должен быть тот системный пользователь/группа, чей uid/gid подменяет виртуального
- узнать uid и gid например для "www-data" можно набрав в консоли - id www-data


3. Прописываем группу виртуального пользователя в файл (под root в консоли):

ftpasswd --group --file=/etc/proftpd/ftpd.group --name=vgroup --gid=48 --member=vuser1
где:
--file=/etc/proftpd/ftpd.group - файл групп виртуальных юзеров
--name=vgroup - имя виртуальной группы виртуального юзера
--gid=48 - ID необходимой системной группы (например "www-data")
--member=vuser1 - виртуальный юзер - член виртуальной группы
ВАЖНО!
- владельцем файла "/etc/proftpd/ftpd.group" должен быть тот системный пользователь/группа, чей uid/gid подменяет виртуального
- если это не первый юзер в группе, то "member" надо перечислять: ... --member=vuser1 --member=vuser2 ...


В предыдущих двух пунктах все достаточно стандартно, кроме UID=48 и GID=48,
где 48 - UID и GID системного пользователя и группы "www-data" (имя группы и пользователя в этом примере совпадает)

4. Настройки proftpd.conf могут быть примерно такими:

/etc/proftpd.conf

...
DefaultRoot			~ vgroup
RequireValidShell		off
...
<Global> 
  ... 
  AuthUserFile            /etc/proftpd/ftpd.passwd  
  AuthGroupFile           /etc/proftpd/ftpd.group  
  ...
  <Directory /var/www/html/vuser1/*>
      ...    
      <Limit LOGIN>
        AllowUser vuser1
        DenyAll
      </Limit>
      ...
  </Directory>
  ...
</Global>
...
DefaultRoot   ~  vgroup - не дает подняться выше своего каталога
RequireValidShell   off - если этого не указать, может возникнуть ошибка в логе proftpd - ...Invalid shell: '/bin/false'
AllowUser   vuser1 - доступ только виртуальному юзеру в свою директорию.
Возможно надо будет закомментировать к примеру пользователя "www-data" (UID 48) в файле /etc/ftpusers

ВАЖНО!
Не забываем прописать модуль аутентификации из файла в настройках - см. выше.


AllowOverwrite и AllowOverride - в чем разница

AllowOverwrite [ on|off ] - Разрешить ли перезапись существующих файлов
контекст - конфигурация сервера, <VirtualHost>, <Anonymous>, <Directory>, <Global>, .ftpaccess
модуль - mod_xfer
по умолчанию - off

AllowOverride [ on|off ["user"|"group"|"class" expression] ] - Включение/выключение, и опционально - условия обработки файлов .ftpaccess
контекст - конфигурация сервера, <Global>, <VirtualHost>, <Anonymous>
модуль - mod_core
по умолчанию - on



Рекламные ссылки:
Вопросы по теме статьи (просьба - без личностей), - присутствует премодерация:
   - регистрироваться НЕ обязательно! -

Комментарий будет опубликован только после проверки

Вы можете войти под своим логином или зарегистрироваться на сайте.

(обязательно)