Настройка Proftpd на Debian 5.0.0

Задача: необходимо настроить ftp-сервер для маленькой, но очень гордой компании, которая не хочет делиться своими файлами со всякими анонимусами.

Итак, корнем ftp-свалки у нас будет /usr/ftp , в котором есть: каталог /usr/ftp/boss - здесь директор хранит свои файлы, никто кроме него не должен иметь возможности не только записи в этот каталог, но даже заходить в него; /usr/ftp/office - каталог для файлов менеджера(ов), где они могут делать что хотят, но всё, что в нём есть, доступно boss-у для чтения; точно так же, каталог /usr/ftp/accountancy для бухгалтеров, и тут шеф может подглядывать; и наконец /usr/ftp/incoming - здесь уже могут все вышеперечисленные юзеры вытворять всё что хотят, даже удалять то, что туда записано другим юзером.

Реализовать данную схему на vsftpd у меня не вышло, поэтому был взят proftpd по причине большей гибкости конфигурации.
Конфиг почти что дефолтный, основная фишка - в настройке прав доступа к конкретным директориям.

# cat /etc/proftpd/proftpd.conf:

Include /etc/proftpd/modules.conf

UseIPv6         off
IdentLookups         off

ServerName         "ProudProds"
ServerType         standalone
ServerIdent         off

DefaultServer         on
ShowSymlinks         on

TimeoutNoTransfer         600
TimeoutStalled         600
TimeoutIdle         1200

DisplayChdir         .message true
ListOptions         "-l"

DenyFilter         \*.*/

Port         21

MaxInstances         175

User         proftpd
Group         nogroup

Umask         022         022
AllowOverwrite         on
RequireValidShell         no

TransferLog         /var/log/proftpd/xferlog
SystemLog         /var/log/proftpd/proftpd.log
# Здесь мы подкрутим формат лога - заведем ещё один лог-файл с "человеческим" форматом
LogFormat         custom "%t [pid %P] [%u] from ip: %a %m %f [transferred %b bytes for %T seconds]"
ExtendedLog         /var/log/proftpd/transfer.log    read,write    custom

# Modules

<IfModule mod_quotatab.c>
     QuotaEngine off
</IfModule>

<IfModule mod_ratio.c>
     Ratios off
</IfModule>

<IfModule mod_delay.c>
     DelayEngine on
</IfModule>

<IfModule mod_ctrls.c>
     ControlsEngine      off
     ControlsMaxClients      2
     ControlsLog      /var/log/proftpd/controls.log
     ControlsInterval      5
     ControlsSocket      /var/run/proftpd/proftpd.sock
</IfModule>

<IfModule mod_ctrls_admin.c>
     AdminControlsEngine off
</IfModule>

# Define Virtual users and their permissions

DefaultRoot         /usr/ftp
AuthUserFile         /etc/proftpd/ftpd.passwd
AuthGroupFile         /etc/proftpd/ftpd.group

<directory         /usr/ftp>
        <limit READ DIRS>
                Order allow,deny
                AllowGroup proudprods
                DenyAll
        </limit>
        <limit WRITE>
                DenyAll
        </limit>
</directory>

<directory         /usr/ftp/boss>
        <limit READ WRITE DIRS>
                Order allow,deny
                AllowUser boss
                DenyAll
        </limit>
</directory>

<directory         /usr/ftp/incoming>
        <limit READ WRITE DIRS>
               AllowAll
        </limit>
</directory>

<directory         /usr/ftp/accountancy>
        <limit WRITE>
               Order allow,deny
               AllowUser accountant
               DenyAll
        </limit>
        <limit READ DIRS>
               Order allow,deny
               AllowUser accountant
               AllowUser boss
               DenyAll
        </limit>
</directory>

<directory         /usr/ftp/office>
        <limit WRITE>
               Order allow,deny
               AllowUser office
               DenyAll
        </limit>
        <limit READ DIRS>
               Order allow,deny
               AllowUser office
               AllowUser boss
               DenyAll
        </limit>
</directory>

А вот здесь у меня есть вопросы - так как наши юзеры виртуальные, то какими должны быть UID и GID в данном файле? У меня проставлены соотв. UID демона proftpd и "виртуальный" GID "виртуальной" группы proudprods; оно так работает, но это еще не значит, что так правильно...

