Как установить ProFTPd в Debian 6.0.1

Статья “Как установить ProFTPd в Debian 6.0.1 «Squeeze» GNU/Linux” первая, в цикле из трёх статей о самых популярных FTP серверах для Linux, как вы уже догадались это ProFTPd, Pure-FTPd и vsftpd. Любая из трёх статей будет идеально подходить для Ubuntu Server. Я очень ценю Ubuntu Server как систему и считаю второй после Debian по стабильности, удобству в использовании и качеству, Wikipedia тому пример. Давайте ближе к FTP, думаю вы уже знакомы с ProFTPd или хотя бы слышали о нем, сервер прост в установке и настройке, но! Что-бы правильно его настроить, надо тщательно изучить директивы его конфигурационного файла и изучить несколько готовых примеров. Вы так же должны точно сформулировать цель для которой вам нужен FTP-сервер.

ProFTPd

ProFTPd — FTP-сервер для Linux и UNIX-подобных операционных систем. ProFTPd использует лишь один конфигурационный файл «proftpd.conf», который располагается по умолчанию в:
Linux — «/etc/proftpd/proftpd.conf»
FreeBSD — «/usr/local/etc/proftpd.conf»

Сервер может быть настроен для работы нескольких виртуальных хостов, также поддерживает chroot. Может быть запущен в виде отдельного сервера (демона) или в составе суперсервера inetd. Также поддерживает IPv6.

Сервер поддерживает модули добавляющие SSL/TLS шифрование, аутентификацию через LDAP, работу с SQL, туннелирование соединений через SSH. «Родная» поддержка Microsoft Windows отсутствует. Имеет графический фронтенд gProFTPd.

По материалам Wikipedia — свободная энциклопедия.

Установка ProFTPd сервер на Debian

Убедитесь, что ProFTPd есть в ваших репозиториях:

aptitude search proftpd
aptitude search proftpd

Установить как всегда просто:

sudo aptitude install proftpd
sudo aptitude install proftpd

Настройка ProFTPd сервера в Debian

Запуск сервера и остановка только “грубым” методом:

sudo /etc/init.d/proftpd restart
sudo /etc/init.d/proftpd restart

Как вы уже знаете вся настройка сервера проходит через один файл:

sudo nano /etc/proftpd/proftpd.conf
sudo nano /etc/proftpd/proftpd.conf

Теперь нужно определиться с тем, как мы хотим использовать наш сервер.

Структура сервера

В моем случае:
1) Анонимный доступ на сервер –>
Т.е. любой пользователь введя IP-адрес или доменный адрес попадает в специально созданное окружение (анонимный отсек на сервере) где он имеет определенную структуру папок. Все окружение имеет атрибут READ (только чтение и ничего больше), и только одна папка uploads/ имеет атрибут STOR, т.е. она доступна для записи в нее файлов, при этом удаление файлов запрещено, так же как и их перемещение или переименование.

2) Авторизированный вход на сервер –>
Любой пользователь который имеет аккаунт на сервер может ввести логин/пароль и попасть в свое личное окружение, которое доступно только ему одному, в данном окружение он имеет те же права, что и на сервере, т.е. в своем окружении пользователь хозяин.

3) Необходимые ограничения –>
Все пользователи “заперты” внутри своего окружения и не могут пройти в каталог выше.
На загрузку файлов для всех пользователей, включая ananymous стоит жесткое ограничение, файл размером не более 1GB.
Максимальный размер директории каждого пользователя контролируется сервером (например каждому пользователю выделяется квота 10GB) установленный space-лимит пользователь превысить не может.
Максимальное количество соединений с ProFTPd-сервером указывается в конфигурационном файле, в моем случае это 10 пользователей одновременно максимум, любое последующие соединение будет сбрасываться с выводом ошибки указывающей, что лимит соединений превышен.
Вход на сервер от имени учетной записи root запрещен в целях безопасности.
Протокол IPv6 отключен.
Максимальное количество child processes ограничено 30-ью в целях безопасности.
В целях контроля ведутся логи

Реализация

Реализовать всё вышеописанное не сложно, хорошо зная значение директив. Вы можете ознакомиться с ними тут. Далее я приведу пример файла /etc/proftpd/proftpd.conf где я прокомментировал наиболее важные директивы на мой взгляд.

# /etc/proftpd/proftpd.conf -- Это конфигурационный файл сервера
 
# Подключить DSO модули
Include /etc/proftpd/modules.conf
 
# Отключить поддержку IPv6 протокола
UseIPv6             off
 
