Маленькие ньюансы при установке и настройке ProFTPD (на базе FreeBSD)

From: Андрей Лаврентьев <lavr@unix1.jinr.ru>
Original: http://unix1.jinr.ru/~lavr/
Subject: Маленькие ньюансы при установке и настройке ProFTPD

Автор: Андрей Лаврентьев (lavr@unix1.jinr.ru), http://unix1.jinr.ru/~lavr/


Маленькие ньюансы при установке и настройке ProFTPD (на базе FreeBSD):


1. Многие администраторы, прежде чем установить новый-свежий продукт,
проверяют его. В случае proftpd, либо должен быть остановлен
предыдущий демон ftpd, либо следует использовать директивы ниже, чтобы
демон слушал, например порт 8041:
Port 0
Bind 159.93.17.121
SocketBindTight on
Port 8041
* Port 0 - отказ от прослушивания 21'ого порта в сумме с нижними
директивами
* Bind 159.93.17.121 - привязка на конкретный ip
* SocketBindTight on - позволяет отказаться от открытия by-default
порта 21
* Port 8041 - командный порт, который будет слушать proftpd

2. В стандартный набор модулей ProFTPD (всегда включенных) входят
следующие:
* mod_auth - реализация таких команд как: USER, PASS, ACCT, REIN
* mod_core - реализация команд FTP: CWD, CDUP, MKD, PWD, RMD,
DELE...
* mod_log - реализация сбора статистики, syslog
* mod_ls - встроенная реализация команд FTP: LIST, NLST и STAT
* mod_site - встроенная реализация команд FTP: SITE, HELP и CHMOD
* mod_unixpw - интерфейс к password-auth OS Unix
* mod_xfer - реализация команд FTP: STOR, RETR, APPE, REST...

Модуль PAM подключается в том случае, если система имеет поддержку
pam:
* mod_pam - интерфейс к системе авторизации PAM (Pluggable
Authentication Modules)

Модуль для отображение фалов readme - директива "DisplayReadme"
* mod_readme

3. Дополнительные модули:
* mod_linuxprivs - реализация дополнительной схемы security POSIX
1e, только для Linux
* mod_quota - дисковые квоты
* mod_ratio - система реализации коэффициента upload/download
* mod_wrap - использование доступа с учетом ограничений tcp-wrappers

Дополнительные модули авторизации, интерфейс на основе DB:
* mod_ldap
* mod_sql
* mod_sql_mysql
* mod_sql_postgres

4. В ProFTPD реализована технология chroot не в полном смысле этого
понятия, а лишь частично, те позволяет нам в качестве корневой
директории сделать директорию реального пользователя или
ftp/anonymous.
Данная технология позволяет запускать демон proftpd под указанным в
настройках, директивы User и Group, пользователем с его uid/gid. А
также изменять "корневую директорию" с помощью директив:
* DefaultRoot - в конфигурации server config, ,
* <Anonymous root-directory> - в конфигурации server config,,

Так к примеру, мы можем за"chroot"ить всех локальных пользователей
указав в конфигурации серверной части:
DefaultRoot ~

5. Если у вас возникли проблемы с авторизацией anonymous или локальных
пользователей, с учетом директив User и Group, проверьте чтобы эти
пользователи не присутствовали в ftpusers или проверьте правильность
вашей конфигурации PAM в соответствии с рекомендациями из дистрибутива
ProFTPD или документацией PAM. Если ProFTPD собран с поддержкой pam,
для проверки, отключите его в конфигурации:
AuthPAM off
AuthPAMAuthoritative off

достаточно одной директивы AuthPAM off. Можно переопределить ресурс в
pam конфигурации с помощью директивы AuthPAMConfig.

Примечание: Читайте внимательно документацию, или посмотрите чем
инициализируется pamconfig в proftpd-sources/modules/mod_pam.c:
static char * pamconfig = "ftp";

Значит авторизационная конфигурация PAM для ProFTPD в /etc/pam.conf
или /etc/pam.d - будет именоваться ftp by default, а изменить ее
название можно с помощью AuthPAMConfig.

Проверку ftpusers можно отключить директивой UseFtpUsers off.
Дополнительно для безпарольного входа под anonymous или ftp,
воспользуйтесь директивами:
AnonRequirePassword off (значение по-умолчанию)
RequireValidShell off
UserAlias anonymous ftp

Иногда может вылезти несоответствие указанных внутри <Anonymous ~ftp>
значений User и Group и реальных uid/gid директории ~ftp и ее
содержимого.
Кроме того не забудьте проверить не установлены ли в конфигурациях
server и global:
<Limit LOGIN>
DenyAll
<Limit>

