Мы — долго запрягаем, быстро ездим, и сильно тормозим.
www.lissyara.su —> статьи —> FreeBSD —> программы —> proftpd file auth&quota

Proftpd - квоты и авторизация из файлов. Мониторинг.

Автор: gonzo111.


  • Вступление
  • Авторизация из файла
  • Квоты в файлах
  • Прочее. Что такое class в proftpd
  • Прочее. ProFTPD и IPNAT
  • Прочее. Мониторинг proftpd в jail
  • Литература

      Вступление

    Написал короткую заметку дабы не забыть.
    Настраивал я недавно клетку для хостинга и понадобился мне в ней хороший 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

    
    dir1=/usr/jails/web02
    name=artem
     Создание юзера
    #./ftpasswd --name $name --home /usr/proftp_shara/$name --uid 1002 
          --gid 1002 \
          --file $dir1/usr/local/etc/proftpd.passwd --shell /sbin/nologin --passwd
    #mkdir -vp 755 ${dir1}/usr/proftp_shara/${name}
    #chown -v 1002:1002  ${dir1}/usr/proftp_shara/${name}
    
    
    #./ftpasswd --name $name --home /usr/local/www/inkom/files --uid 80 --gid 80 \
           --file $dir1/usr/local/etc/proftpd.passwd --shell /sbin/nologin --passwd
    
    Смена пароля
    #./ftpasswd --passwd --name=$name --change-password --not-previous-password \
            --file $dir1/usr/local/etc/proftpd.passwd
    
    Создание групп
    #ftpasswd --group --name=group-name --gid=group-id --member=user-member1 \
                   --file $dir1/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
    
    dir1=/usr/jails/web02
    name=artem
    Cоздание таблиц квоты(первый раз)
    #./ftpquota --create-table --type=limit \
                --table-path=$dir1/usr/local/etc/proftpd.quota.limittab
    
     во второй таблице хранится сколько сейчас закачано юзером мб
     опция QuotaOptions ScanOnLogin позволяет при логине пересчитать сколько 
     реально там есть МБ(пересчет замедляет вход(!))
    #./ftpquota --create-table --type=tally \
           --table-path=$dir1/usr/local/etc/proftpd.quota.tallytab
    
    создание квоты на юзера site,квота 15 мб
    ./ftpquota --name=$name --bytes-upload=15 --add-record --type=limit \
        --quota-type=user  --units=Mb --verbose \
        --table-path=$dir1/usr/local/etc/proftpd.quota.limittab
    
    
    Для изменения квоты юзера artem,квота 30 мб
    #./ftpquota --name=$name --bytes-upload=30 --update-record --type=limit  
                 --quota-type=user --units=Mb --verbose \
              --table-path=$dir1/usr/local/etc/proftpd.quota.limittab
    
    Удаление квоты
    #ftpquota --delete-record --type=limit --name=browsers --quota-type=user \
             --table-path=$dir1/usr/local/etc/proftpd.quota.limittab
    # очистка таблицы текщего занятого места
    #./ftpquota --delete-record --name=artem  --verbose --quota-type=user \
         --type=tally --table-path=$dir1/usr/local/etc/proftpd.quota.tallytab
    
    
    
    Просмотр текущей квоты для всех (или пользователя name)
    ./ftpquota --show-records  --units=Mb --type=limit \
            --table-path=$dir1/usr/local/etc/proftpd.quota.limittab \
            #| grep -A9 $name
    echo
    echo ===сколько сейчас занято========
    echo
    ./ftpquota --show-records  --units=Mb --type=tally \
             --table-path=$dir1/usr/local/etc/proftpd.quota.tallytab \
             #| grep -A9 $name
    

    --------— описание ключей ---------------
    квота по байтам
    #--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 , но у меня директива что то не захотела работать.

    Внимание! Модуль квот проверяет владельца файла и группы в соотвествии с системными UID/GUID, про виртуального владельца он  знать не знает. Поэтому при доступе с разными логинами на одну у ту же шару и выключеной опции ScanOnLogin возникают некоторые проблемы в квотах на ЮЗЕРА (USER):
    -если удалять чужие файлы с другого логина, но с системным UID таким же как у вас, то занятое место будет отниматься у вас, а у того вообще ничего не произойдет. В конце концов это приведет к тому, что у него якобы будет занято места больше(в tallytab), чем есть на самом деле(!).
    -если удалять чужие файлы с другого логина, владелец которых с другим системным UID, занятое место будет  правильно отниматься у чужого, притом фтп подумает, что владельцем файла есть тот, кто первый будет в списке proftpd.passwd (!) с таким UID.Та же история с разными системными группами...
    Как предупреждать админа о превышении квоты смотри раздел Мониторинг


      Прочее. Что такое class в proftpd

    Наборы адресов(IP,имена) можно обьеденять в классы и затем ставить для них квоты и различные права  
    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://www.proftpd.org/docs/directives/linked/config_ref_Class.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



    размещено: 2010-04-30,
    последнее обновление: 2010-05-19,
    автор: gonzo111


    MASiK, 2010-08-30 в 13:12:22

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

    Наверно всё таки
    /usr/local/etc/proftpd.group

    А в остальном хорошая статья )
    Всё работает спасибо )



  •  

      Этот информационный блок появился по той простой причине, что многие считают нормальным, брать чужую информацию не уведомляя автора (что не так страшно), и не оставляя линк на оригинал и автора — что более существенно. Я не против распространения информации — только за. Только условие простое — извольте подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой, незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
      Если соизволите поставить автора в известность — то вообще почёт вам и уважение.

    © lissyara 2006-10-24 08:47 MSK

    Время генерации страницы 0.0711 секунд
    Из них PHP: 46%; SQL: 54%; Число SQL-запросов: 77 шт.
    Исходный размер: 40140; Сжатая: 10016