Настройка libwrap: /etc/hosts.allow и /etc/hosts.deny

05/11/2020

Как работают /etc/hosts.allow и /etc/hosts.deny? Все просто, вы вносите в эти файлы имя программы и хосты с которых доступ к программе будет разрешен или запрещен. Порядок такой: сначала срабатывают разрешительные правила в /etc/hosts.allow и, если совпадений не было найдено, то система перейдет в /etc/hosts.deny для поиска правил, блокирующих соединение. Если нигде не было найдено совпадений, доступ разрешается.

Однако этот механизм постепенно выходит из моды и перестает поддерживаться многими дистрибутивами. Причин для этого много

Причина 1. Преимущества перед файрволлами не очевидно. Слушаемый порт всегда заранее известен системному администратору, поэтому настроить фильтрацию по IP и порту не представляет труда. Зачем городить дублирующую функциональность?

Причина 2. Чтобы /etc/hosts.allow и /etc/hosts.deny заработали, ваша программа должна быть собрана с поддержкой libwrap - библиотеки, которая осуществляет парсинг этих файлов и соответственно принимает решение об открытии соединения, или его завершении. В консервативных операционных системах действительно многие программы собраны с поддержкой libwrap, но, как уже было сказано, ситуация меняется. Проверить, собрана ли ваша программа с поддержкой libwrap можно командой ldd

ldd /usr/sbin/sshd | grep libwrap

Если вывод непустой, то можете переходить к настройке /etc/hosts.allow и /etc/hosts.deny. В CentOS версии 7 sshd еще поддерживал libwrap, а в CentOS версии 8 уже нет. Также libwrap не поддерживается большинством пакетов, собранных для ArchLinux

Это ограничение сильно сужает круг программ, которые можно настроить, используя hosts.allow и hosts.deny. Ситуация, наверное была бы лучше, если бы libwrap был интегрирован в libc - библиотеку языка C, или сразу в ядро Linux, но он там нужен далеко не всем. См. причину 3

Причина 3. Функционально libwrap ограничен. Например, nginx и apache имеют дублирующую функциональность на уровне своих собственных файлов конфигурации, предоставляющую расширенные средства управления доступом, не ограничевающиеся лишь IP адресом клиента. Собирать такие программы с поддержкой libwrap вряд ли имеет практический смысл

Настройка libwrap, /etc/hosts.allow и /etc/hosts.deny

Если, не смотря ни на что, вы все равно решили настроить /etc/hosts.allow и /etc/hosts.deny, то сделать это можно, просто добавив записи в оба файла. Практика показывает, что лучшая стратегия - это размещение разрешенных узлов в /etc/hosts.allow и запрещение всех в /etc/hosts.deny.

# cat /etc/hosts.allow:
sshd : 192.168.0.0/24

# cat /etc/hosts.deny:
ALL : ALL

Такая комбинация разрешит подключение по SSH из сети 192.168.0.0/24 и никакой другой. Параметр "ALL" в /etc/hosts.deny - это специальное слово, означающее "все программы и все хосты". Очевидно, что такое правило срабатывает всегда независимо от того, нашлось ли совпадение в /etc/hosts.allow или нет. Есть и другие специальные слова, но круг их применения сильно ограничен.

На заметку: старайтесь избегать указания имен хостов вместо адресов, так как это может вызвать существенную задержку в установлении соединения, если ваш DNS работает не очень хорошо

Стоит упомянуть, что и /etc/hosts.allow, и /etc/hosts.deny поддерживают дополнительные параметры, которые также разделяются двоеточием. Например, можно выполнить некоторую комманду, когда срабатывает правило

sshd : ALL : spawn /usr/bin/echo access attempt from %h >> /var/log/libwrap

Такой конфиг обеспечит логирование IP адреса клиента, когда правило найдет свое совпадение. В данном случае "spawn" означает выполнить команду дополнительно, не вмешиваясь в процесс основной программы. Если использовать "twist" вместо "spawn", основная программа будет подменена на указанную

Темы:

Добавить комментарий