Ограничение доступа на сервере proftpd при помощи mod_wrap
Модуль 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/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 можно прочитать на