Брандмауэры и специальное программное обеспечение 8 Часть 4

Вид материалаРеферат

Содержание


Использование демонов и символьных шаблонов
Клиенты, образцы и имена узлов
Формы и операторы
Подобный материал:
1   ...   53   54   55   56   57   58   59   60   ...   101

Использование демонов и символьных шаблонов


В первом поле записи файла/etc/hosts.allow содержится список демонов, разделенных пробелами и/или запятыми (можно использовать любой из этих символов). Имя демона должно быть таким, под каким он известен в системе, например, in.telnetd в случае OpenLinux. Если сетевой узел обладает несколькими IP-адресами, для идентификации демона следует использовать формат демон@узел, благодаря чему вы сможете различать различные сетевые карты, установленные на сетевом узле. Вы также можете использовать символьные шаблоны. К ним относятся:

- ALL: универсальное соответствие (все демоны/узлы);

- LOCAL: соответствует узлам, чьи имена не содержат в себе символ точки, например foo или baz;

- UNKNOWN: соответствует любому пользователю, чье имя неизвестно, или любому узлу, чье имя или адрес неизвестны;

- KNOWN: соответствует любому известному пользователю, а также любому узлу, для которого известен как адрес, так и имя;

- PARANOID: соответствует любому узлу, для которого имя не соответствует адресу.


Обратите внимание, что корректное использование шаблонов KNOWN и UNKNOWN связано с DNS. Если система DNS недоступна, эти шаблоны могут работать неправильно. То же самое относится и к PARANOID: если система DNS недоступна, имя сетевого узла не будет соответствовать его адресу и соединение будет разорвано.


ПРИМЕЧАНИЕ

Если DNS недоступна и вы используете UNKNOWN, вы получите соответствие с сетевым узлом, в то время как этого соответствия быть не должно. При этом остальные записи также будут обработаны некорректно: программа просто проигнорирует их, так как первое встреченное соответствие завершает поиск. Таким образом, формируя набор правил, будьте осторожны, старайтесь формировать правила так, чтобы совпадение не возникало тогда, когда вы этого не хотите. Обратитесь также к разделам tcpdchk и tcpdmatch далее в данной главе.

Клиенты, образцы и имена узлов


Во второй колонке записи содержится список имен сетевых узлов, IP-адресов, образцов (см. далее) или шаблонов.

Образец — это часть имени или IP-адреса сетевого узла. Образцы могут быть двух видов: начинающиеся на точку и заканчивающиеся на точку.

Представьте, что ваша система (foo) использует следующую таблицу сетевых узлов:

192.168.0.1 foo.void.org foo 192.168.0.2 bar.void.org bar 192.168.0.3 baz.void.org baz

В этом случае вы можете использовать образец .void.org, который будет соответствовать трем системам: foo, bar и baz в домене void.org. Если же вы уберете из образца самый первый символ (точку), тогда ему будет соответствовать только один узел с именем void.org, однако такого узла не существует. Подобным же образом вы можете указать образец 192.168.0. (обратите внимание, что в конце стоит символ точки). Этому образцу будут соответствовать все сетевые узлы с IP-адресами, начинающимися на 192.168.0.

Символьные шаблоны, которые можно использовать в колонке демонов, могут использоваться также и в колонке клиентов.

Формы и операторы


Если вы хотите обозначить диапазон IP-адресов, вы можете использовать формат сеть/сетевая_маска, например, если вы укажете 192.168.0.0/255.255.255.128, это будет соответствовать адресам от 192.168.0.0 до 192.168.0.127. Чтобы идентифицировать единственный узел, вы можете использовать тот же самый формат: запись 192.168.0.64/255.255.255.255 соответствует единственному узлу с адресом 192.168.0.64.

Наконец, в качестве образца можно использовать комбинацию символа «@» и имени сетевой группы (используется только для клиентов). Такой формат образца применяется только совместно с NIS. Имя сетевой группы чувствительно к регистру символов.


ПРИМЕЧАНИЕ

Сетевая группа — это механизм, используемый совместно с NIS, поэтому вы можете использовать его только в случае, если вы используете NIS. Сетевая группа выполняет такие же функции, как и обычная группа Unix, однако используется в отношении домена NIS.

