Модуль поддержки tcpwrappers для nginx
Использование libwrap для контроля доступа
TCP Wrappers — система контроля доступа, используемая для ограничения доступа к серверам на UNIX-подобных операционных системах (Linux, BSD). Контроль доступа может осуществляться, например, по имени хоста (полному или частичному), адресу, подсети. Подробности приведены здесь.
TCP Wrappers очень удобно использовать с программами для защиты от червей (BlackHosts, DenyHosts, Fail2ban), в частности, для защиты от HTTP-сканирования.
Огромным достоинством TCP Wrappers является возможность динамической конфигурации списков контроля доступа (что избавляет от необходимости перезапускать защищаемый сервис) и простота файлов конфигурации (это субъективно).
К сожалению, nginx не поддерживает TCP Wrappers из коробки. К счастью, это можно исправить.
Заказчик, для которого писался данный модуль, не возражал против выкладывания исходного кода модуля в общий доступ, чем я и воспользовался.
Прежде, чем перейти непосредственно к модулю, отмечу, что у TCP Wrappers есть несколько особенностей дизайна, о которых нужно знать:
- самое большое моё разочарование заключается в том, что
libwrap(библиотека, реализующая функциональность TCP Wrappers) не является библиотекой с потоковой безопасностью (thread safety). Иными словами, если два потока одновременно обратятся кlibwrap, результат может получиться весьма странным. Это связано с тем, чтоlibwrapиспользует нереентера́бельные (какое слово! но по-английски звучит лучше) функции, например,strtok(),gethostbyname(),gethostbyaddr()и т.п. Если nginx собран с поддержкой многопоточности, то на нагруженных серверах использованиеlibwrapможет привести к потерям производительности (из-за того, что доступ к функциямlibwrapдолжен быть последовательным — приходится использовать мьютекс). Если же nginx собирался без поддержки многопоточности (как, например, в Linux), то такая проблема не возникает; - динамическая конфигурация списков контроля доступа имеет свою цену: при каждом запросе будут читаться и разбираться файлы
/etc/hosts.allowи/etc/hosts.deny, что на высоконагруженных серверах может быть неприемлемо.
Сборка модуля
Переходим непосредственно к модулю. Так как nginx не поддерживает динамические модули, nginx придётся пересобирать из исходного кода. Предполагая, что исходный код nginx находится в ~/nginx, исходный код модуля ngx_tcpwrappers — в ~/nginx/ngx_tcpwrappers, выглядеть это всё будет примерно так:
./configure \
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
# здесь идут остальные параметры, передаваемые configure \
--add-module=./ngx_tcpwrappers
make
sudo make install
Конфигурация модуля
Директивы конфигурации:
Синтаксис: tcpwrappers [on|off]
По умолчанию: tcpwrappers off
Контекст: http, server, location, limit_except
Описание: данная директива разрешает либо запрещает использование TCP Wrappers для контроля доступа к ресурсу. tcpwrappers off полностью отключает использование TCP Wrappers, что позволяет избежать потерь производительности.
Синтаксис: tcpwrappers_daemon name
По умолчанию: tcpwrappers_daemon nginx
Контекст: http, server, location, limit_except
Описание: данная директива позволяет задать имя демона, которое используется в файлах /etc/hosts.{allow,deny} для идентификации процесса.
Синтаксис: tcpwrappers_thorough [on|off]
По умолчанию: tcpwrappers_thorough off
Контекст: http, server, location, limit_except
Описание: данная директива управляет тщательностью проверки клиента.
При tcpwrappers_thorough off используется функция hosts_ctl(3); контроль осуществляется исключительно по IP-адресу клиента (в том плане, что libwrap передаётся только IP-адрес).
При tcpwrappers_thorough on используется функция hosts_access(3); контроль может осуществляться по адресу и имени клиента и сервера. Данная проверка является более тщательной, но имеет свою цену: необходимость выполнения DNS-запросов для получения имени клиента и сервера.
Исходный код
Исходный код модуля ngx_tcpwrappers
Вложения:
- Исходный код модуля ngx_tcpwrappers (application/x-bzip)
Окт
2009
Комментарии к статье «Модуль поддержки tcpwrappers для nginx» (2) »
Пожалуйста, не используйте эту форму для комментирования! Данная форма предназначена исключительно для ботов.
Оставить комментарий к записи «Модуль поддержки tcpwrappers для nginx»
गते गते पारगते पारसंगते बोधि स्वाहा
Меня зовут Владимир, я программист-фрилансер, специализирующийся на Web-программировании и програмировании под Linux.
По совместительству занимаюсь администрированием LAMP/LNMP-серверов и техническим переводом.


Для тех, кто умеет пользоваться
bzr: самая последняя версия кода находится вbzr://bzr.sjinks.pro/ngx_tcpwrappers/trunkПроект переехал в Launchpad: https://launchpad.net/ngx-tcpwrappers