# Эта опция необходима в тех случаях, когда вы хотите использовать протокол (RFC1413) для 
# идентификации пользователя который соединился с сервером 
# Если опция включена, сильные задержки при соединении вам обеспечены!
IdentLookups            off
 
# Если вы НЕ хотите дать возможность нормальным пользователям присоединятся к серверу
# вы можете отключить эту опцию или закоментировать 
<limit LOGIN>
  AllowALL
</limit>
 
ServerName          "DebianFTP"
 
# Типа сервера 
# Может быть запущен в виде отдельного сервера (standalone) или в составе суперсервера inetd. 
ServerType          standalone
DeferWelcome            on
 
MultilineRFC2228        on
DefaultServer           on
ShowSymlinks            on
 
# опция указывает возможное время простоя соединения без выполнения каких либо действий 
# в секундах, по истечению указанного времени, сервер сбрасывает соединение 
TimeoutNoTransfer       300
TimeoutStalled          300
TimeoutIdle         2200
 
DisplayLogin                    fuck it ! 
DisplayChdir                .message true
ListOptions                 "-l"
 
DenyFilter          \*.*/
 
# Крайне важная опция! она "закрывает" каждого пользователя в его домашнем каталоге
# и не дает подняться на уровень выше 
DefaultRoot         ~ 
 
# Users require a valid shell listed in /etc/shells to login.
# Use this directive to release that constrain.
# RequireValidShell     off
 
# Указать порт (стандарт это 21)
Port                                21  
TimeoutLogin            20
 
# Важная опция! запрещаем root логин на сервер
RootLogin           off
 
# In some cases you have to specify passive ports range to by-pass
# firewall limitations. Ephemeral ports can be used for that, but
# feel free to use a more narrow range.
# PassivePorts                  49152 65534
 
# If your host was NATted, this option is useful in order to
# allow passive tranfers to work. You have to use your public
# address and opening the passive ports used on your firewall as well.
# MasqueradeAddress     1.2.3.4
 
# This is useful for masquerading address with dynamic IPs:
# refresh any configured MasqueradeAddress directives every 8 hours
<ifmodule mod_dynmasq.c>
# DynMasqRefresh 28800
</ifmodule>
 
# Важная опция! ограничивает количество "подпроцессов" (child processes) которые 
# которые могут быть запущены главным процессом в режиме standalone сервер
# предотвращает возможность DDoS атак на сервер
# без этой диррективы, ваш FTP сервер может превратиться в  fork-бомбу
MaxInstances            30
 
# Группа и юзер от которого запускается сервер
# User              proftpd
User                        nobody
Group               nogroup
 
# права доступа которые присваиваются новым файлам и директориям, по умолчанию 022 
Umask               022  022
 
# Разрешить перезапись файлов
AllowOverwrite          on
 
# Uncomment this if you are using NIS or LDAP via NSS to retrieve passwords:
# PersistentPasswd      off
 
# This is required to use both PAM-based authentication and local passwords
# AuthOrder         mod_auth_pam.c* mod_auth_unix.c
 
# Be warned: use of this directive impacts CPU average load!
# Uncomment this if you like to see progress and transfer rate with ftpwho
# in downloads. That is not needed for uploads rates.
#
# UseSendFile           off
 
# Количество попыток ввода пароль перед отсоединением 
MaxLoginAttempts        3
 
# Ограничить допустимый размер загружаемых файлов 
MaxStoreFileSize        1 Gb
 
# Ограничить допустимый размер скачиваемых файлов
MaxRetrieveFileSize     1 Gb
 
# Логи
TransferLog /var/log/proftpd/xferlog
SystemLog   /var/log/proftpd/proftpd.log
 
<ifmodule mod_quotatab.c>
QuotaEngine off
</ifmodule>
 
<ifmodule mod_ratio.c>
Ratios off
</ifmodule>
 
# Delay engine reduces impact of the so-called Timing Attack described in
# http://security.lss.hr/index.php?page=details&ID=LSS-2004-10-02
# It is on by default. 
<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>
 
#
# Alternative authentication frameworks
#
#Include /etc/proftpd/ldap.conf
#Include /etc/proftpd/sql.conf
 
#
# This is used for FTPS connections
#
#Include /etc/proftpd/tls.conf
 
#
# Useful to keep VirtualHost/VirtualRoot directives separated
#
#Include /etc/proftpd/virtuals.con
 
# ANONYMOUS
# Конфигурация для анонимного пользователя 
 
