Задача: необходимо настроить 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>