Блог majestyНастройка FTP - Proftpd на Ubuntu 10.04


Теги

Ubuntu, FTP, Proftpd, Debian

Автор majesty

Устанавливаем сам proftpd и модуль для mysql, если надо(у меня давно установлен) mysql сервер.

sudo aptitude install proftpd-basic

sudo aptitude install proftpd-mod-mysql


При установке будет предложено выбрать способ запуска proftpd. Из предложенного описания понятно что и в каком случае необходимо выбирать. Для разработки достаточно inetd.


Открываем proftpd.conf

sudo vim /etc/proftpd/proftpd.conf


И убираем комментарий напротив

DefaultRoot                     ~
Include /etc/proftpd/sql.conf


и указываем следующие настройки квот

<IfModule mod_quotatab.c>
QuotaEngine on
QuotaDirectoryTally on
QuotaDisplayUnits Mb
QuotaShowQuotas on

SQLNamedQuery get-quota-limit SELECT "login, quota_type, per_session, limit_type, bytes_in_avail, bytes_out_avail, bytes_xfer_avail, files_in_avail, files_out_avail, files_xfer_avail FROM quotalimits WHERE login = '%{0}' AND quota_type = '%{1}'"
SQLNamedQuery get-quota-tally SELECT "login, quota_type, bytes_in_used, bytes_out_used, bytes_xfer_used, files_in_used, files_out_used, files_xfer_used FROM quotatallies WHERE login = '%{0}' AND quota_type = '%{1}'"
SQLNamedQuery update-quota-tally UPDATE "bytes_in_used = bytes_in_used + %{0}, bytes_out_used = bytes_out_used + %{1}, bytes_xfer_used = bytes_xfer_used + %{2}, files_in_used = files_in_used + %{3}, files_out_used = files_out_used + %{4}, files_xfer_used = files_xfer_used + %{5} WHERE login = '%{6}' AND quota_type = '%{7}'" quotatallies
SQLNamedQuery insert-quota-tally INSERT "%{0}, %{1}, %{2}, %{3}, %{4}, %{5}, %{6}, %{7}" quotatallies

QuotaLimitTable sql:/get-quota-limit
QuotaTallyTable sql:/get-quota-tally/update-quota-tally/insert-quota-tally
QuotaLog /var/log/proftpd/quota.log
</IfModule>




Открываем modules.conf

sudo vim /etc/proftpd/modules.conf


И убираем комментарий напротив

LoadModule mod_sql.c
LoadModule mod_sql_mysql.c
LoadModule mod_quotatab.c
LoadModule mod_quotatab_sql.c



Открываем sql.conf

sudo vim /etc/proftpd/sql.conf


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

<IfModule mod_sql.c>
SQLBackend mysql
SQLEngine on
SQLAuthenticate users
SQLAuthTypes Crypt
SQLConnectInfo имя_базы@хост_базы пользователь пароль_пользователя
SQLUserInfo users login passwd uid gid homedir shell
SQLMinUserGID 10
SQLMinUserUID 10
</IfModule>


Перезагрузим proftpd.

sudo /etc/init.d/proftpd restart



Далее в в базу данных указанную в строке SQLConnectInfo заливаем sql примерно такого содержания

CREATE TABLE users(
    login VARCHAR(20) NOT NULL,
    passwd VARCHAR(20) NOT NULL,
    uid INT NOT NULL,
    gid INT NOT NULL,
    homedir VARCHAR(50) NOT NULL,
    shell VARCHAR(20) NOT NULL
) ENGINE=INNODB DEFAULT CHARSET=utf8;


  • login - логин пользователя
  • passwd - пароль пользователя
  • uid - идентификатор пользователя которому будут принадлежать загруженные файлы
  • gid - идентификатор группы которой будут принадлежать загруженные файлы
  • homedir - путь к корневому каталогу пользователя
  • shell - shell пользователя


CREATE TABLE quotalimits (
    login VARCHAR(20) DEFAULT NULL,
    quota_type ENUM('user','group','class','all') NOT NULL,
    per_session ENUM('false','true') NOT NULL,
    limit_type ENUM('soft','hard') NOT NULL,
    bytes_in_avail FLOAT NOT NULL,
    bytes_out_avail FLOAT NOT NULL,
    bytes_xfer_avail FLOAT NOT NULL,
    files_in_avail INT(10) UNSIGNED NOT NULL,
    files_out_avail INT(10) UNSIGNED NOT NULL,
    files_xfer_avail INT(10) UNSIGNED NOT NULL
) ENGINE=INNODB DEFAULT CHARSET=utf8;


  • login - логин пользователя
  • quota_type - тип ограничения
  • per_session - флаг обозначающий работу квоты только для текущей сессии
  • limit_type - soft допускает незначительное превышение квоты
  • bytes_in_avail - лимит загрузки в байтах, 0 означает отсутствие лимита
  • bytes_out_avail - лимит скачивания в байтах, 0 означает отсутствие лимита
  • files_in_avail - лимит загрузки файлов, 0 означает отсутствие лимита
  • files_out_avail - лимит скачивания файлов, 0 означает отсутствие лимита
  • files_xfer_avail - лимит колличества передачи файлов, 0 означает отсутствие лимита


CREATE TABLE quotatallies (
    login VARCHAR(20) NOT NULL,
    quota_type ENUM('user', 'group', 'class', 'all') NOT NULL,
    bytes_in_used FLOAT NOT NULL,
    bytes_out_used FLOAT NOT NULL,
    bytes_xfer_used FLOAT NOT NULL,
    files_in_used INT(10) UNSIGNED NOT NULL,
    files_out_used INT(10) UNSIGNED NOT NULL,
    files_xfer_used INT(10) UNSIGNED NOT NULL
) ENGINE=MYISAM DEFAULT CHARSET=utf8;



Для моей текущей задачи необходим доступ из php к загруженным файлам, потому я указываю идентификаторы группы и пользователя от которых работает веб сервер. Следует учитывать что по-умолчанию вы не можете указать gid и uid меньше чем 999. Поскольку мне необходимо указать меньшие значения, я добавил следующие параметры в sql.conf

SQLMinUserGID 10
SQLMinUserUID 10


Осталось добавить пользователя в таблицу users и если нужно лимит в quotalimits. Поскольку в AuthTypes я выбрал Crypt то пароль необходимо шифровать. Запрос добавляющий пользователя выглядит примерно так

INSERT INTO users(login, passwd, uid, gid, homedir, shell) VALUES
('test', encrypt('пароль'), 33, 33, '/home/majesty/ftp/uploads/test', '/sbin/nologin');




Возможные проблемы
  • Ошибка при входе - (Login failed): Invalid shell
    Либо добавить shell пользователя в /etc/shells либо убрать комментарий в proftpd.conf напротив RequireValidShell off

Для добавления комментариев необходимо авторизоваться.
2010 ©