Документация по ОС FreeBSD Пятница, 19.04.2024, 05:40
Приветствую Вас Гость | RSS
Меню сайта

Категории каталога
Apache [58]
DNS [25]
FTP [27]
Mail [74]
Samba [24]
Squid [46]
SSH [23]
VPN [35]
РРР [20]
Net [173]

Главная » Статьи » Сеть » FTP

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

 Создание юзера
#./ftpasswd --name artem --home /usr/proftp_shara/artem --uid 1002 
 --gid 1002 \
 --file /usr/local/etc/proftpd.passwd --shell /sbin/nologin --passwd

#./ftpasswd --name site --home /usr/local/www/inkom/files --uid 80 --gid 80 \
 --file /usr/local/etc/proftpd.passwd --shell /sbin/nologin --passwd

Смена пароля
#./ftpasswd --passwd --name=artem --change-password --not-previous-password \
 --file /usr/local/etc/proftpd.passwd

Создание групп
#ftpasswd --group --name=group-name --gid=group-id --member=user-member1 \
 --file /usr/local/etc/proftpd.passwd
 # --member=user-member2 ... --member=user-memberN

получим в /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/ports/distfiles/proftpd-1.3.3.tar.bz2 //contrib и берем перловский скрипт ftpquota.
Курим ман на офф сайте http://www.proftpd.org/docs/contrib/mod_quotatab.html и тут http://www.proftpd.org/docs/howto/Quotas.html
Используется две таблицы в первой лежат квоты, во второй лежит информация сколько сейчас занято.

В итоге у меня получилась так:  
/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 60123 60127
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 был удален файл закачаный больше квоты"

Скрипт /usr/local/etc/script/ezjail_exec_web02_proftp.sh
jail_id=`jls |grep web02.k.dp.ua | cut -c 4-8 -`
/usr/sbin/jexec $jail_id /usr/local/etc/rc.d/proftpd $1

Список доп литературы
http://www.proftpd.org/docs/contrib/ftpasswd.html
http://www.proftpd.org/docs/contrib/mod_quotatab.html
http://www.proftpd.org/docs/howto/Quotas.html
http://linux.yaroslavl.ru/docs/serv/ProFTPD.html
http://www.lissyara.su/articles/freebsd/programms/proftpd+mysql/
http://www.opennet.ru/base/net/proftpd_setup.txt.html
http://www.opennet.ru/base/net/adv_proftpd.txt.html
http://uvsw.narod.ru/project/proftpd.html
http://www.opennet.ru/base/net/proftpd_mysql_quota.txt.html
http://unixforum.org/index.php?showtopic=107132



Источник: http://www.lissyara.su/articles/freebsd/programms/proftpd_quota_and_auth_from_file/
Категория: FTP | Добавил: oleg (02.05.2010) | Автор: gonzo111
Просмотров: 2028 | Рейтинг: 0.0/0 |
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Форма входа

Beastie

Друзья сайта

Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
links

Copyright MyCorp © 2024