Если установлены, то в директиве <Anonymous> добавьте:
<Limit LOGIN>
Order Allow,Deny
Allow from ip-address1,...
Deny from all
<Limit>

или
<Limit LOGIN>
AllowAll
<Limit>

6. Чтобы предотвратить попытку положить или взломать демон proftpd
командой "ls */../*/../*/...", включите директиву фильтра DenyFilter
*.*/. Можно использовать эту директиву для дополнительной фильтрации.
Например:
DenyFilter *.*/

7. Если пользователи жалуются на длительную авторизацию - вход по ftp,
воспользуйтесь директивой UseReverseDNS off, дополнительно к ней можно
использовать директиву IdentLookups off.
Например:
UseReverseDNS off

или
UseReverseDNS off
IdentLookups off

8. Конкретный пример настройки ProFTPD во FreeBSD:

Лучший вариант, собрать proftpd из портов системы:
cd /usr/ports/ftp/proftpd
make
make install
rm -rf work

Если мы хотим собрать proftpd с нужными нам модулями, необходимо
посмотреть Makefile и при необходимости, поправить под свои нужды.
Пример сборки без поддержки PAM:
cd /usr/ports/ftp/proftpd
make WITHOUT_PAM=yes
make install
rm -rf work

Далее отредактировать файл конфигурации

/usr/local/etc/proftpd.conf
под свои нужды.

Допустим у нас имеется пользователь ftp с uid=ftp и gid=operator, а
запустить демон proftpd мы хотим с USER nobody и Group nogroup, тогда,
возможно придется сделать в секции Anonymous USER ftp и Group operator
(по-умолчанию во FreeBSD пользователь ftp имеет uid=ftp,
gid=operator).

Соответственно удалить из файла /etc/ftpusers пользователей с именами
nobody, ftp. Или, как вариант изменить uid/gid пользователя ftp на
uid=ftp и gid=ftp, не забыв создать группу ftp и поменять владельца
группы в директории ~ftp.

Пример рабочей конфигурации ProFTPD 1.2.4 в FreeBSD:
Примечание: демон стартует как nobody на порту 8041, в секции
Anonymous ~ftp, uid=ftp, gid=operator, домашняя директория
пользователей является корнем DefaultRoot ~.
* Файл конфигурации proftpd

9. Проверка правильности синтаксиса конфигурации и работы ProFTPD. Для
проверки правильности файла конфигурации, необходимо запустить демон
со следующими ключами:
./proftpd -t

Для определения с поддержкой каких модулей собран наш вариант proftpd,
необходимо запустить демон с ключами:
./proftpd -l

Для запуска демона в тестовом режиме, с выдачей диагностики на экран:
./proftpd -n -d 9 -c /path/proftpd.conf

где -n - указывает что мы запускаем демон в режиме foreground
-d 9 - указывает что в отладочном режиме с максимальным уровнем
отладки 9.
-c /path/proftpd.conf - указывает заданный файл конфигурации.
_________________________________________________________________

Copyleft Andrey Lavrentyev

_________________________________________________________________

Пример конфигурации:


# This sample configuration file illustrates configuring two
# anonymous directories, and a guest (same thing as anonymous but
# requires a valid password to login)

ServerName "ProFTPD Server"
ServerType standalone

# Port 21 is the standard FTP port.
Port 1021

# If you don't want normal users logging in at all, uncomment this
# next section
#<Limit LOGIN>
# DenyAll
#</Limit>

# Set the user and group that the server normally runs at.
#User root
#Group wheel
User nobody
Group nogroup

#--lavr/pam
#AuthPAMAuthoritative on
#PersistentPasswd on
#AuthPAM off
#AuthPAMConfig ftp

# To prevent DoS attacks, set the maximum number of child processes
# to 30. If you need to allow more than 30 concurrent connections
# at once, simply increase this value. Note that this ONLY works
# in standalone mode, in inetd mode you should use an inetd server
# that allows you to limit maximum number of processes per service
# (such as xinetd)
MaxInstances 10

# Set the maximum number of seconds a data connection is allowed
# to "stall" before being aborted.
TimeoutStalled 300

# We want 'welcome.msg' displayed at login, and '.message' displayed
# in each newly chdired directory.
DisplayLogin welcome.msg
DisplayFirstChdir .message

