Proftpd - квоты и авторизация из файлов. Мониторинг [2010]
Вступление
Написал короткую заметку дабы не забыть. Настраивал я
недавно клетку для хостинга и понадобился мне в ней хороший ftp без
мускула. Выбор упал на proftpd- когда листаешь маны, то аж слюни текут
сколько он умеет всего делать.
uname -a
FreeBSD server.k123.dp.ua 6.4-RELEASE-p9 FreeBSD 6.4-RELEASE-p9 #1:
proftpd -v
ProFTPD Version 1.3.3
Итак ставим:
cd /usr/ports/ftp/proftpd
make install clean
[X] QUOTA Include mod_quota
Файловая авторизация
Мне надо было чтобы у FTP-пользователя не было реального shell и
FTP-сервер был бы прост в обслуживании. Proftpd поддерживает различные схемы
авторизации пользователей (через базы данных, PAM-модули, LDAP), мне нужно
авторизация через "альтернативный файл пользователей и паролей" (проще говоря
текстовый файл). Если в конфиге ничего не указывать про тип авторизации, то
используется системный passwd.
Создаем в системе юзера ftp без шелла
(/usr/sbin/nologin) от котрого будет работать proftpd. Затем добавляем в
proftpd.conf:
# Set the user and group under which the server will run.
User ftp
Group ftp
AuthUserFile /usr/local/etc/proftpd.passwd
AuthGroupFile /usr/local/etc/proftpd.group
RequireValidShell off # не проверять есть ли такой шелл на самом деле
DefaultRoot ~
<Directory ~>
AllowOverwrite on
<Limit Write>
AllowAll
</Limit>
<Limit READ>
AllowAll
#IgnoreHidden
</Limit>
#<Limit LOGIN>
#Allow test
#DenyAll
#</Limit>
</Directory>
Заходим в архив
/usr/ports/distfiles/proftpd-1.3.3.tar.bz2 //contrib и берем перловский скрипт
ftpasswd. Курим ман на офф сайте http://www.proftpd.org/docs/contrib/ftpasswd.html В итоге у
меня получилась такая шпаргалка
/usr/local/etc/scripts/Proftpd/proftpd_genpass.sh
получим в
/usr/local/etc/proftpd.passwd artem:$1$pqOzVW4E$NlCrBCSZ0G5sv1:1002:1002::
/usr/proftp_shara/artem:/sbin/nologin Смысл такой создается свой аналог
системного /etc/passwd в каталоге.Здесь сперва идет его имя, потом хэш пароля,ID
юзера (реального любого который есть в системе например нашего ftp),ID
группы(реальной группы),каталог куда будет доступ у этого юзера по фтп,пустой
шелл. Не забудьте создать эти каталоги и выставить права такие чтоб у этих ID
было право на запись. Таким образом на одного юзера системного можно назначить
кучу логинов proftp со своими каталогами и паролями. Полученый файл можно
свободно редактировать текстовым редактором, дополнительные файлы типа pwd.db
ему не нужны. По аналогии создается файл групп proftpd.group, аналог
/etc/group, в принципе его можно и руками
создать: test:*:1002: site:*:80:artem,petrov Название группы , ее ID,
список, кроме одноименного, юзеров которые туда входят.В принципе файл вообще
может быть пустым, он используется в конфигах самого proftp для установки
различных прав на целую группу юзеров. Утилита ftpwho позволит глянуть кто
сейчас залогинился.(для корректной работы проверьте чтоб было в конфиге
ScoreboardFile /var/run/proftpd.scoreboard)
Квоты в файлах
Квоты реализуются отдельным
модулем mod_quotatab, который умеет хранить квоты используя
файлы,LDAP,RADIUS,SQL.При сборке не забываем его указать - [X] QUOTA Include
mod_quota Добавляем в proftpd.conf
# config quotas
# ===========
QuotaEngine on # включить квоту
QuotaDirectoryTally on
QuotaDisplayUnits Mb
QuotaShowQuotas on
QuotaLimitTable file:/usr/local/etc/proftpd.quota.limittab
QuotaTallyTable file:/usr/local/etc/proftpd.quota.tallytab
QuotaLog /var/log/proftpd/quota.log
В итоге у меня получилась так:
/usr/local/etc/scripts/Proftpd/proftpd_quota.sh
Cоздание таблиц квоты(первый раз)
#./ftpquota --create-table --type=limit \
--table-path=/usr/local/etc/proftpd.quota.limittab
во второй таблице хранится сколько сейчас закачано юзером мб
опция QuotaOptions ScanOnLogin позволяет при логине пересчитать сколько
реально там есть МБ(пересчет замедляет вход(!))
#./ftpquota --create-table --type=tally \
--table-path=/usr/local/etc/proftpd.quota.tallytab
создание квоты на юзера site,квота 15 мб
./ftpquota --name=site --bytes-upload=15 --add-record --type=limit \
--quota-type=user --units=Mb --verbose \
--table-path=/usr/local/etc/proftpd.quota.limittab
Для изменения квоты юзера artem,квота 30 мб
#./ftpquota --name=artem --bytes-upload=30 --update-record --type=limit
--quota-type=user --units=Mb --verbose \
--table-path=/usr/local/etc/proftpd.quota.limittab
Удаление квоты
#ftpquota --delete-record --type=limit --name=browsers --quota-type=user \
--table-path=/usr/local/etc/proftpd.quota.limittab
Просмотр текущей квоты
./ftpquota --show-records --units=Mb --type=limit \
--table-path=/usr/local/etc/proftpd.quota.limittab
echo ===скоко сейчас занято========
./ftpquota --show-records --units=Mb --type=tally \
--table-path=/usr/local/etc/proftpd.quota.tallytab
--------— описание ключей --------------- квота по
байтам #--bytes-upload --bytes-download --bytes-xfer (скач/загружено
вместе)
квота по количеству файлов #--files-upload --files-download
--files-xfer (колич файлов скач/загруж вместе)
метод лимита
квоты #--limit-type "hard"(по умолчанию идет) -закачует на сервер пока есть
место, а потом удаляет последний закачивемый( или один большой)
файл, "soft" -разрешит закачать на сервер большой файл сверх квоты (!), а
следующий файл уже не даст
тип того, кто будет подвергатся
квотированию #--quota-type "user", "group", "class", или "all" (весь
сервак). # "group" все юзеры входящие в группу # "class" список IP
образуют класс
имя того кто будет квотироваться #--name имя записи
user/login name(логин), group name(имя группы), или class name(имя
класса) #или игнорируется если --quota-type all
#--verbose
писать лог
Глянуть сколько осталось квот можно тремя способами - как
указано выше, (для всех) запустив скрипт (ftpquota --show-records) -
залогинившись на ftp под нужным юзером и написать ftp>quote site quota, -
можно еще использовать сообщение при логине используя директиву DisplayLogin и
переменые модуля квот http://www.proftpd.org/docs/contrib/mod_quotatab.html, но у
меня директива что то не захотела работать. Как предупреждать админа о
превышении квоты смотри раздел Мониторинг
Прочее. Что такое class в proftpd
Наборы адресов
можно обьеденять в классы и затем ставить для них квоты и различные права
proftpd.conf: # <Class test1> # From 192.168.0.0/16 #
From !1.2.3.4 # From proxy.*.com # не забудте проверить работу днс
сервера и обратный ресолвинг тоже # From my.example.com #врубить
UseReverseDNS on # по умолчанию в класс попадет то значение что первее,
можно сказать между значения стоит "или" # Satisfy all #позволит проверять
все строки, можно сказать между значения ставит логическое "и" #
</Class>
можно использовать классы для доступа и для квот,а можно
и другие ограничения лепить если включен mod_ifsession # <Limit
ALL> #AllowClass DenyClass DisplayGoAway MaxClientsPerClass #
AllowClass internal # DenyAll # </Limit>
# <IfClass
!test1> # MaxClients 25 # </IfClass>
Прочее. ProFTPD и IPNAT
При использовании
IPNAT возникают некоторые трудности. Добавляюем в proftpd.conf
Port 21
# для IPNAT
# Restrict the range of ports from which the server will select when sent the
# PASV command from a client. Use IANA-registered ephemeral port range of
# 49152-65534
PassivePorts 6012360127
MasqueradeAddress kkkkk.dp.ua
Сколько портов укажите столько и будет одновременно
коннектов. kkkkk.dp.ua - ваше днс имя Добавляюем в ipnat.conf
rdr tun0 195.248.xx.xx/32 port 10077 -> 10.0.0.35 port 21 tcp
rdr tun0 195.248.xx.xx/32 port 60123 -> 10.0.0.35 port 60123 tcp
rdr tun0 195.248.xx.xx/32 port 60124 -> 10.0.0.35 port 60124 tcp
rdr tun0 195.248.xx.xx/32 port 60125 -> 10.0.0.35 port 60125 tcp
rdr tun0 195.248.xx.xx/32 port 60126 -> 10.0.0.35 port 60126 tcp
rdr tun0 195.248.xx.xx/32 port 60127 -> 10.0.0.35 port 60127 tcp
Прочее. Мониторинг proftpd в
jail Конфиг monit(в портах) /usr/local/etc/monitrc
check system k.dp.ua
if loadavg (1min) > 4 then alert
if loadavg (5min) > 2 then alert
if memory usage > 90% then alert
if cpu usage (user) > 95% then alert
if cpu usage (system) > 38% then alert
if cpu usage (wait) > 25% then alert
check device usr_fs with path /jail
if space usage > 80% for 5 times within 10 cycles then alert
# proftpd jail 10.0.0.35
check process proftpd_jail with pidfile \
/jail/web02.k.dp.ua/var/run/proftpd.pid
start program = "/usr/local/etc/script/ezjail_exec_web02_proftp.sh start"
stop program = "/usr/local/etc/script/ezjail_exec_web02_proftp.sh stop"
if failed host 10.0.0.35 port 21 protocol ftp with timeout 20 seconds then
restart
if 5 restarts within 8 cycles then timeout
# проверка первышения квот смотри логи в /usr/jails/web02.k.dp.ua
#/var/log/proftpd/quota.log
check file proftpd_quota_log with path
/usr/jails/web02.k.dp.ua/var/log/proftpd/quota.log
if match "removed" then exec "/usr/local/etc/script/sendxmpp В \
proftpd_jail был удален файл закачаный больше квоты"