В составе списков демонов и клиентов можно использовать оператор EXCEPT (за исключением). Операторы EXCEPT можно вкладывать друг в друга, однако при этом вы должны быть особенно внимательны. Выражение a EXCEPT b EXCEPT с означает (a EXCEPT (b EXCEPT с)). Таким образом, прежде чем использовать подобные операторы, необходимо освежить и проверить ваши знания в области булевой арифметики. Для того чтобы быть полностью уверенным в правильности выражений, я рекомендую вам использовать скобки.

Два основных параметра, которые можно использовать в составе записи файла /etc/hosts.allow, это ALLOW (разрешить) и DENY (запретить). Другие допустимые параметры рассматриваются далее в данной главе.

Правила

Теперь вы обладаете знаниями, достаточными для того, чтобы создать несколько базовых правил:

ALL : LOCAL, .void.org EXCEPT david@bar.void.org : ALLOW

ALL EXCEPT in.telnetd : david@bar.void.org : ALLOW

in.ftpd : ALL : ALLOW ALL :

ALL : DENY

Рассмотрим эти правила по порядку одно за другим, начиная с самого верхнего. Именно в таком порядке они обрабатываются программой TCP Wrappers. Первое правило относится ко всем демонам (в первой колонке стоит ALL). Таким образом, оно действует в отношении всех портов, прослушиваемых метадемоном inetd, для которых этот метадемон запускает tcpd. Так как метка ALL в данном случае обозначает все демоны, первая часть данного правила всегда будет соответствовать всем демонам, совместно с которыми используется tcpd. Однако раздел правила, в котором определяются клиенты, соответствует только локальным адресам, а также всем узлам из домена void.org за исключением пользователя david, который использует для подключения узел bar из домена void.org. Получается не так уж и много адресов. Для всех этих адресов доступ разрешен, так как в первой колонке параметров указан параметр ALLOW (разрешить). В соответствии с этим правилом локальные пользователи, а также пользователи сетевых узлов домена void.org (за исключением пользователя david, работающего с компьютером bar из домена void.org) смогут подключиться к любому из работающих в данной системе демонов, запуск которых осуществляется с использованием tcpd. Исключение составляет пользователь david@bar.void.org. Для него это правило не действует, и если он попытается подключиться к данной системе, для него программа tcpd продолжит обработку правил файла /etc/hosts.allow.


ПРИМЕЧАНИЕ

В последнем абзаце мы обсуждали только демоны, запускаемые с использованием tcpd из файла / etc/inetd.conf. Однако другие демоны, откомпилированные с использованием библиотеки libwrap (библиотека TCP Wrappers), также будут обращаться к данному списку правил, как если бы их вызов осуществлялся бы при помощи tcpd с использованием inetd.

Если при попытке подключения клиента обнаружено совпадение с первым правилом, доступ разрешается, просмотр файла /etc/hosts.allow прекращается и обработка остальных правил не производится. Если же правило не соответствует либо демону, либо клиенту (например, если клиент не является локальным или не принадлежит домену void.org, или является пользователем david, пытающимся подключиться к системе с узла bar в домене void.org), система переходит к обработке следующего правила. Второе правило относится ко всем демонам за исключением демона telnet. В этом правиле определяется совсем короткий список клиентов — лишь один печально известный пользователь david компьютера bar в домене void.org. Если этот пользователь пытается подключиться к любому демону, за исключением telnet, доступ для него открыт (ALLOW). Если же нет (он намерен соединиться именно с telnet), данное правило для него не действует. В этом случае система переходит к обработке следующего правила.

Третье правило относится только к демону FTP. Если подключающийся клиент пытается соединиться с демоном FTP, значит, доступ для него разрешен, кем бы он ни был (в колонке клиентов указана метка ALL). Иными словами, абсолютно всем клиентам разрешается доступ к вашему FTP-узлу.

Последнее правило соответствует всем демонам и всем клиентам и запрещает доступ (DENY). Обработка этого правила выполняется только для пользователя david, работающего с компьютером bar в домене void и пытающегося подключиться к службе telnet, а также для всех клиентов, не входящих в домены LOCAL и void.org, пытающихся подключиться к любому демону, не являющемуся демоном FTP.

Надеюсь, вы овладели основами настройки TCP Wrappers с использованием файла /etc/hosts.allow. Теперь посмотрим, какими дополнительными возможностями позволяет воспользоваться этот файл.

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

