From: Khomyakov Alexandr aka airo <airo@airo.com.ru.>
Date: Mon, 11 Aug 2006 14:31:37 +0000 (UTC)
Subject: proftpd + mysql + mod_qouta
Введение
задача: Организовать ftp доступ для нескольких пользователей и назначить
этим пользователям квоты,
Статья написана из за того что мало информации о том как же
сконфигурировать mod_quotatab. Надеюсь кому-нибудь пригодиться :)
Информация о пользователях и квотах будет содержаться в mysql, вызвано
это тем что юзеров секьюрнее держать в базе данных, а реализация
mod_quotatab на текстовых файлах не очень красиво выглядит в плане того
что квоты в этом случае добавляются с помощью скрипта со сложным
синтаксисом.
Я рассчитываю на то что вы самостоятельно сможете установить proftpd с
mod_sql и mod_qouta и базу данных mysql.
Создаем базу данных и таблицы, и пользователя.
mysql -u root -p
CREATE DATABASE proftpd;
USE proftpd;
grant select,insert,update,delete on proftpd.* to proftpd@localhost identified by 'password';
CREATE TABLE users (
primary_key int not null auto_increment primary key,
username varchar(20) not null,
password varchar(20) not null,
uid int not null,
gid int not null,
homedir varchar(50) not null,
shell varchar(20) not null
);
CREATE TABLE quotalimits (
name VARCHAR(30),
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 UNSIGNED NOT NULL,
files_out_avail INT UNSIGNED NOT NULL,
files_xfer_avail INT UNSIGNED NOT NULL
);
CREATE TABLE quotatallies (
name VARCHAR(30) 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 UNSIGNED NOT NULL,
files_out_used INT UNSIGNED NOT NULL,
files_xfer_used INT UNSIGNED NOT NULL
);
Добавляем группу и юзера для proftpd и виртуальных пользователей proftpd
pw group add ftp
pw user add ftp -s /sbin/nologin -d /dev/null -g ftp
заносим пользователей и квоты.
Если для системного пользователя, смотрим uid gid
insert into users values (NULL,'airo','passwd','1005','0','/home/airo','/sbin/nologin');
insert into quotalimits values ('airo','user','false','hard','0','0','0','0','0','0');
Если для виртуального пользователя, то его файлы должны кому то
принадлежать. Это будет user ftp.
insert into users values (NULL,'uk','uk123','1012','1013','/home/vftp/uk','/sbin/nologin');
задем квоту в 150Мб
insert into quotalimits values ('airo','user','false','hard','157286400','0','0','0','0','0');
Комментарии к таблице users
username: имя виртуального пользователя
passwd: незашифрованный пароль
uid: uid пользователя которому будут принадлежать файлы
gid: gid пользователя которому будут принадлежать файлы
homedir: chroot директория пользователя.
shell: по умолчанию /sbin/nologin
Комментарии к таблице quotalimits
name: имя виртуального пользователя
quota_type: тип ограничения по (user,qroup,class или all - для всех)
per_session: true - использовать квоту только на текущую сессию, в этом случае ни куда не записывается размер использованной квоты и для каждой новой сессии используется указанная квота.
false - в этом случае использование квоты заноситься в базу данных.
limit_type: soft - возможно некоторое превышение квоты
hard - жостко заданная квота, превышение невозможно
bytes_in_avail лимит загрузки в байтах ( если 150 Мб то 157286400 байт) 0 = нет лемита
bytes_out_avail лимит скачивания в байтах. 0 = нет лимита
bytes_xfer_avail: Лимит передачи в байтах.0 = нет лимита
files_in_avail: Лимит количества загружаемых файлов. 0 = нет лимита
files_out_avail: Лимит количесва скачиваемых файлов. 0 = нет лимита
files_xfer_avail: Лимит количесва передачи файлов. 0 = нет лимита
таблицу quotatallies редактировать не нужно proftpd это делает сам.
Для виртуальных пользователей можно использовать любую папку, я например
использовал следующую
mkdir /home/vftp
только вот для каждого нового пользователя нужно обязательно создавать
домашнюю директорию и назначать владельца согласно выставленным в БД uid
и gid
mkdir /home/vftp/uk
chown ftp:ftp /home/vftp/uk
Собственно конфиг proftpd
#-------------------- proftpd.conf ---------------------------#
ServerName "FTP server for site.ru "
ServerAdmin airo@site.ru
ServerType standalone
DefaultServer on
ServerIdent on
Port 21
Umask 022
MaxClients 10 "Sorry, the maximum number of allowed users are already connected (%m)"
MaxClientsPerHost 10 "Sorry, you may not connect more than one time. %m allowed users already connected"
MaxLoginAttempts 3
User ftp
Group ftp
SyslogLevel notice
UseReverseDNS off
IdentLookups off
SystemLog /var/log/proftpd/proftpd.log
TransferLog /var/log/proftpd/proftpd-tranfer.log
ExtendedLog /var/log/proftpd/proftpd-extended.log read,write
ExtendedLog /var/log/proftpd/proftpd-auth.log AUTH auth
LogFormat default "%h %l %u %t "%r" %s %b"
LogFormat auth "%v [%P] %h %t "%r" %s"
LogFormat write "%h %l %u %t "%r" %s %b"
TimeoutIdle 300
TimeoutLogin 300
TimeoutNoTransfer 360
TimeoutStalled 640
DefaultTransferMode binary
AllowForeignAddress off
DisplayConnect /etc/ftp_connect.msg
DisplayLogin /etc/ftp_login.msg
AccessDenyMsg "ATTENTION!!! ALL CONNECTIONS LOGED"
AccessGrantMsg "Now upload/download files"
DisplayGoAway "Go Away"
PersistentPasswd off
DefaultRoot ~
#sql info
SQLAuthTypes Plaintext # хранить пароли в открытом тексте
SQLAuthenticate users
SQLConnectInfo proftpd@localhost proftpd password # база@хост логин пароль
SQLUserInfo users username password uid gid homedir shell # данные которые беруться из базы
RequireValidShell off # непроверять валидность шелла
#SQLLogFile /var/log/proftpd/sql.log #нужно только на время тестирования после закоментить, генерирует много инфы.
# config quotas
# ===========
QuotaEngine on # включить квоту
QuotaDirectoryTally on
QuotaDisplayUnits Mb
QuotaShowQuotas on
SQLNamedQuery get-quota-limit SELECT "name, 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 name = '%{0}' AND quota_type = '%{1}'"
SQLNamedQuery get-quota-tally SELECT "name, quota_type, bytes_in_used, bytes_out_used,
bytes_xfer_used, files_in_used, files_out_used, files_xfer_used FROM quotatallies
WHERE name = '%{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 name = '%{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
#----------------------------- end config --------------------------------#
Создаем директорию для логов
mkdir /var/log/proftpd
запросы
SQLNamedQuery get-quota-limit
SQLNamedQuery get-quota-tally
SQLNamedQuery update-quota-tally
должны быть одной строкой в конфиге. вот вродебы и все теперь можно
запусктать proftpd если не получаеться смотреть логи.
проверить работоспособность квоты можно залогинившись и набрав команду
ftp> quote site quota
200-The current quota for this session are [current/limit]:
Name: airo
Quota Type: User
Per Session: False
Limit Type: Hard
Uploaded Mb: 0.00/150.00
Downloaded Mb: unlimited
Transferred Mb: unlimited
Uploaded files: unlimited
Downloaded files: unlimited
Transferred files: unlimited
200 Please contact airo@site.ru if these entries are inaccurate