Руководство FreeBSD
Пред. | Глава 14. Безопасность | След.

# 14.6. TCP Wrappers

Написал: Tom Rhodes.

Каждый, кто знаком с inetd(8), возможно когда-то слышал о TCP Wrappers. Но немногие полностью понимают их полезность в сетевой среде: большинство используют брандмауэр. Хотя его применимость очень широка, есть вещи, с которыми брандмауэр не может работать, такие как отправка текста обратно вызывающей стороне. Программное обеспечение уровня TCP может делать это и многое другое. В следующих нескольких разделах обсуждаются многие возможности TCP Wrappers, и, когда это необходимо, даются примеры настроек.

Программное обеспечение TCP Wrappers расширяет возможность `inetd` по поддержке каждого даемона. С ним становится возможным протоколирование, возврат сообщений вызывающей стороне, ограничение подключений внутренней сетью и т.п. Хотя некоторые из этих возможностей могут быть реализованы брандмауэром, TCP Wrappers не только предоставляют дополнительный уровень защиты, но и дают больше контроля над системой, чем это возможно с брандмауэром.

Расширенная функциональность обработчиков TCP не может заменить хороший сетевой экран. Тем не менее, обработчики TCP могут использоваться совместно с сетевым экраном и другими средствами обеспечения информационной безопасности, обеспечивая тем самым дополнительный уровень защиты системы.

Поскольку рассматривается расширение к настройкам `inetd`, предполагается, что читатель ознакомился с разделом о настройке inetd.

> Замечание: Хотя программы, запускаемые из inetd(8), на самом деле не соответствуют термину ''даемоны'', существует традиция называть их именно так. Этот термин и используется в данном разделе.

## 14.6.1. Начальная настройка

Единственное требование для использования TCP Wrappers в FreeBSD это наличие в `rc.conf` параметров запуска `inetd` `-Ww`; это настройки по умолчанию. Конечно, ожидается также наличие правильной настройки `/etc/hosts.allow`, но syslogd(8) отправит сообщения в системный протокол если что-то не так.

> Замечание: В отличие от других реализаций TCP Wrappers, использование `hosts.deny` не поддерживается. Все параметры настройки должны быть помещены в `/etc/hosts.allow`.

В простейшей конфигурации, политика подключения сводится к разрешению или блокированию в зависимости от параметров в `/etc/hosts.allow`. Настройка в FreeBSD по умолчанию заключается в разрешении подключения к любому даемону, запущенному из `inetd`. Изменение этого поведения будет обсуждаться только после рассмотрения базовой настройки.

Базовая настройка обычно принимает форму `daemon : address : action`, где `daemon` это имя даемона, который запускается `inetd`. В поле `address` может находиться имя хоста, IP адрес, или IPv6 адрес, заключенный в квадратные скобки ([ ]). Поле action может принимать значения allow или deny, чтобы соответственно разрешать или запрещать доступ. Помните, что поиск правил производится до первого совпадения. При обнаружении совпадения применяется соответствующее правило и поиск прерывается.

Существуют и другие параметры, но они будут описаны в следующих разделах. Простая конфигурация может быть, например, такой: для разрешения соединений по протоколу POP3 к даемону `mail/qpopper`, в `hosts.allow` необходимо добавить следующие строки:

    # This line is required for POP3 connections:
    qpopper : ALL : allow

После добавления этой строки, `inetd` необходимо перезапустить. Это можно выполнить командой kill(1) или скриптом `/etc/rc.d/inetd` с параметром `restart`.

## 14.6.2. Расширенная конфигурация

У TCP Wrappers имеются дополнительные параметры; они дают дополнительные возможности контроля над соединениями. Иногда бывает полезно возвращать комментарий определенным хостам или при подключении к определенным даемонам. В других случаях может быть необходимо добавить запись в лог файл, или отправить письмо администратору. В определенных ситуациях сервис должен использоваться только для локальных соединений. Все это возможно с использованием параметров c шаблонами, символами подстановки и путем выполнения внешних команд. Следующие два раздела посвящены этим типам настроек.

### 14.6.2.1. Внешние команды

Предположим ситуацию, в которой соединение должно быть запрещено, а о причине необходимо сообщить вызывающей стороне. Как это можно сделать? Соответствующую возможность предоставляет параметр `twist`. При попытке подключения выполняется команда или скрипт, заданный этим параметром. Пример дан в файле `hosts.allow`:

    # The rest of the daemons are protected.
    ALL : ALL \
            : severity auth.info \
            : twist /bin/echo "You are not welcome to use %d from %h."

В этом примере сообщение, ''You are not allowed to use `daemon` from `hostname`.'' будет возвращено от всех даемонов, которые не были предварительно настроены в файле доступа. Обратите внимание, что возвращаемое сообщение должно быть заключено в кавычки; из этого правила нет исключений.

> Внимание: Возможна реализация DoS атаки, когда группа атакующих производит множество запросов на подключение.

Возможно также использование параметра `spawn`. Как и параметр `twist`, параметр `spawn` подразумевает запрет соединения и может использоваться для запуска команд или скриптов. В отличие от `twist`, `spawn` не отправляет ответ вызывающей стороне. Например, следующая конфигурация:

    # We do not allow connections from example.com:
    ALL : .example.com \
            : spawn (/bin/echo %a from %h attempted to access %d >> \
              /var/log/connections.log) \
            : deny

отклонит все попытки соединения из домена `*.example.com`; имя хоста, IP адрес и даемон протоколируются в файл `/var/log/connections.log`.

Помимо приведенных выше символов подстановки, например %a, существует еще несколько символов. Обратитесь к странице hosts_access(5) справочной системы за полным списком.

### 14.6.2.2. Параметры - шаблоны

До этого момента в примерах использовался шаблон `ALL`. Существуют и другие параметры, функциональность которых в дальнейшем может быть расширена. `ALL` соответствует любому даемону, домену или IP адресу. Другой доступный шаблон это `PARANOID`, который соответствует хосту, IP адрес которого может быть подделан. Другими словами, `paranoid` может быть использован для определения действия с хостами, IP адрес которых не соответствует имени хоста. Вот пример применения этого параметра:

    # Block possibly spoofed requests to sendmail:
    sendmail : PARANOID : deny

В этом примере все запросы на подключения к `sendmail` от хостов, IP адрес которых не соответствует имени хоста, будут отклонены.

> Предостережение: Использование `PARANOID` невозможно, если у клиента или сервера неправильно настроен DNS. В таких случаях необходимо вмешательство администратора.

Более подробная информация о шаблонах и их возможностях дана на странице hosts_access(5) справочной системы.

Для того, чтобы любая выбранная конфигурация заработала, в `hosts.allow` необходимо закомментировать первую строку настройки. В начале раздела об этом не упоминалось.

Пред. | Начало | След.
Одноразовые пароли | Уровень выше | KerberosIV

Этот, и другие документы, могут быть скачаны с ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

По вопросам, связанным с FreeBSD, прочитайте документацию прежде чем писать в <questions@FreeBSD.org>.
По вопросам, связанным с этой документацией, пишите <doc@FreeBSD.org>.
По вопросам, связанным с русским переводом документации, пишите в рассылку <frdp@FreeBSD.org.ua>.
Информация по подписке на эту рассылку находится на сайте проекта перевода.