Например, директива spawn позволяет выполнить команду оболочки в качестве одного из параметров правила. Эта директива никак не влияет на взаимодействие между клиентом и сервером, так как потоки stdin, stdout и stderr направлены в устройство /dev/null. Наиболее общее использование этой директивы описывается в электронной документации man:

spawn (/path/to/safe_finger -l @%h | /usr/bin/mail root) &

Эта команда посылает пользователю root электронное сообщение, в котором содержатся результаты выполнения команды safe_finger в отношении подключающейся системы (символьные расширения будут рассмотрены позднее). Эту команду можно использовать совместно с DENY — таким путем вы создадите ловушку, которая будет срабатывать в отношении некоторой службы, доступ к которой вы запретили для внешних клиентов. Не следует использовать такой прием совместно с демоном finger. Дело в том, при попытке получить сведения об удаленном узле с использованием finger этот удаленный узел может точно так же попытаться запустить finger, чтобы получить сведения о вашем узле, а ваш узел опять же попытается вновь запустить finger, и так до бесконечности, а точнее, до тех пор, пока у одного из вас не закончатся ресурсы.


ПРИМЕЧАНИЕ

Информацию, полученную с использованием finger, нельзя считать достоверной. Помните о том, что злоумышленник, пытающийся получить доступ к службам, работающим на вашей системе, может делать это с использованием другой взломанной им системы или применяя подделку IP-адреса (spoofing).

В рассмотренном ранее примере мы могли бы модифицировать третье по счету правило следующим образом:

in.telnetd : david@bar.void.org : spawn (/usr/sbin/safe_finger -l @%h \ | /usr/bin/mail root) & : DENY

В результате пользователь root будет получать сообщение по электронной почте каждый раз, когда пользователь david@bar.void.org будет пытаться подключиться к telnet. Эту строку необходимо добавить сразу же после второй строки в файл /etc/hosts.allow.

Обратите внимание, что длинные правила, такие как рассмотренное, можно разместить на двух строках. Для этого в конце первой строки следует разместить символ обратной косой (\), как это показано в примере. Символ обратной косой является признаком продолжения строки.

Второй способ выполнения команды оболочки основан на использовании директивы twist. Отличие между spawn и twist состоит в том, что spawn перенаправляет все потоки данных в /dev/null, в то время как twist перенаправляет все потоки данных обратно клиенту. Можно использовать, например, следующую директиву:

in.ftpd : ... : twist /bin/echo 608 Message to client

Данная строка вместо того, чтобы запустить демон ftpd, пересылает клиентам, удовлетворяющим правилу in.ftpd, текст «608 Message to client» (этот текст, естественно, можно заменить на любой другой). Директива twist должна быть самой последней в строке.

В качестве одного из параметров записи файла /etc/hosts.allow можно использовать также следующие директивы: keepalive, linger, rfc931, banner, nice, setenv, umask и user. Вот их предназначение:

- keepalive (без аргументов) — сервер периодически пересылает клиенту пакет подтверждения соединения (keepalive packet). Если клиент не отвечает, сервер разрывает соединение. Такой режим полезен в случае, если вы имеете дело с пользователями, которые выключают свои компьютеры, не удосуживаясь корректно разорвать соединение с сервером;

- linger <количество_секунд> — длительность времени, в течение которого ядро продолжает попытки переслать данные клиенту, после того как соединение закрыто;

- rfc931 [таймаут в секундах] — осуществляет запрос пользовательского имени в соответствии с RFC 931. Используется только совместно с TCP. Если клиент не использует IDENT или аналогичную службу идентификации RFC 931 (большинство PC не обладают такой службой), при подключении такого клиента к службе возникает заметное подвисание. Количество секунд в директиве можно не указывать, в этом случае будет использовано значение, по умолчанию заданное внутри исходного кода;

- banners содержимое файла, расположенного в каталоге и обладающего таким же именем, как процесс демона (например in.telnetd для службы telnet) копируется клиенту. Внутри файла допускается использование символьных расширений (см. далее). Этот механизм применяется только совместно с соединениями TCP;

- nice [число] — изменяет значение nice (по умолчанию 10);

- setenv <имя значение> — используется для настройки переменных окружения для тех демонов, которые не переустанавливают свое окружение в момент запуска. При указании значения переменной окружения допускается использовать символьные расширения;

- umask < число > — похоже на переменную umask командной оболочки;

- user <пользователъ[.группа]> — назначает пользователя и (если она указана) группу, от лица которых запускается демон.