Главная страница Карта Индекс Поиск Новости Архивы Ссылки О LF
[Top Bar]
[Bottom Bar]
[Фотография автора]
Javi Polo
Об авторе: Мне 18 лет и я многострадальный учащийся с экзаменами по каталанскому языку в сентябре. Моей страстью являются компьютеры, и я надеюсь поступить в UIB со специализацией в телекоммуникационных системах и основной специализацией в компьютерных науках. Мне нравится hardcore и я участвую в музыкальной группе Niko-Chan's Kingdom. Кроме этого мало что можно сказать, разве что у меня отличная подруга Xiska 0:)

Написать автору

Используем IPFWADM для управления TCPD и брандмауэрами

[Ilustration]

Аннотация: В этой статье очень кратко описывается процесс конфигурации сервисов inetd, позволяющий улучшить безопасность вашей системы. В качестве основного средства администрирования и настройки сервисов inetd рассматривается IPFWADM.




Прежде чем начать, хотелось бы пояснить, что такое inetd. В самых общих словах это демон, который управляет сервисами, предоставляемыми системой хостам, подключенным через сеть. Может оказаться, что в какой-нибудь системе inetd не сконфигурирован на управление всеми сервисами по умолчанию, поэтому прежде всего нужно посмотреть /etc/inetd.conf и узнать, какими сервисами он управляет (строки, которые начинаются не с символа "#"). Самым первым советом будет не включать больше сервисов, чем действительно требуется, поскольку это самый лучший способ предотвратить атаки, основанные на ошибках в демонах, которые мы не используем. Я предполагаю, что у читателя есть под рукой копия его inetd.conf, поэтому хотел бы объяснить, что означают некоторые вещи.

Например, строка:
ftp stream tcp nowait root /usr/sbin/tcpd in.ftpd -l -a

Первое слово -- это имя предлагаемого сервиса (в этом случае "ftp", и мы можем проверить файл /etc/services, к какому порту он подключен).

Второе поле -- тип открытого сокета, могут быть: stream (как в этом примере), dgram, raw, rdm и seqpacket.

Следующее поле представляет собой используемый протокол. Он должен быть объявлен в файле /etc/protocols, как в нашем первом примере, где протокол TCP должен быть уже объявлен в этом файле.

После протокола идет поле wait/nowait. Оно всегда должно быть nowait, за исключением типа сокета datagram (dgram). Для последнего типа сокетов мы должны указать nowait в случае, если сервер поддерживает множественные триды (threads) или wait, если сервер поддерживает один трид. Причина заключается в том, что в мультитридовых системах сервер, получивший запрос, запускает новый процесс, затем освобождает сокет с тем, чтобы inetd мог продолжать прием новых запросов, поэтому используется nowait. В случае однотридовой системы мы должны указать wait потому, что сервер всегда висит на одном и том же сокете и не может запускать соединения отдельными процессами. Более того, существует один вариант, когда мы должны указать nowait.50 -- 50 означает максимальное количество демонов, которые могут быть запущены (или запросов, которые могут быть приняты, с какой точки зрения посмотреть) за одну минуту. По умолчанию стоит 40.

Пятое поле указывает имя пользователя, который запускает демона, в этом примере ftp запущен пользователем root.

Шестое и дальнейшие поля являются запускаемыми программами, за которыми следуют параметры, передаваемые программе. В приведенном примере запускается демон tcpd и в качестве аргумента демон in.ftpd и параметры -l -a. Далее идет самая интересная часть этого раздела, рассмотрение TCPD.

Начнем. tcpd -- это демон, который фильтрует запросы и выполнняет те или иные действия в зависимости от того, какой демон необходимо запустить в ответ на запрос сервиса с IP адреса. Эти решения основаны на конфигурационных файлах /etc/hosts.allow и /etc/hosts.deny.

В принципе, /etc/hosts.deny используется для указания тех, кому отказано в праве пользоваться сервисами сервера и в /etc/hosts.allow указываются те, кто имеет доступ к сервисам.

Формат обоих файлов следующий:
ДЕМОН: IP[: ОПЦИЯ1 [: ОПЦИЯ2 ]]

где ДЕМОН может быть демоном, который необходимо запустить, как указанный в примере in.ftpd, или это может быть предопределенная константа ALL, означающая всех демонов.

IP может быть или определеным IP адресом, URL, диапазоном IP адресов (или URL), или могут быть указаны любые обобщенные образцы, о которых я расскажу позже.

Чтобы указать диапазон IP адресов, мы можем написать: `123.32.' Такая запись означает все адреса 123.32.XXX.XXX; точно также можно указать диапазон URL как `.ml.org', который означает все поддомены ml.org

Более традиционной формой задания IP адресов является АДРЕС/МАСКА. В этом случае, например диапазон от 127.0.0.0 до 127.0.255.255 задается как 127.0.0.0/255.255.0.0.

Теперь обобщенные образцы:
ALL означает любое возможное значение
LOCAL совпадает с любым именем без "."
UNKNOWN означает любую машину, чье имя или IP адрес неизвестен
KNOWN означает любую машину, у которой известны и имя и IP адрес
PARANOID представляет те машины, у которых имя не совпадает с IP адресом
Возможные опции:

allowозначает, что любое совпадающее с указанным соединение должно быть разрешено независимо от содержания файлов hosts.allow и hosts.deny. Эта опция должна быть последней в строке.
deny аналогично предыдущей опции, за исключением того, что она запрещает все соединения.
spawn запускает команду шелла при получении запроса на соединение, например я хочу, чтобы какждый раз, когда кто-то снаружи попытается установить соедниение с моей машиной, пищал динамик
twistаналогично опции spawn, только по завершении команды шелла соединение прерывается. Эта опция тоже дожна быть последней в строке.

