proftpd + mysql + mod_qouta (ftp mysql quota)

Введение

задача: Организовать 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

[airo@airo /]# cat /etc/passwd |grep airo
airo:*:1005:0:User &:/home/airo:/usr/local/bin/bash

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.

[airo@airo /]# cat /etc/passwd |grep ftp:
ftp:*:1012:1013:User &:/dev/null:/sbin/nologin

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 ~

AllowOverwrite on

AllowAll

AllowAll

# Если нужен анонимный доступ раскомментировать.

#< Anonymous /path/to/anonymous/users> # Директория для анонимов.
# User ftp
# Group ftp
# UserAlias anonymous ftp
# MaxClients 10
# < Limit WRITE>
# DenyAll # Запрещаем писать.
# < /Limit>
#< /Anonymous>

#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
должны быть одной строкой в конфиге. вот вродебы и все теперь можно
запусктать 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

Похожие записи:

You can follow any responses to this entry through the RSS 2.0 feed.