ProFTPd+MySQL+QUOTA
Добавлено: 2008-12-26 22:02:45
Нужна ли такая статья профтд с поддержкой виртуальных пользователей и квот для них в бд?
Танки встречай шквалом огня, твёрдо запомни - горит и броня
https://forum.lissyara.su/
А принципиально что proftpd, под vsftpd пойдеть?Sun писал(а):ок,тогда писать приступаю к написанию, выложу здесь на форуме !
я имел ввиду принципиально использовать данный ФТП сервер, или тоже самое можно реализовать и сдругими?sun гость писал(а):Сорри вопроса не понял?
вообщем пиши статью я сам разберусь как прикрутить к другим фтп серверамsun Гость писал(а):чесно не знаю,раньше пользовалсятолько стандаотным фтп фри,поставил профтп понравилось
Код: Выделить всё
#uname -a
FreeBSD 127.0.0.1 7.0-RELEASE FreeBSD 7.0-RELEASE #0: Sun Feb 24 19:59:52 UTC 2008 root@logan.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC i386
Код: Выделить всё
[127][root][/]#cd /usr/ports/ftp/proftpd-mysql/
[127][root][/usr/ports/ftp/proftpd-mysql]# make config
Код: Выделить всё
[X] IFSESSION Include mod_ifsession
[X] MYSQL MySQL auth (Can be combined with PGSQL)
[X] NLS Use nls (builds mod_lang)
[X] QUOTA Include mod_quota
[X] RADIUS Include mod_radius
[X] RATIO Include mod_ratio
[X] README Include mod_readme
[X] REWRITE Include mod_rewrite
[X] WRAP Include mod_wrap2
Код: Выделить всё
[127][root][/usr/ports/ftp/proftpd-mysql]# make install
[127][root][/usr/ports/ftp/proftpd-mysql]# rehash
Код: Выделить всё
[127][root][/usr/ports/ftp/proftpd-mysql]# rm /usr/local/etc/proftpd.conf
[127][root][/usr/ports/ftp/proftpd-mysql]# touch /usr/local/etc/proftpd.conf
[127][root][/usr/ports/ftp/proftpd-mysql]# ee /usr/local/etc/proftpd.conf
Код: Выделить всё
# Конфиг proftpd - 2009-01-4
# имя сервера - показывается коннектящимся клиентам
ServerName "Private FTP server."
# тип сервера (даже не тип самого сервера, а тип его запуска,
# standalone/inetd - сам или через inetd)
ServerType standalone
# смысл следующей директивы такой: если клиент коннектится не на имя
# а на IP или на виртуальный хост, не описанный в конфиге, то при
# установке в `off` он получит отлуп, если же установлено `on` то
# он будет обслужен `сервером по-умолчанию`
DefaultServer on
# e-mail администратора (по идее для каждого ВиртуалХоста его можно
# поставить разный - но я делаю один сервер без извращений с
# виртуальными хостами)
ServerAdmin q1230@rambler.ru
# файло где хранится инфа о сессиях
#ScoreboardFile /var/run/proftpd.scoreboard
# Поддержка кодировки cp1251
LangEngine on
UseEncoding KOI8-R CP1251
# порт на котором работает сервер
Port 21
# Маска с которой создаются новые файлы (не совсем маска - маска получается
# из этого значения, путём его вычитания из 777 - т.е. в даном случае получится
# маска 755)
Umask 022
# никаких действий после входа в течении 600 сек выход
TimeoutIdle 600
# отводится на авторизацию 300 сек иначе разрыв
TimeoutLogin 300
# вошел, но не начал передачу в течении 300 сек выход
TimeoutNoTransfer 300
# размер-очереди
tcpBackLog 5
# Максимальное количество клиентов
MaxClients 10 "Sorry, the maximum number of allowed users are already connected (%m)"
# Максимальное количество клиентов с одного хоста
MaxClientsPerHost 2 "Sorry, you may not connect more than one time. %m allowed users already connected"
# допускаемое число попыток ввести пароль
MaxLoginAttempts 3
# Максимальное число `детей` (работает только в standalohe режиме)
# необходимо для защиты от атак типа `отказ в обслуживании` да и
# от перегрузки сервера поможет :)
MaxInstances 30
# Юзер от которого работает сервер
User proftp
# группа, под которой работает сервер
Group proftp
# Тип авторизации (на самом деле - в каком виде хрянятся
# пароли в БД - в данном случае - открытым текстом)
SQLAuthTypes Plaintext
# Кого и как аутентифицируем - on - всех и вся :)
# Но - если поставить `on` то он ломится в БД за группами.
# мне группы никчему. Посему поставил `users`
SQLAuthenticate users
# инфа для соединения с MySQL сервером:
# имя_базы_данных@хост_где_MySQL:порт имя_пользователя пароль
SQLConnectInfo proftpd@localhost:3306 proftpd pwd
# в каком порядке вернёт поля запрос - первое поле, это
# имя таблицы, где лежат пользователи
SQLUserInfo `users_table` `username` `password` `uid` `gid` \
`homedir` `shell`
# должен ли быть у юзера (для того, чтобы он мог коннектится),
# `реальный` shell описанный в /etc/shells
RequireValidShell off
# лог файл работы с SQL
SQLLogFile /var/log/proftpd/proftpd.log
# Записываем удачные логины в БД. Общий смысл такой - создаём
# именованую кверю, с указанием что мы должны сохранять
SQLLog PASS counter_login
SQLNamedQuery counter_login UPDATE "`last_login`=UNIX_TIMESTAMP(), \
`login_count`=`login_count`+1 WHERE \
`username`='%u'" `users_table`
# пишем неудачные логины в БД
SQLLog ERR_PASS counter_err
SQLNamedQuery counter_err UPDATE "`last_err_login`=UNIX_TIMESTAMP(), \
`err_login_count`=`err_login_count`+1 WHERE \
`username`='%U'" `users_table`
# логируем что сохраняет и тащщит с сервера:
# переменные
# %u - имя пользователя (с которым залогинился)
# %f - полный путь и имя файла который был скачан
# %b - число байт, которые были скачаны
# %h - имя клиента (из DNS), если не удалось разрешить - IP
# %a - IP-адрес клиента
# %m - имя команды полученной от клиента (RETR/STOR)
# %T - время (секунд) ушедшее на передачу файла клиенту
SQLLog RETR,STOR log_story_transfer
SQLNamedQuery log_story_transfer INSERT "'',\
UNIX_TIMESTAMP(),'%u',\
'%f', '%b', '%h', \
'%a', '%m', '%T'" \
`xfer_table`
# записываем ошибки при сохранении и чтении файлов
SQLLOG ERR_RETR,ERR_STOR,ERR_DELE,ERR_RMD,ERR_RNTO\
log_err_modify
SQLNamedQuery log_err_modify INSERT "'',\
UNIX_TIMESTAMP(),\
'%u', '%f', '%h', \
'%a', '%m'" `xfer_errors`
UseReverseDNS off
IdentLookups off
# себе я разрешил шариться по всему серверу
# а остальных за`chroot`ил. Если, например, надо чтобы пользователи
# могли по серверу шариться а анонимоусы нет, то надо указать !users
# также можно указать определённую группу.
DefaultRoot ~ !ad
# Директории
<Directory ~>
AllowOverwrite on
<Limit Write>
AllowAll
</Limit>
<Limit READ>
AllowAll
</Limit>
</Directory>
<Anonymous /ds/ftp/guest>
# пользователь от которого анонимоусы шарятся
User proftp
# группа анонимоусов
Group proftp
# альясы ананонимоусов (можно будет входить как ftp, а
# не anonymous)
UserAlias anonymous proftp
# максимально число анонимоусов
MaxClients 10 "Sorry, max %m users - try again later"
# Разрешаем анонимам лить на сервер файлы
#<Limit WRITE>
#DenyAll
#</Limit>
</Anonymous>
QuotaEngine on # включить квоту
QuotaDirectoryTally on # директива настраивает mod_quotatab принять каталоге операций (например, создание каталогов, удаление каталога)
# во внимание при подсчете
QuotaDisplayUnits Mb # Отображения информации квоты в мегабайтах
QuotaShowQuotas on # директиву можно использовать для включения / выключения mod_quotatab
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
Код: Выделить всё
[127][root][/usr/ports/ftp/proftpd-mysql]# adduser proftp
Код: Выделить всё
proftp:*:1002:1002:ProFTPd server:/nonexistent:/sbin/nologin
Код: Выделить всё
[127][root][/usr/ports/ftp/proftpd-mysql]# mkdir /var/log/proftpd
[127][root][/usr/ports/ftp/proftpd-mysql]# touch /var/log/proftpd/proftpd.log
[127][root][/usr/ports/ftp/proftpd-mysql]# chown proftp:wheel /var/log/proftpd/proftpd.log
[127][root][/usr/ports/ftp/proftpd-mysql]# touch /var/log/proftpd/quota.log
[127][root][/usr/ports/ftp/proftpd-mysql]# chown proftp:wheel /var/log/proftpd/quota.log
Код: Выделить всё
/var/log/proftpd/quota.log proftpd:wheel 600 2 200 * JC
/var/log/proftpd/proftpd.log proftpd:wheel 600 1 500 * JC
Код: Выделить всё
[127][root][/usr/ports/ftp/proftpd-mysql]# mkdir /ds/ftp
[127][root][/usr/ports/ftp/proftpd-mysql]# mkdir /ds/ftp/user
[127][root][/usr/ports/ftp/proftpd-mysql]# mkdir /ds/ftp/user/ad
[127][root][/usr/ports/ftp/proftpd-mysql]# mkdir /ds/ftp/guest
[127][root][/usr/ports/ftp/proftpd-mysql]# chown proftp:wheel /ds/ftp
[127][root][/usr/ports/ftp/proftpd-mysql]# chown proftp:wheel /ds/ftp/*
[127][root][/usr/ports/ftp/proftpd-mysql]# chmod 777 /ds/ftp
[127][root][/usr/ports/ftp/proftpd-mysql]# chmod 777 /ds/ftp/*
[127][root][/usr/ports/ftp/proftpd-mysql]# chown proftp:wheel /ds/ftp/user/*
[127][root][/usr/ports/ftp/proftpd-mysql]# chmod 777 /ds/ftp/user/*
Код: Выделить всё
-- phpMyAdmin SQL Dump
-- version 3.1.1
-- http://www.phpmyadmin.net
--
-- Хост: localhost
-- Время создания: Янв 04 2009 г., 21:46
-- Версия сервера: 5.0.75
-- Версия PHP: 5.2.8
--
-- База данных: `proftpd`
--
-- --------------------------------------------------------
--
-- Структура таблицы `quotalimits`
--
CREATE TABLE IF NOT EXISTS `quotalimits` (
`name` varchar(30) 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=MyISAM DEFAULT CHARSET=cp1251;
--
-- Структура таблицы `quotatallies`
--
CREATE TABLE IF NOT EXISTS `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(10) unsigned NOT NULL,
`files_out_used` int(10) unsigned NOT NULL,
`files_xfer_used` int(10) unsigned NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
--
-- Структура таблицы `users_table`
--
CREATE TABLE IF NOT EXISTS `users_table` (
`unic_id` int(11) NOT NULL auto_increment,
`username` varchar(20) NOT NULL,
`password` varchar(20) NOT NULL,
`groupname` varchar(24) NOT NULL,
`uid` int(11) NOT NULL,
`gid` int(11) NOT NULL,
`homedir` varchar(50) NOT NULL,
`shell` varchar(20) NOT NULL,
`last_login` int(15) NOT NULL,
`login_count` int(15) NOT NULL,
`last_err_login` int(15) NOT NULL,
`err_login_count` int(15) NOT NULL,
PRIMARY KEY (`unic_id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 COMMENT='Таблица пользователей';
--
-- Структура таблицы `xfer_errors`
--
CREATE TABLE IF NOT EXISTS `xfer_errors` (
`unic_id` int(32) NOT NULL auto_increment,
`timestamp` int(15) NOT NULL,
`user_name` varchar(64) NOT NULL,
`file_and_path` tinytext NOT NULL,
`client_name` varchar(127) NOT NULL,
`client_IP` varchar(15) NOT NULL,
`client_command` varchar(5) NOT NULL,
PRIMARY KEY (`unic_id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 COMMENT='Таблица ошибок при работе';
--
-- Структура таблицы `xfer_table`
--
CREATE TABLE IF NOT EXISTS `xfer_table` (
`unic_id` int(32) NOT NULL auto_increment,
`timestamp` int(15) NOT NULL,
`user_name` varchar(64) NOT NULL,
`file_and_path` tinytext NOT NULL,
`bytes` int(15) NOT NULL default '0',
`client_name` varchar(127) NOT NULL,
`client_IP` varchar(15) NOT NULL,
`client_command` varchar(5) NOT NULL,
`send_time` varchar(9) NOT NULL default '0',
PRIMARY KEY (`unic_id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 COMMENT='Таблица, чё приняли-передали';
Код: Выделить всё
INSERT INTO `users_table` (`unic_id`, `username`, `password`, `groupname`, `uid`, `gid`, `homedir`, `shell`, `last_login`, `login_count`, `last_err_login`, `err_login_count`) VALUES
(1, 'ad', 'lamer', 'ad', 1001, 1001, '/ds/ftp/user/admin', '/sbin/nologin', 0, 0, 0, 0),
(2, 'proftpd', '', 'proftp', 1002, 1002, '/ds/ftp/guest', '/sbin/nologin', 0, 0, 0, 0);
Код: Выделить всё
INSERT INTO `quotalimits` (`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`) VALUES
('proftp', 'user', 'false', 'hard', 1.04858e+08, 0, 0, 0, 0, 0);
Код: Выделить всё
unic_id: уникальный номер
username: имя пользователя
password: пароль
groupname: группа
uid: uid
gid: gid
homedir: домашний каталог
shell: наличие шелла
last_login: последний вход
login_count: количество входов
last_err_login: последний неудачный вход
err_login_count: количество неудачных входов
Код: Выделить всё
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 = нет лимита
Код: Выделить всё
# /usr/local/etc/rc.d/proftpd start
Еще выложи пожалуйста настройки своей оболочки. Интересно взглянуть.Sun писал(а):Кстати к статье позже выложу еще одно приложение,это веб интерфейс управления, там включина статистика + управления квотами и учетками,написано на ajax. Понимаю что это от части может и сизифов труд,но все же,я делаю полностью под себя,так как мне удобно,может кому даже пригодиться
Код: Выделить всё
# $FreeBSD: src/etc/root/dot.cshrc,v 1.30 2007/05/29 06:37:58 dougb Exp $
#
# .cshrc - csh resource script, read at beginning of execution by each shell
#
# see also csh(1), environ(7).
#
alias h history 25
alias j jobs -l
alias la ls -a
alias lf ls -FA
alias ll ls -lA
# A righteous umask
umask 22
set path = (/sbin /bin /usr/sbin /usr/bin /usr/games /usr/local/sbin /usr/local/bin $HOME/bin)
setenv EDITOR ee
setenv PAGER more
setenv BLOCKSIZE K
if ($?prompt) then
# An interactive shell -- set some stuff up
set prompt = "%{\33[32m%}%B[%m][`id -u -n`][%~]#%b"
set autolist = TAB
set filec
set history = 100
set savehist = 100
set mail = (/var/mail/$USER)
if ( $?tcsh ) then
bindkey "^W" backward-delete-word
bindkey -k up history-search-backward
bindkey -k down history-search-forward
endif
endif