<anonymous ~ftp>
 
  # Разрешить соединение, даже если оно запрещено выше
  # т.е. данная директива работает только в рамках </anonymous><anonymous ~ftp>
   <limit LOGIN>
     AllowALL
   </limit>
 
  # Запретить WRITE везде в анонимном окружении (chroot)
  <limit WRITE>
    DenyAll
  </limit>
 
# Юзер и группа анонимуса   
User                ftp
Group                            ftp
# Group                 nogroup
 
# We want clients to be able to login with "anonymous" as well as "ftp"
UserAlias           anonymous ftp
 
# Запретить перезапись файлов для анонимус окружения
# даже если выше перезапись разрешалась
AllowOverwrite off
 
# Cosmetic changes, all files belongs to ftp user
DirFakeUser on ftp
DirFakeGroup   on ftp
 
RequireValidShell       off
 
# Максимальное количество анонимус соединений 
# + message
MaxClients          10 "Sorry, max %m users -- try again later"
 
# We want 'welcome.msg' displayed at login, and '.message' displayed
# in each newly chdired directory.
DisplayLogin            welcome.msg
DisplayChdir               .message
 
# upload директория на сервере, которая разрешает складирование и хранение файлов
# но не разрешает перезапись, удаление файлов или создания файлов в ней
  <directory uploads/*>
   <limit WRITE>
    DenyAll
   </limit>
 
   <limit STOR>
    AllowALL
   </limit>
  </directory>
</anonymous> 
# /etc/proftpd/proftpd.conf -- Это конфигурационный файл сервера

# Подключить DSO модули
Include /etc/proftpd/modules.conf

# Отключить поддержку IPv6 протокола
UseIPv6				off

# Эта опция необходима в тех случаях, когда вы хотите использовать протокол (RFC1413) для 
# идентификации пользователя который соединился с сервером 
# Если опция включена, сильные задержки при соединении вам обеспечены!
IdentLookups			off

# Если вы НЕ хотите дать возможность нормальным пользователям присоединятся к серверу
# вы можете отключить эту опцию или закоментировать 
<limit LOGIN>
  AllowALL
</limit>

ServerName			"DebianFTP"

# Типа сервера 
# Может быть запущен в виде отдельного сервера (standalone) или в составе суперсервера inetd. 
ServerType			standalone
DeferWelcome			on

MultilineRFC2228		on
DefaultServer			on
ShowSymlinks			on

# опция указывает возможное время простоя соединения без выполнения каких либо действий 
# в секундах, по истечению указанного времени, сервер сбрасывает соединение 
TimeoutNoTransfer		300
TimeoutStalled			300
TimeoutIdle			2200

DisplayLogin                    fuck it ! 
DisplayChdir               	.message true
ListOptions                	"-l"

DenyFilter			\*.*/

# Крайне важная опция! она "закрывает" каждого пользователя в его домашнем каталоге
# и не дает подняться на уровень выше 
DefaultRoot			~ 

# Users require a valid shell listed in /etc/shells to login.
# Use this directive to release that constrain.
# RequireValidShell		off

# Указать порт (стандарт это 21)
Port		     	                21	
TimeoutLogin 			20

# Важная опция! запрещаем root логин на сервер
RootLogin 			off

# In some cases you have to specify passive ports range to by-pass
# firewall limitations. Ephemeral ports can be used for that, but
# feel free to use a more narrow range.
# PassivePorts                  49152 65534

# If your host was NATted, this option is useful in order to
# allow passive tranfers to work. You have to use your public
# address and opening the passive ports used on your firewall as well.
# MasqueradeAddress		1.2.3.4

# This is useful for masquerading address with dynamic IPs:
# refresh any configured MasqueradeAddress directives every 8 hours
<ifmodule mod_dynmasq.c>
# DynMasqRefresh 28800
</ifmodule>

# Важная опция! ограничивает количество "подпроцессов" (child processes) которые 
# которые могут быть запущены главным процессом в режиме standalone сервер
# предотвращает возможность DDoS атак на сервер
# без этой диррективы, ваш FTP сервер может превратиться в  fork-бомбу
MaxInstances			30

# Группа и юзер от которого запускается сервер
# User				proftpd
User 				        nobody
Group				nogroup

# права доступа которые присваиваются новым файлам и директориям, по умолчанию 022 
Umask				022  022

# Разрешить перезапись файлов
AllowOverwrite			on

# Uncomment this if you are using NIS or LDAP via NSS to retrieve passwords:
# PersistentPasswd		off

# This is required to use both PAM-based authentication and local passwords
# AuthOrder			mod_auth_pam.c* mod_auth_unix.c