#
# Logging options
#
TransferLog /var/log/proftpd/xferlog
#
# Some logging formats
#
LogFormat default "%h %l %u %t "%r" %s %b"
#LogFormat auth "%v [%P] %h %t "%r" %s"
#LogFormat write "%h %l %u %t "%r" %s %b"

# Our "basic" anonymous configuration, including a single
# upload directory ("uploads")
#<Anonymous ~ftp>

<VirtualHost 159.93.17.121>

<Anonymous ~ftp>

#--lavr; this msg for <VirtualHost>, <Anonymous>, <Global>
AccessGrantMsg "Anonymous access granted for %u."

# User nobody
# Group nogroup

User ftp
Group operator

#--lavr don't check /etc/shells & ftp-shell
RequireValidShell off

#--lavr: AnonRequirePassword off for <Anonymous>, default=off
AnonRequirePassword off

#--lavr: AllowRetrieveRestart on [default] for <VirtualHost>, <Anonymous>, <Directory>

#--lavr: AnonRatio foo1 foo2 foo3 for <Directory>, <Anonymous>, <Limit>,.ftpaccess

#--lavr: Bind address for server config, <VirtualHost>
#--lavr: ByteRatioErrMsg foo1 foo2 foo3 for <Directory>, <Anonymous>, <Limit>,.ftpaccess
#--lavr: Class "name" limit|regex|ip value for server config, <VirtualHost>
# see example:
#Classes on
#Class local limit 100
#Class default limit 10
#Class local regex .*foo.com
#Class local ip 172.16.1.0/24
#
#--lavr: Classes on|off for server config, <VirtualHost>
#
#--lavr: DefaultQuota foo1 foo2 foo3 for <Directory>, <Anonymous>, <Limit>,.ftpaccess
#
#--lavr: DefaultRoot directory [group-expression] for server config, <VirtualHost>, <Global>
#--lavr: DefaultServer on|off for server config,<VirtualHost>
#
#--lavr: DeferWelcome on|off for server config, <VirtualHost>, <Global>
#
#--lavr: Deny ["from"] "all"|"none"|host|network[,host|network[,...]]
# for <Limit>
#
#--lavr: DenyAll for <Directory>, <Anonymous>, <Limit>
#
#--lavr: DisplayConnect filename - when connect
#
#--lavr: DisplayGoAway filename - when limit or deny
#%T Current Time
#%F Available space on file system
#%C Current working directory
#%R Remote host name
#%L Local host name
#%u Username reported by ident protocol
#%U Username originally used in login
#%M Max number of connections
#%N Current number of connections
#%E Server admin's e-mail address
#%x The name of the user's class
#%y Current number of connections from the user's class
#%z Max number of connections from the user's class
#
#--lavr: DisplayLogin filename for server config, <VirtualHost>, <Anonymous>
#
#--lavr: DisplayQuit filename for server config, <VirtualHost>, <Anonymous>
#
#--lavr: DisplayReadme filename or pattern for server config, <VirtualHost>, <Anonymous>
#
#--lavr: ExtendedLog filename [[command-classes] format-nickname] for
# server config, <VirtualHost>, <Anonymous>
# classes: NONE=No commands; AUTH=Authentication commands (USER, PASS)
# INFO=Informational commands (PWD, SYST, etc)
# DIRS=Directory commands (LIST, CWD, MKD, etc)
# READ=File reading (RETR)
# WRITE=File/directory writing or creation
# MISC=Miscellaneous commands (SITE, etc)
# ALL=default
#
#--lavr: FileRatioErrMsg foo1 foo2 foo3 for <Directory>, <Anonymous>, <Limit>,.ftpaccess
#
#--lavr: HostRatio foo1 foo2 foo3 for <Directory>, <Anonymous>, <Limit>,.ftpaccess
#
#--lavr: IdentLookups on|off for server config, <VirtualHost>, <Global>
# try to define remote-user name
#
#--lavr: <Limit command|command-group [command2 ..]> for
# server config, <VirtualHost>, <Directory>,<Anonymous>, <Global>, .ftpaccess
# command:
# CWD (Change Working Directory)
# MKD (MaKe Directory)
# RNFR (ReName FRom), RNTO (ReName TO
# DELE (DELEte)
# RMD (ReMove Directory)
# RETR (RETRieve)
# STOR (STORe)
# additional command-group:
# READ;WRITE;DIRS;ALL;LOGIN
#
#--lavr: LeechRatioMsg foo1 foo2 foo3 for <Directory>, <Anonymous>, <Limit>,.ftpaccess
#
#--lavr: LogFormat nickname "format-string"
# default: LogFormat default "%h %l %u %t "%r" %s %b"
#
#--lavr: LoginPasswordPrompt on|off for server config, <VirtualHost>, <Anonymous>,<Global>
#
#--lavr: MaxClients number|none [message] for server config, <Anonymous>, <VirtualHost>;<Global>
#
#--lavr: MaxClientsPerHost number|none [message]
# for server config, <Anonymous>, <VirtualHost>,<Global>
#
#--lavr: MaxInstances number - how many process-ftpd in standalone
#
#--lavr: MaxLoginAttempts number for server config, <VirtualHost>, <Global>
# how many attempts for login-authenticate
#
#--lavr: Order allow,deny|deny,allow for <Limit>
# examp: Order allow,deny:
# 1. Check Allow directives. If one or more apply, exit with result:
# ALLOW
# 2. Check Deny directives. If one or more apply, exit with result:
# DENY
# 3. Exit with default implicit ALLOW
# examp: Order deny,allow
# 1. Check Deny directives. If one or more apply, exit with result:
# DENY
# 2. Check Allow directives. If one or more apply, exit with result:
# ALLOW
# 3. Exit with default implicit: DENY
#
#--lavr: PersistentPasswd on|off see Guide
#
#--lavr: Port port-number for server config, <VirtualHost>
#
#--lavr: RateReadBPS byte_per_sec-number for server config, <VirtualHost>, <Anonymous>,<Directory>, <Global>
#
#--lavr: RateReadFreeBytes number of bytes for server config, <VirtualHost>, <Anonymous>,<Directory>, <Global>
#
#--lavr: RateReadHardBPS on/off for server config, <VirtualHost>, <Anonymous>,<Directory>, <Global>
#
#--lavr: RatioFile foo1 foo2 foo3 for <Directory>, <Anonymous>, <Limit>,.ftpaccess
#
#--lavr: Ratios foo1 foo2 foo3 for <Directory>, <Anonymous>, <Limit>,.ftpaccess
#
#--lavr: ServerIdent On|Off [identification string]
#
#--lavr: SocketBindTight on|off
#
#--lavr: SyslogFacility facility-level
# mode=AUTH[AUTHPRIV],CRON,DAEMON,KERN,LPR,MAIL,NEWS,USER,UUCP,LOCAL0,LOCAL1,LOCAL2,LOCAL3,LOCAL4,LOCAL5,LOCAL6,LOCAL7
#
#--lavr: SystemLog filename|NONE
#
#--lavr: TimeoutIdle seconds - default=600
#
#--lavr: TimeoutLogin seconds - default=300
#
#--lavr: TimeoutStalled seconds - default=0
#
#--lavr: TimeoutNoTransfer seconds - default=600
#
#--lavr: UseFtpUsers on|off - see /etc/ftpusers
#
#--lavr: UseReverseDNS on|off

