Многие сисадмины предпочитают использовать бд postgreSQL для хранения данных и логов.Вот и все отличие данной статьи от статьи уважаемого автора lissyara proftp+mysql.Ну разве что немного расширена конфигурация.
5)Ставим из портов: Root>cd /usr/ports/ftp/proftpd/ Root>make config
[ ] IPV6 Use IPv6
[ ] LDAP Use LDAP
[ ] MYSQL Use MySQL
[X] POSTGRESQL Use Postgres
[ ] OPENSSL Include mod_tls
[X] QUOTA Include mod_quota
[ ] IFSESSION Include mod_ifsession
[X] README Include mod_readme
[X] RATIO Include mod_ratio
[X] REWRITE Include mod_rewrite
[X] WRAP Include mod_wrap
[ ] RADIUS Include mod_radius
root>make install clean
После инсталляции правим конфиг /usr/local/etc/proftpd.conf:
# имя сервера - показывается коннектящимся клиентам
ServerName "FTP server DNK"
# тип сервера standalone/inetd - сам или через inetd
ServerType standalone
# смысл следующей директивы такой: если клиент коннектится не на имя# а на IP или на виртуальный хост, не описанный в конфиге, то при# установке в `off` он получит отлуп, если же установлено `on` то# он будет обслужен `сервером по-умолчанию`
DefaultServer on
# файло где хранится инфа о сессиях#ScoreboardFile /var/run/proftpd.scoreboard# порт на котором работает сервер
Port 21# e-mail администратора (по идее для каждого ВиртуалХоста его можно# поставить разный - но я делаю один сервер без извращений с# виртуальными хостами)
ServerAdmin admin@dnk.ua
# Маска с которой создаются новые файлы (не совсем маска - маска получается# из этого значения, путём его вычитания из 777 - т.е. в даном случае получится# маска 755)Umask022# Максимальное число `детей` (работает только в standalohe режиме)# необходимо для защиты от атак типа `отказ в обслуживании` да и# от перегрузки сервера поможет
MaxInstances 30
CommandBufferSize 512# Юзер от которого работает сервер# группа, под которой работает серверUserftpGroupftp# Normally, we want files to be overwriteable.
AllowOverwrite on
# Директории
<Directory ~>
AllowOverwrite on
<Limit Write>
AllowAll
</Limit>
<Limit READ>
AllowAll
</Limit>
</Directory>
<Limit SITE_CHMOD>
DenyAll
</Limit>
##########################################################################Если нужен анонимный вход - раскоментируй##########################################################################<Anonymous ~ftp># User users# Group users### We want clients to be able to login with "anonymous" as well as "ftp"# UserAlias anonymous ftp### Limit the maximum number of anonymous logins# MaxClients 10### We want 'welcome.msg' displayed at login, and '.message' displayed### in each newly chdired directory.# DisplayLogin welcome.msg# DisplayFirstChdir .message### Limit WRITE everywhere in the anonymous chroot# <Limit WRITE># DenyAll# </Limit>#</Anonymous>#====================================================================================# Тип авторизации (на самом деле - в каком виде хрянятся# пароли в БД - в данном случае - открытым текстом)
SQLAuthTypes Plaintext
# Кого и как аутентифицируем - on - всех и вся :)# Но - если поставить `on` то он ломится в БД за группами.# мне группы никчему. Посему поставил `users`
SQLAuthenticate users
# инфа для соединения с PgSQL сервером:# имя_базы_данных@хост_где_PgSQL:порт имя_пользователя пароль
SQLConnectInfo proftp@localhost ftp# в каком порядке вернёт поля запрос - первое поле, это# имя таблицы, где лежат пользователи
SQLUserInfo users username password uid gid homedir shell
# должен ли быть у юзера (для того, чтобы он мог коннектится),# `реальный` shell описанный в /etc/shells
RequireValidShell off
# лог файл работы с SQL (после проверки работоспособности – закоментировать)
SQLLogFile /var/log/proftpd.log# Записываем удачные логины в БД.
SQLLog PASS counter_login
SQLNamedQuery counter_login UPDATE "\
last_login=date_trunc ( 'seconds' , timestamp without time zone 'now' ), \
login_count=login_count+1 WHERE \
username='%u'" users
# пишем неудачные логины в БД
SQLLog ERR_PASS counter_err
SQLNamedQuery counter_err UPDATE "\
last_error_login=date_trunc ( 'seconds' , timestamp without time zone 'now' ), \
login_error_count=err_login_count+1 WHERE \
username='%U'" users
# логируем что сохраняет и тащщит с сервера:# переменные# %u - имя пользователя (с которым залогинился)# %f - полный путь и имя файла который был скачан# %b - число байт, которые были скачаны# %h - имя клиента (из DNS), если не удалось разрешить - IP# %a - IP-адрес клиента# %m - имя команды полученной от клиента (RETR/STOR)# %T - время (секунд) ушедшее на передачу файла клиенту
SQLLog DELE,RETR,STOR, log_work
SQLNamedQuery log_work FREEFORM "\
INSERT INTO worklog (\
date,\
user_name,\
file_and_path,\
bytes,\
send_time,\
client_ip,\
client_name,\
client_command) \
VALUES(\
date_trunc ( 'seconds' , timestamp without time zone 'now' ),\
'%u','%f','%b','%T','%a','%h','%m')"
# записываем ошибки при сохранении и чтении файлов# (в одну строку не влезли - но работает и в таком виде :))
SQLLOG ERR_RETR,ERR_STOR,ERR_DELE,ERR_RMD,ERR_RNTO log_error
SQLNamedQuery log_error FREEFORM "\
INSERT INTO errorlog (\
date,\
user_name,\
file_and_path,\
bytes,\
send_time,\
client_ip,\
client_name,\
client_command) \
VALUES(\
date_trunc ( 'seconds' , timestamp without time zone 'now' ),\
'%u','%f','%b','%T','%a','%h','%m')"
# если вылезет проблема, типа тормозов при подключении# (в момент установления коннекта `задумывается` на 10-20 секунд)# то раскомментируйте следующие две строки#UseReverseDNS off#IdentLookups off# ВСЕ пользователи по ftp ограниченны# своей домашней директорией
DefaultRoot ~
# у меня хитрее сделано - себе я разрешил шариться по всему серверу# а остальных за`chroot`ил. Если, например, надо чтобы пользователи# могли по серверу шариться а анонимоусы нет, то надо указать !users# также можно указать определённую группу.#DefaultRoot ~ !ftp
MaxClients 55 "Слишком много соединений с сервером"
MaxClientsPerHost 24 "%m клиента уже подключены с Вашего хоста, больше не разрешено"
MaxLoginAttempts 3 "Слишком много попыток войти"
AccessDenyMsg "ATTENTION!!! ALL CONNECTIONS LOGED"
AccessGrantMsg "Now upload/download files"
DisplayGoAway "Go Away"
#Возможно определить с каких ip соединения допустимы или запрещены#UseHostsAllowFile /etc/proftpd.allow#UseHostsDenyFile /etc/proftpd.deny# Установим ограничения по времени#TimeoutIdle 180#TimeoutLogin 120#TimeoutNoTransfer 360#TimeoutStalled 640# Логи
SyslogLevel notice
UseReverseDNS off
#TransferLog /var/log/proftpd-tranfer.log#SystemLog /var/log/proftpd-error.log#ExtendedLog /var/log/proftpd-extended.log read,write