# Be warned: use of this directive impacts CPU average load!
# Uncomment this if you like to see progress and transfer rate with ftpwho
# in downloads. That is not needed for uploads rates.
#
# UseSendFile			off

# Количество попыток ввода пароль перед отсоединением 
MaxLoginAttempts 		3

# Ограничить допустимый размер загружаемых файлов 
MaxStoreFileSize		1 Gb

# Ограничить допустимый размер скачиваемых файлов
MaxRetrieveFileSize		1 Gb

# Логи
TransferLog /var/log/proftpd/xferlog
SystemLog   /var/log/proftpd/proftpd.log

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

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

# Delay engine reduces impact of the so-called Timing Attack described in
# http://security.lss.hr/index.php?page=details&ID=LSS-2004-10-02
# It is on by default. 
<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>

#
# Alternative authentication frameworks
#
#Include /etc/proftpd/ldap.conf
#Include /etc/proftpd/sql.conf

#
# This is used for FTPS connections
#
#Include /etc/proftpd/tls.conf

#
# Useful to keep VirtualHost/VirtualRoot directives separated
#
#Include /etc/proftpd/virtuals.con

# ANONYMOUS
# Конфигурация для анонимного пользователя 

<anonymous ~ftp>

  # Разрешить соединение, даже если оно запрещено выше
  # т.е. данная директива работает только в рамках </anonymous><anonymous ~ftp>
   <limit LOGIN>
     AllowALL
   </limit>

  # Запретить WRITE везде в анонимном окружении (chroot)
  <limit WRITE>
    DenyAll
  </limit>

# Юзер и группа анонимуса   
User				ftp
Group                            ftp
# Group			        nogroup

# We want clients to be able to login with "anonymous" as well as "ftp"
UserAlias			anonymous ftp

# Запретить перезапись файлов для анонимус окружения
# даже если выше перезапись разрешалась
AllowOverwrite off

# Cosmetic changes, all files belongs to ftp user
DirFakeUser	on ftp
DirFakeGroup   on ftp

RequireValidShell		off

# Максимальное количество анонимус соединений 
# + message
MaxClients			10 "Sorry, max %m users -- try again later"

# We want 'welcome.msg' displayed at login, and '.message' displayed
# in each newly chdired directory.
DisplayLogin			welcome.msg
DisplayChdir		       .message
 
# upload директория на сервере, которая разрешает складирование и хранение файлов
# но не разрешает перезапись, удаление файлов или создания файлов в ней
  <directory uploads/*>
   <limit WRITE>
    DenyAll
   </limit>

   <limit STOR>
    AllowALL
   </limit>
  </directory>
</anonymous> 

Вы можете скачать этот файл proftpd.conf
Скачать pdf-файл со списком всех дирректив мжно тут

Как вы могли заметить, анонимный юзер, это на самом деле юзер в системе с именем ftp, его нужно создать:

sudo adduser ftp
sudo adduser ftp

Закрыть ему shell:

sudo nano /etc/passwd
sudo nano /etc/passwd

запись должна выглядеть так (выделено синим цветом):
ftp:x:1001:1001:asd,asda,dsa,ads,asd:/home/ftp:/bin/false

Какие папки создавать, а какие нет – ваше дело. Я сделал так:
~/backup
~/dist
~/archives
~/docs
~/uploads — помним, что в эту папку пользователь может загружать файлы
Вы можете увидеть структуру папок на скриншотах ниже.

Это были настройки для анонимных пользователей, но выше я писал, что присоединится к серверу могут не только анонимы, но авторизированные пользователи, которые имеют аккаунты на сервере, это очень просто, вы создаете пользователя, назначаете ему логин и пароль, задаете домашний каталог и ставите необходимые ограничения:

sudo adduser mark
sudo adduser mark
sudo adduser tom
sudo adduser tom
sudo adduser jack
sudo adduser jack

Теперь любой из этих пользователей может присоединится к серверу введя свои логин/пароль, и попасть в свой домашний каталог, в котором он будет благополучно заперт, однако эти пользователи являются привилегированными, по этому они являются полными “хозяевами” своих окружений и только root может удалить их файлы или даже учетную запись.

После того как вы приведете конфигурационный файл к должному виду, создадите аноним-пользователя (дополнительных пользователей) и создадите структуру папок, перезапустите сервер:

sudo /etc/init.d/proftpd restart
sudo /etc/init.d/proftpd restart

И наслаждайтесь результатом.

Вход на сервер с аутентификацией:

FTP with login

FTP with login

Вход на сервер для анонима:

FTP Ananymous

FTP Ananymous

Если возникнут вопросы, задавайте!