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.passwdartem:$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.htmlhttp://www.proftpd.org/docs/contrib/mod_quotatab.htmlhttp://www.proftpd.org/docs/howto/Quotas.htmlhttp://linux.yaroslavl.ru/docs/serv/ProFTPD.htmlhttp://www.lissyara.su/articles/freebsd/programms/proftpd+mysql/http://www.opennet.ru/base/net/proftpd_setup.txt.htmlhttp://www.opennet.ru/base/net/adv_proftpd.txt.htmlhttp://uvsw.narod.ru/project/proftpd.htmlhttp://www.opennet.ru/base/net/proftpd_mysql_quota.txt.htmlhttp://unixforum.org/index.php?showtopic=107132