Последние две опции позволяют использовать символы расширения, применяемые для tcpd, то есть:

%a адрес клиентской машины
%c информация о клиенте (это может быть пользователь@машина, или что-нибудь другое, в зависимости от клиента)
%d имя демона
%h имя или IP адрес клиента, если есть
%n имя клиента
%p PID демона
%s информация о сервере (демон@машина или только демон, в зависимости от ситуации)
%u имя пользователя клиента
%% просто символ %

Уже при таком объяснении и приведенных опциях вы можете много что сделать, например я знаю кое-кого, кто атоматически посылает teardrop при любой попыткой зайти телнетом в его систему :)

ЗАМЕЧАНИЕ: teardrop -- это DoS (Denial of Service (отказ в обслуживании), атака, которая приводит к перезагрузке или переинициализации системы). Она основана на ошибке при дефрагментации TCP пакетов, которая существует в большинстве операционных систем (или скорее существовала, поскольку в большинстве ядер она уже была исправлена). При пересылке информации по Интернет используется протокол TCP/IP (этот протокол существует и в других сетях, например в intranet), хотя на самом деле это два протокола: TCP занимается разделением ифномрации на пакеты и передаче их по протоколу IP, который посылает их машине-получателю; как только они достигнут получающей стороны, протокол TCP проверяет наличие всех пакетов и восстанавливает исходную информацию. Эта атака (и многие другие, основанные на ней) использует тот факт, что многие операционные системы перед дефрагментацией не проверяют размер пакетов, и если они были слишком малы, машина допускает ошибку при их сборке. Я не вполне уверен в полноте объяснения, поэтому буду рад любому совету или критике. Продолжим после краткого объяснения...

Примеры:
#hosts.allow 

ALL: 127.0.0.1 # localhost имеет доступ ко всему

in.ftpd: ALL: spawn (wavplay /usr/share/sounds/intruder.wav & )
# по ftp может войти любой, но при этом воспроизводится
# wav-файл (чтобы я знал)

in.telnetd:  ALL: twist ( teardrop %h %h )
# посылать teardrop любому, кто
# попытается зайти телнетом

#fin
#hosts.deny

ALL: `.bsa.org'   # с домена bsa.org никто не может зайти

in.fingerd: ALL          # сервис fingerd запрещен для всех :)

#fin

Это все, что я хотел рассказать про tcpd, как я уже говорил, не так уж много я и знаю. Могу порекомендовать поэкспериметировать с конфигурацией и почитать справочные страницы ( tcpd, host_access(5) ), я уверен, из них читатель узнает гораздо больше, чем я смогу научить.

Теперь давайте рассмотрим IPFWADM

Самым первым условием является поддержка ядром IP Firewalling ( Networking -> Network firewalls + IP: firewalling ). Затем, после компиляции и переинициализации системы, мы можем его использовать.

IPFWADM позволяет нам помимо прочего управлять прохождением пакетов TCP, UDP и ICMP (в этой статье я буду обсуждать только эти приложения). Если кратко, администратор может указать, какие пакеты могут входить, даже задать адрес или диапазон IP адресов, по какому порту, по какому конкретному протоколу и все возможные комбинации этих вариантов... Аналогично достигается тот же самый административный контроль над исходящими пакетами.

ipfwadm обладает несколькими основными параметрами:

  • -A указывает правила учета ресурсов (accounting rules)
  • -I задает правила для входящих пакетов
  • -O задает правила для исходящих пакетов
  • -F задает правила перенаправления пакетов (forwarding rules)
  • -M занимается администрированием IP-маскарадинга

В этой статье я расскажу только про параметры -I и -O. Оба параметра подчиняются одному и тому же синтаксису.

Опции для этих параметров:

  • -a добавляет одно или более правило к концу списка
  • -i добавляет одно или более правило к началу списка
  • -d удаляет одно или более правило из списка
  • -l показывает правила из списка
  • -f удаляет все правила из списка
  • -p служит для указания, следует ли пакеты принимать (allow) (a), отказывать в приеме (deny) (d) или отбрасывать (reject) (r)
  • -c проверяет, какой группе правил должен подчиняться пакет
  • -h помощь
Важными параметрами являются:

-P задает протокол, к которому применяется список правил. Протоколами могут быть TCP, UDP, ICMP или all (так указывается любой протокол)
-S указывает исходный адрес пакета. Формат: АДРЕС[/МАСКА][ПОРТ]   Например, действительный адрес будет 123.32.34.0/255.255.255.250 25, что означает диапазон IP адресов от 123.32.34.0 до 123.32.34.5
-D задает адрес назначения и имеет тот же формат, что и -S

В общем-то, это все фундаментальные параметры, поэтому, чтобы разрешить все фреймы с моей системы на мою систему, я добаляю правило:

ipfwadm -I -i a -S 127.0.0.1

и запретить пакеты, приходящие с 123.34.22.XXX :

ipfwadm -I -a d -S 123.34.22.0/255.255.255.0

тогда, если я хочу отказать ЛЮБОМУ в доступе к порту netbios, исключая IP адрес 111.222.123.221:

ipfwadm -I -a a -P tcp -S 111.222.123.221 139
ipfwadm -I -a d -P tcp -D 0.0.0.0/0 139

Что же, думаю на этом статья закончена, немного маловато, но и знания мои ограничены O:)

Перевод на английский: Miguel Angel Sepulveda

Перевод на русский: Владимир Попов


This website is maintained by Miguel Angel Sepulveda
© Javi Polo 1998
LinuxFocus 1998