# Allow logins if they are disabled above.
#--lavr: Allow ["from"] "all"|"none"|host|network[,host|network[,...]]
# see example, use in <Limit>
# <Limit LOGIN>
# Order Allow,Deny
# Allow from
# 128.44.26.,128.44.26.,myhost.mydomain.edu,.trusted-domain.org
# Deny from all
# </Limit>
#<Limit LOGIN>
#--lavr: AllowAll in <Directory>, <Anonymous>, <Limit>, .ftpaccess
# AllowAll
#</Limit>
<Limit LOGIN>
# Order allow,deny
# Allow from all
# Deny from .microsoft.com, .msn.com
AllowAll
</Limit>

# Maximum clients with message
MaxClients 10 "Sorry, max %m users -- try again later"

# User ftp
# Group ftp

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

# Limit WRITE everywhere in the anonymous chroot
<Limit WRITE>
DenyAll
</Limit>

# An upload directory that allows storing files but not retrieving
# or creating directories.
<Directory incoming/moviez/incoming/*>

# Normally, we want files to be overwriteable.
AllowOverwrite on

Umask 000

<Limit READ DIRS>
AllowAll
</Limit>

<Limit STOR MKD RMD>
AllowAll
</Limit>
</Directory>

<Directory incoming/raid/*>

# Normally, we want files to be overwriteable.
AllowOverwrite on

Umask 000

<Limit READ>
DenyAll
</Limit>

<Limit STOR MKD RMD>
AllowAll
</Limit>
</Directory>

</Anonymous>
</VirtualHost 159.93.17.121>

Добавить комментарий

Войти с помощью: