Ограничение доступа на сервере proftpd при помощи mod_wrap

Передо мной стояла следующая задача: ограничить доступ клиентов только с ip-адресов провайдера, в тоже время, в зависимости от логина, пускать некоторых клиентов с произвольных ip-адресов

[Сергей Великанов]

Помощь по установке модуля mod_wrap для ftp сервера proftpd для FreeBSD

Модуль mod_wrap позволяет гибко ограничивать доступ клиентов к ftp серверу в зависимости от их ip адреса или имени хоста. Правила могут храниться как в файлах (mod_wrap_file) так и в базе данных. (mod_wrap_sql)

Передо мной стояла следующая задача: ограничить доступ клиентов только с ip адресов провайдера, в тоже время в зависимости от логина пускать некоторых клиентов с произвольных ip адресов

Установка:

Скачиваем модуль mod_wrap (http://www.castaglia.org/proftpd/modules/proftpd-mod-wrap-2.0.2.tar.gz) После распаковки, необходимо запустить

    cd mod_wrap-2.0rc1
    ./configure
После этого копируем mod_wrap.h и все файлы с расширением .c в папку proftpd-dir/contrib/ ( по умолчанию во freebsd это будет /usr/ports/ftp/proftpd/work/proftpd-1.2.9/contrib если не переопределена переменная окружения WRKDIRPREFIX)

После этого переходим в директорию /usr/ports/ftp/proftpd и собираем proftpd c поддержкой mod_wrap и SQL

    make -DWITH_MYSQL --with-modules=mod_wrap:mod_wrap_file:mod_wrap_sql install
Проверяем что proftpd собрался с поддержкой mod_wrap
    /usr/local/libexec/proftpd -l
    Compiled-in modules:
      mod_core.c
      mod_xfer.c
      mod_auth_unix.c
      mod_auth_file.c
      mod_auth.c
      mod_ls.c
      mod_log.c
      mod_site.c
      mod_auth_pam.c
      mod_ratio.c
      mod_readme.c
      mod_wrap.c
      mod_wrap_sql.c
      mod_wrap_file.c
      mod_ifsession.c
      mod_sql.c
      mod_sql_mysql.c
После этого добавляем след строчки в конфиг (/usr/local/etc/proftpd.conf)

# Настройка подключения к sql базе
SQLConnectInfo proftpd@localhost:3306 xxx xxx

# Настройка mod_wrap
WrapEngine              on
WrapAllowMsg            "User '%u' allowed by access rules"
WrapDenyMsg             "User '%u' denied by access rules"
WrapLog                 /var/log/proftpd.wrap.log

# Описания запросов к sql базе
SQLNamedQuery get-allowed-clients SELECT "allowed FROM wrapallow WHERE name = '%{0}'"
SQLNamedQuery get-denied-clients SELECT "denied FROM wrapdeny WHERE name = '%{0}' or name = 'ALL'"

#Директива WrapUserTables предназначена для ограничений по пользователям, существуют также 
#директивы WrapGroupTables и WrapTables соответственно для ограничений по группам и ограничений для всех.
#Хотя в документации и показано что можно опускать имя пользователя в директиве  WrapUserTables на 
#самом деле это не так, поэтому я добавил !unknown что означает применять данные ограничения для всех пользователей 
#кроме пользователя unknown которого не существует на самом деле :)
WrapUserTables !unknown sql:/get-allowed-clients sql:/get-denied-clients
После этого создаем две таблицы в SQL базе
Allow table:
  CREATE TABLE wrapallow (
    name VARCHAR(30),
    allowed VARCHAR(255) NOT NULL
      );

Deny table:
  CREATE TABLE wrapdeny (
    name VARCHAR(30),
    denied VARCHAR(255) NOT NULL
      );
Добавляем записи в таблицы
INSERT INTO `wrapdeny` ( `name` , `denied` )  VALUES ('ALL', 'ALL EXCEPT 10.0.'); 
# Слово ALL означает что это выражения для всех пользователей, 
# ALL EXCEPT 10.0. означает что запретить доступ для всех кроме клиентов 
# с ip адресом 10.0.*.*

INSERT INTO `wrapallow` ( `name` , `allowed` )  VALUES ('vgray', '172.16.102.');
#Разрешить пользователю vgray доступ с сети 10.0.102.*
Более подробно о выражениях которые могут стоять в полях denied и allowed можно прочитать на http://www.castaglia.org/proftpd/modules/mod_wrap-2.0.html

Статья взята с сайта Opennet (www.opennet.ru).

[ опубликовано 31/07/2004 ]

Сергей Великанов - Ограничение доступа на сервере proftpd при помощи mod_wrap   Версия для печати