# cat /etc/proftpd/ftpd.passwd
boss:$1$HASHOFPASSWD1:106:2000::/usr/ftp:/bin/false
accountant:$1$HASHOFPASSWD2:106:2000::/usr/ftp:/bin/false
office:$1$HASHOFPASSWD3:106:2000::/usr/ftp:/bin/false

# cat /etc/proftpd/ftpd.group
proudprods:x:2000:boss,office,accountant

Для создания 2-х данных файлов использовалась утилита ftpasswd из пакета proftpd:

# ftpasswd --passwd --file=/etc/proftpd/ftpd.passwd --name=boss --shell=/bin/false --home=/usr/ftp --uid=106 --gid=2000
# ftpasswd --group --file=/etc/proftpd/ftpd.group --name=proudprods -m boss -m office -m accountant --gid 2000

# chmod 400 /etc/proftpd/ftpd.passwd /etc/proftpd/ftpd.group
# chown proftpd:nogroup /etc/proftpd/ftpd.passwd /etc/proftpd/ftpd.group

Изменить пароль ftp-юзера:
# cd /etc/proftpd
# ftpasswd --passwd --change-password --name=username

P.S.
Хотелось бы отметить, что без помощи дядьки ViEm (vm@lifec0re) я б долго мучилсо с логом, ибо прошляпил, что для задания LogFormat необходима директива ExtendedLog. См. http://www.proftpd.org/docs/directives/linked/config_ref_LogFormat.html

P.P.S. Важное дополнение!
С версией пакета 1.3.1-17lenny2 возникли некоторые проблемы, а именно: при создании Windows-пользователем директории с кириллическим именем, или при аплоаде файла с кириллическим именем на сервер, вылез старый баг с буквой "я". Забить на этот баг - невозможно, ибо аудиторией этого FTP-сервера будет именно небольшая пачка виндюков... Поэтому пришлось собрать из исходников версию 1.3.2, о чём и речь в этом примечании.
Итак, скачивается тарбол с www.proftpd.org , распаковываем его, переходим в директорию ./proftpd-1.3.2 , и выполняем:

# ./configure --prefix=/usr --sysconfdir=/etc/proftpd --enable-nls && make && make install

После проверяем, где эта зараза хочет видеть свои конфиги, и с какими модулями она собралась:
# /usr/sbin/proftpd -V
Теперь правим конфиг - добавим в него волшебную директиву (см. http://www.proftpd.org/docs/modules/mod_lang.html )

<IfModule mod_lang.c>
     UseEncoding utf8 cp1251
</IfModule>

Ещё пришлось закомментировать в /etc/proftpd/proftpd.conf строку "Include /etc/proftpd/modules.conf", ибо демон отказывался стартовать, мАтивируя тем, что он знать не знает директивы "ModulePath /usr/lib/proftpd" в файле /etc/proftpd/modules.conf

UPD.

Правильный ответ на вопрос "Какими должны быть UID и GID вирт. пользователей FTP?" примерно таков:

Для наших офисных ребят, которым FTP нужен как файлосвалка, UID=106, GID=65534 (соответствует определенному в конфиге proftpd.conf

User      proftpd
Group      nogroup

)
Для вебмастеров хостящихся на этом же сервере сайтов более подходит UID и GID 33 (соответствует пользователю www-data и такой же группе, под которыми работает вебсервер apache).

Соответственно, пришлось немного переделать конфиг proftpd:
директиве DefaultRoot возвращаем то значение, которое было по умолчанию, а именно:

DefaultRoot      ~

Для нового пользователя webmaster1 запись в /etc/proftpd/ftpd.passwd выглядит так:

webmaster1:$1$HASHOFPASSWDNN:33:33::/var/www/site1:/bin/false

и соотв. в /etc/proftpd/ftpd.group появляется запись

www-data:x:33:webmaster1

Естественно, не забываем добавить в /etc/proftpd/proftpd.conf описание директории /var/www/site1

<Directory      /var/www/site1>
     <Limit READ WRITE DIRS>
         Order allow,deny
         AllowUser webmaster1
         DenyAll
     </Limit>
</Directory>