Модуль поддержки tcpwrappers для nginx

Использование libwrap для контроля доступа

 — система контроля доступа, используемая для ограничения доступа к серверам на UNIX-подобных операционных системах (, BSD). Контроль доступа может осуществляться, например, по имени хоста (полному или частичному), адресу, подсети. Подробности приведены здесь.

TCP Wrappers очень удобно использовать с программами для защиты от червей (BlackHosts, DenyHosts, Fail2ban), в частности, для защиты от HTTP-сканирования.

Огромным достоинством TCP Wrappers является возможность динамической конфигурации списков контроля доступа (что избавляет от необходимости перезапускать защищаемый сервис) и простота файлов конфигурации (это субъективно).

К сожалению, не поддерживает TCP Wrappers из коробки. К счастью, это можно исправить.

Заказчик, для которого писался данный модуль, не возражал против выкладывания исходного кода модуля в общий доступ, чем я и воспользовался.

Прежде, чем перейти непосредственно к модулю, отмечу, что у TCP Wrappers есть несколько особенностей дизайна, о которых нужно знать:

  • самое большое моё разочарование заключается в том, что (библиотека, реализующая функциональность TCP Wrappers) не является библиотекой с потоковой безопасностью (thread safety). Иными словами, если два потока одновременно обратятся к libwrap, результат может получиться весьма странным. Это связано с тем, что libwrap использует нереентера́бельные (какое слово! но по-английски звучит лучше) функции, например, strtok(), gethostbyname(), gethostbyaddr() и т.п. Если nginx собран с поддержкой многопоточности, то на нагруженных серверах использование libwrap может привести к потерям производительности (из-за того, что доступ к функциям libwrap должен быть последовательным — приходится использовать мьютекс). Если же nginx собирался без поддержки многопоточности (как, например, в Linux), то такая проблема не возникает;
  • динамическая конфигурация списков контроля доступа имеет свою цену: при каждом запросе будут читаться и разбираться файлы /etc/hosts.allow и /etc/hosts.deny, что на высоконагруженных серверах может быть неприемлемо.

Сборка модуля

Переходим непосредственно к модулю. Так как nginx не поддерживает динамические модули, nginx придётся пересобирать из исходного кода. Предполагая, что исходный код nginx находится в ~/nginx, исходный код модуля  — в ~/nginx/ngx_tcpwrappers, выглядеть это всё будет примерно так:

[-]
View Code Bash
cd ~/nginx
./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

Вложения:

Автор: ; опубликовано в: C/C++, nginx, Администрирование, Безопасность; метки: C/C++, libwrap, Linux, nginx, ngx_tcpwrappers, TCP Wrappers, безопасность
10
Окт
2009

RSS Комментарии к статье «Модуль поддержки tcpwrappers для nginx» (2)  »

  1. Для тех, кто умеет пользоваться bzr: самая последняя версия кода находится в bzr://bzr.sjinks.pro/ngx_tcpwrappers/trunk

Пожалуйста, не используйте эту форму для комментирования! Данная форма предназначена исключительно для ботов.

Оставить комментарий к записи «Модуль поддержки tcpwrappers для nginx»

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Оставляя комментарий, вы выражаете своё согласие с Правилами комментирования.

Подписаться, не комментируя

गते गते पारगते पारसंगते बोधि स्वाहा