Базы данныхИнтернетКомпьютерыОперационные системыПрограммированиеСетиСвязьРазное
Поиск по сайту:
Подпишись на рассылку:

Назад в раздел

sf Firewall Руководство Пользователя

Руководство Пользователя
sf Firewall - это фильтр пакетов для операционной системы Linux. Все в нем хорошо, кроме одного - он не поддерживает маскарадинг. Так что, если вы не используете маскарадинг для доступа машин в Интернет, вам стоит попробовать этот брандмауэр. Оригинал этого руководства можно найти здесь. Ваши замечания шлите на mgap@atlas.net.ru
Перевод на русский язык - Гурьев Александр, Атлас Нетворкс, Copyright ї 1998

sf Firewall Software --фильтр пакетов TCP/IP для ОС Linux

Robert Muchsel и Roland Schmid

Версия 0.2.9, последние изменения внесены 7 Ноября 1996

Содержание ВведениеCharlie Kaufman говорит:

"Брандмауэры - это неверный подход. Они не решают проблему безопасности в целом и создают трудности в реализации многих полезных вещей. Но с другой стороны, если бы я был ответственен за корпоративную сеть, я никогда не решился бы подключить ее к Интернет без брандмауэра.И если бы меня спросили, в какие из продуктов обеспечения безопасности выгоднее всего вкладывать деньги, я бы назвал брандмауэры." Программа бесплатнаМы хотим дать вам возможность защитить вашу сеть без пополнения чьего-либо кошелька.

Программное обеспечение брандмауэра "sf" было написано Робертом Мачселом (Robert Muchsel) и Роландом Шмидом (Roland Schmid), студентами Швейцарского Федерального Института Технологии в Цюрихе (Swiss Federal Institute of Technology Zurich), идейным вдохновителем был доктор Ганс Любих (Dr. Hannes Lubich), бывший сотрудник SWITCH, Швейцарской Академической Научно-Исследовательской Вычислительной Сети. Нам также хотелось бы поблагодарить arago GmbH, Франкфурт, за возможность всеобъемлющего тестирования нашего продукта. Область примененияЕсли вы имеете средний по величине траффик в Интернет и только одну точку для выхода в Интернет, то эта программа для вас. ПК с ОС Linux должен быть способен маршрутизировать весь проходящий через него траффик, поэтому вам не стоит использовать 386 машину для этих целей (если только у вас не 14.4К модем, в этом случае даже 386-й достаточно).

Мы успешно тестировали наше программное обеспечение на 64Кбит линии, используя 486/66 MГц (эта машина служила еще и почтовым сервером и была перегружена) на 128Кбит линии, используя P5/90 МГц на 10МБит линии, используя P6/200 МГц (эта машина имела среднюю загрузку на уровне 0.00) Есть документацияРуководство по настройке, описание главных архитектурных особенностей построения программного обеспеченияe(на английском языке) и уководство по установке помогут в установке и обслуживании брандмауэра. Если вы не знакомы с брандмауэрами вообще и опасностями при использовании протокола TCP/IP, может быть полезно прочитать книгу Cheswick's and Bellovin's. Есть исходные текстыМы не верим в безопасность вызванную незнанием. В вашем рапоряжении полный исходный текст. Вы можете просматривать и приспосабливать его к вашим нуждам и возможно исправлять какие-либо ошибки (bugs) в нем. Мы просим однако не распространять подобный модифицированный код. И было бы хорошо, если бы вы сообщили нам о всех замеченых ошибках и прислали бы полезные расширения и дополнения. Есть передовые возможностиВы должно быть заметили, что брандмауэр называется "sf firewall", а не "yasbf" (yet another silly boring firewall). Это экспериментальный брандмауэр. В дополнение к удобо-читаемому языку конфигурации мы реализовали динамические правила, переменные и тайм-ауты, всеобъемлющие логи, предупреждения, фильтрацию протоколов RIP, FTP, ICMP, IGMP, UDP и TCP, а также контроль над всеми полями IP пакетов. Брандмауэр предотвращает IP спуффинг и блокирует IP пакеты слишком большого размера. И... она работаетВ мире нет такой вещи как программа без ошибок. Тем не менее у нас достаточно веры в наш продукт, так что мы даже решились использовать его в нескольких проектах в банковской сфере. Пожалуйста не пытайтесь взломать наши сети.
Пожалуйста не пытайтесь показать нам как можно обойти наш брандмауэр.Так как мы (авторы программы) сами не имеем прямого подключения в Интернет, вы только побеспокоите ни в чем не повинных людей. Как с нами связатьсяНаправляйте, пожалуйста всю корреспонденцию на firewall-bugs@switch.ch. Это не список рассылки, поэтому не шлите, пожалуйста, запросов на подписку.

Мы рассмотрим все ваши отзывы, предложения и сообщения об ошибках. Также хотелось бы увидеть примеры конфигурационных файлов для включения в состав следующих версий программы. CopyrightCopyright ї 1996 Robert Muchsel and Roland Schmid

This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. БиблиографияНиже приведены некоторые статьи и книги, которые стоит прочитать перед тем как конфигурить sf firewall: Обязательно прочтитеChapman, D.B. 1992:
Network (In)Security Through IP Packet Filtering.
Great Circle Associates, Mountain View, California.
Можно скачать по ftp с ftp.greatcircle.com. Рекомендуем прочестьBellovin, S.M. 1989:
Security Problems in the TCP/IP Protocol Suite.
AT&T Bell Laboratories, Murray Hill, New Jersey.
Можно скачать по ftp с ftp.research.att.com.

Cheswick, W.R. and Bellovin, S.M. 1994:
Firewalls and Internet Security--Repelling the Wily Hacker.
Addison-Wesley, Reading, Massachusetts.

Kaufman, C., Perlman, R., Speciner, M. 1995:
Network Security--PRIVATE Communication in a PUBLIC World.
Prentice Hall, Eaglewood Cliffs, New Jersey.

Stevens, W.R. 1994:
TCP/IP Illustrated, Volume 1--The Protocols.
Addison-Wesley, Reading, Massachusetts. Установка программыЭта глава описывает процесс установки sf firewall на Linux 2.0.x.

Распакуйте архив в какую-либо директорию, например /usr/local/src. Файлы программы будут записаны в ./sf-0.2.9 (вы вероятно уже сделали это).

Мы рекомендуем использовать ядро Linux 2.0.24, которое является последней версией, на которой тестировалась наша программа (более ранние ядра 2.0.x иногда обрывали TCP соединения;также ядро 2.0.23 и ранее уязвимы для IP пакетов большого размера). Существует версия sf firewall для ядер 1.2.x, для них загрузите архив sf-0.1.tar.gz.

Не нужно, в общем, патчить ядро 2.0.24, однако вам нужно исправить возможные баги в других программах (например sendmail). Чтобы уменьшить воздействие атаки TCP SYN flooding , будет разумным установить следующий patch.

Если ваша текущая конфигурация ядра не включает "Loadable module support", "Networks firewall support" и "IP routing", вам следует перекомпилить ядро. Чтобы сделать это, перейдите в директорию /usr/src/linux (замечание: если ваше ядро находится в другом месте, вы должны отредактировать файл make.options в директории, где расположен sf firewall). Запустите команду make menuconfig и выберите соответствующие опции. Затем запустите компиляцию make clean; make dep; make zImage.За подробностями по компиляции ядра обращайтесь к Linux kernel HOWTO.

Пока компилиться ядро, вы можете продолжить установку брандмауэра. Перейдите в директорию sf-0.2.9 и наберите ./configureПросмотрите файл sf_custom.h и проверьте соответствует ли он вашей системной конфигурации. Не меняйте того, в чем вы не уверены !

Теперь наберите make clean; make dep; makeЭто создаст файлы sfc, sfident и sf.o.

Создайте нового пользователя с именем firewall. Это можно сделать добавив следующую строчку к файлу /etc/passwd (вы можете использовать любые свободные пользовательские и групповые id): firewall:x:888:888::/dev/null:/bin/falseСоздайте новую группу firewall добавив следующую строку к файлу /etc/group : firewall:x:888:Теперь наберите make installЭта команда создаст устройство и канал для брандмауэра (firewall device, the firewall pipe) и скопирует исполняемые файлы в нужные места.

Создайте файл конфигурации брандмауэра /etc/firewall.conf. Вы можете использовать в качестве образца файл, включенный в дистрибутив, изменив его в соответствии с вашими нуждами.

Когда завершиться компиляция ядра, установите его (скопируйте zImage в /vmlinuz, запустите lilo и перегрузитесь).

Теперь вы можете загрузить в ядро модуль брандмауэра (insmod sf) и запустить демон (sfc start). Для автоматического старта брандмауэра во время загрузки, вставьте эти две команды в файл в /sbin/init.d/ (или /etc/rc.d/, в зависимости от вашей системы). Убедитесь в том, что демон брандмауэра запускается перед маршрутизирующим демоном. Если конфигурация брандмауэра не позволяет перенаправление маршрутов (ICMP routing redirects), вам следует, после запуска демона брандмауэра, проверить таблицу маршрутов и удалить динамически созданные маршруты.

Мы рекомендуем внести следующие изменения в вашу Linux систему: Убедиться в достаточном количестве дисковой памяти под /var/log (мы советуем использовать отдельный раздел диска). Запретить работу всех пользователей на машине (удалите всех пользователей, создайте файл с названием nologin в корневой / директории). Запретите удаленные логины на машину (измените securettys в /etc и/или отредактируйте переменную CONSOLE в /etc/login.defs). Не запускайте RPC или ненужные inetd службы (не запускайте inetd вообще или удалите ненужные сервисы из /etc/inetd.conf). Вы можете просмотреть активные сервисы с помощью netstat -a. Замените ваш файл /etc/services на файл содержащийся в дистрибутиве брандмауэра (проверьте его права доступа - должны быть 0644). В скрипте, ответственном за запуск сети запустите интерфейсы в режиме down , потом загрузите модуль sf ,запустите sfc start и только затем поднимите интерфейсы (ifconfig ethx up). Используйте smail, smap и smapd вместо sendmail (вы можете сделать линк с sendmail на smail чтобы быть увереным, что все существующие программы будут работать). Если вы никак уж не можете обойтись без sendmail, установите последнюю версию, установите smrsh и удалите сообщение о номере версии из /etc/sendmail.cf Установите tripwire или подобный продукт для обнаружения измененных файлов. Совет: чтобы не делать отдельного раздела на диске, доступного только по чтению (необходимого для хранения конфигурационных файлов tripwire), разместите базу данных tripwire на дискетте с файловой системой minix, защитите ее от записи и смонтируйте. Затем в BIOS setup (и/или SCSI controller setup) измените последовательность загрузки на C: A:. Добавьте следующие cron jobs: runq (или sendmail -q, если вы используетеsendmail) каждые 10 минут - это обеспечит то, что вся почта будет обработана, особенно если у вас не запущен почтовый демон. sfc start каждые 5 минут - если демон брандмауэра, по каким-то причинам слетел, это снова запустит его. sfc reconfig flush_all ежедневно - очистка от мертвых соединений (здесь вы также можете делать архивацию файлов логов, отправку по почте файла firewall.report и другие необходимые вещи, например запускать tripwire). Настройка конфигурации брандмауэраВсе правила и настройки брандмауэра содержатся в одном файле. В этой главе описана структура и синтаксис этого файла.

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

Файл конфигурации состоит из трех частей: setup секция, содержащая информацию о структуре вашей сети. configuration секция, содержит информацию о правилах фильтрации пакетов. Определяет, что нужно делать с IP пакетами. notification секция, определяет, какие дополнительные действия должен сделать демон брандмауэра в случае соответствия пакета правилу. Любая строка в файле начинающаяся со знака # считается комментарием. Комментарии в стиле языка C (любой текст,начинающийся с /* и заканчивающийся */) также допустимы. Они обычно используются для обозначения многостроковых комментариев , а также комментариев, начинающихся не с начала строки.

Заметим, что в файле конфигурации надо использовать только прописные буквы. (строки могут содержать заглавные буквы). Указание IP адресовIP адреса используются в нескольких местах в файле. Вы можете использовать адреса в десятично-точечной (dotted decimal) форме или имена. В последнем случае, имя преобразуется в адрес на этапе просмотра конфигурационного файла с помощью операционной системы (используя, так называемый, resolver). Все адреса, выдаваемые для данного имени, подставляются в файл. Мы настоятельно не рекомендуем использовать имена в файле конфигурации по следующим причинам: Вы не имеете полного контроля за тем, как много и какие именно IP адреса будут использованы. Работа по определению адресов может вызывать обмен пакетами в такие моменты, когда брандмауэр неактивен и не может отслеживать этот траффик. Возможна ситуация, когда DNS сервер возвратит неправильные или даже подделаные адреса, что приведет к нарушению правильной работы брандмауэра. Вы можете указывать маску после адреса или имени. Заметьте, что это не та сетевая маска ( netmask ), которая используется при настройке сетевых интерфейсов! Два адреса считаются совпадающими, если у них совпадают все биты соответствующие единичкам в маске. Например, если вы хотите чтобы было полное совпадение адресов, используйте маску 255.255.255.255.

Примеры: 129.132.1.18 mask 255.255.255.255 соответствует только одному хосту 193.135.255.0 mask 255.255.255.0 обозначает все адреса в сети класса C 129.132.20.0 mask 255.255.255.0 соответсвует всем адресам в подсети 129.132.20.0 сети 129.132.0.0 класса BВ общем случае, вам не надо указывать маску для обозначения конкретного хоста или сети, в которой нет разбиения на подсети. Ниже показано какие маски подставляются автоматически: 129.132.1.18 = 129.132.1.18 mask 255.255.255.255 129.132.0.0 = 129.132.0.0 mask 255.255.0.0 193.135.255.0 = 193.135.255.0 mask 255.255.255.0Заметьте, что адрес 129.132.20.0, указанный без маски, будет обозначать адрес хоста, так как это адрес класса B и часть адреса, содержащая адрес хоста ( .20.0 ) не равна нулю. Чтобы указать адрес подсети, а не хоста необходимо указать маску (255.255.255.0). Секция SetupКонфигурационный файл начинается с ключевого слова setup. Необязательная инструкция internalnets используется для указания IP адресов сетей и/или хостов, которые расположены за брандмауэром и составляют защищаемую область. Адреса разделяются запятыми и заканчиваются точкой с запятой. Эта информация используется брандмауэром для предотвращения IP спуфинга. Брандмауэр определяет на правильный ли интерфейс пришел пакет. То есть, если пакет имеет адрес источника из внутренней сети, то он не может прийти на интерфейс подключенный к Интернет. При этом предполагается, что сеть подключена к Интернет только в одном месте.

Вы должны указать почтовый адрес используя инструкцию mail_default. Этот адрес используется, по умолчанию, для сообщений о различных событиях ( например, переполнении диска ). Вы можете указать в одной строке несколько почтовых адресов, разделенных пробелами. Секция ConfigurationЭта секция начинается с ключевого слова rules. Каждое правило в этой секции начинается с одного из слов accept, block или reject. Правило accept разрешает прохождение пакетов, адреса которых соответствуют указанным в этом правиле. Пакеты, соответствующие правилу block просто тихо отбрасываются, то есть никаких ICMP сообщений об ошибках не возникает. В случае правила reject, соответствующий пакет отбрасывается, а по его исходному адресу шлется ICMP сообщение об ошибке. По умолчанию, шлется сообщение host unreachable, однако возможно указать другое сообщение, используя следующую форму - reject with icmp_..._unreachable.

Вслед за указанными ключевыми словами вы можете указать список параметров IP пакета, используя дополнительнае опции. Пакет считается соответствующим правилу, если хотя бы одна из опций верна. Особый случай - это поле time to live пакета, которое на самом деле не является опцией , но в данном случае рассматривается как таковая. Значение этого поля сравнивается с константой и пакет считается соответствующим правилу только в случае положительного результата сравнения, независимо от остальных опций.

Информация о типе протокола IP пакета задается одним из слов tcp, udp, icmp, igmp, rip или all, где all обозначает все пакеты, независимо от протокола. Можно указывать вместо слова номер протокола в заголовке IP пакета, например 9 для IGP. В случае протоколов icmp или igmp, возможно указать типы сообщений. Протокол rip это специальный случай протокола udp, когда все пакеты идущие на 520 порт исследуются. RIP пакет считается удовлетворяющим правилу если все адреса сетей, указанные в пакете, присутствуют и в правиле. Вот пример правила для RIP пакета: accept rip outside /* соответствует всем внешним адресам */ from 194.40.243.5 /* адрес ближайшего маршрутизатора в интернет */ to 194.40.243.4; /* собственный адрес */Пакет считается удовлетворяющим правилу, если его адрес источника ( source address ) совпадает с одним из адресов, указанных после ключевого слова from и его адрес назначения ( destination address ) совпадает с одним из адресов, указанных после ключевого слова to. Если пропущен список from или to, то пакет считается соответствующим правилу вне зависимости от адреса источника или адреса назначения соответственно. Вместо списка адресов можно указывать ключевое слово inside, которое обозначает все адреса, указанные в инструкции internalnets ( смотри выше ) либо ключевое слово outside, которое означает все адреса, не указанные в инструкции internalnets.

Если правило описывает пакеты протоколов tcp или udp, вы можете также указать номер порта или диапазон портов. При этом, вы можете использовать либо номера портов, либо названия сервисов. В последнем случае название сервиса переводится в номер порта с использованием файла /etc/services. Указание номеров портов для пакетов других протоколов не оказывает никакого эффекта.

Вот пример использования ключевых слов from и to : from inside port telnet /* все пакеты с внутренними адресами и портом источника 23 */ to 129.132.0.0, /* все пакеты, идущие в сеть 129.132.0.0 */ port 2700, /* все пакеты, идущие на порт 2700 */ 130.103.24.0 mask 255.255.255.0 port 3000..4000; /* все пакеты, идущие в указанную подсеть на все порты с 3000 по 4000 */Наконец, в правиле вы можете указать уровень сообщения ( notification level ), который говорит брандмауэру, какие действия необходимо предпринять в случае соответствия пакета правилу ( помимо, собственно, принятия или отбрасывания пакета). Нулевой уровень означает то, что демон брандмауэра не извещается о произошедшем событии. Если уровень сообщения больше нуля, то брандмауэр делает запись в логах и выполняет другие действия, описанные в секции notification ( смотри ниже ).

Порядок правил в файле очень важен. Если два правила перекрываются, то первое по порядку правило имеет приоретет над вторым. Следовательно вам надо начинать с наиболее определенных правил, а общие правила располагать в конце секции. Например, если вы хотите запретить все UDP пакеты, за исключением пакетов, идущих с хоста 194.40.236.34, вам следует записать два правила в следующем порядке: accept udp from 194.40.236.34 notification_level 0; block udp notification_level 1; Секция NotificationСекция notification начинается с ключевого слова notification, за которым, в отдельных абзацах, описываются все уровни сообщений. Каждый абзац начинается ключевым словом level, за которым идет номер уровня и двоеточие. В каждом абзаце вы определяете список действий, которые выполняются на этом уровне. Ниже приведен список возможных действий:

message определяет текст дополнительного сообщения, которое записывается в лог-файл и в почтовое сообщение. Если сообщение состоит из нескольких строк, то строки завершаются двойной кавычкой (") и возобнавляются на следующей строке. Заметьте, что внутри if конструкции вы должны использовать отдельные сообщения.
syslog приводит к тому, что сообщение, в дополнение к лог-файл брандмауэра, записывается и через syslog.
report сообщение копируется в файл firewall.report , в дополнение к обычному лог-файлу брандмауэра.
mail посылает сообщение по указанному адресу(ам). Если никакого адреса не указано, то почта отсылается по адресу, указанному в инструкции mail_default.
spy функция "конрразведки", выполняет неоторые действия по сбору информации о хосте, с которого пришел пакет, например посредством finger. Эту инструкцию следует использовать вместе с mail, для того, чтобы получить результаты по E-mail.
relevel изменяет уровень сообщения для правила. В следующий раз, когда пакет будет соответствовать правилу, будут выполнены действия, указанные в новом уровне.
exec выполняет произвольную команду операционной системы. Эта инструкция может использоваться, например, для отключения сетевого интерфейса или системы в целом и др. Это очень мощная команда, используйте ее осторожно!
call вызывает выполнение действий другого уровня.
let присваивает или изменяет значение переменной. В конце конструкции let может быть указано значение тайм-аута ( в секундах ). Если к переменной происходит доступ по чтению или по записи после того, как истекло значение тайм-аута с момента предыдущего доступа, переменная обнуляется перед операцией доступа.
Динамические правила добавляются к конфигурации динамически. В дополнении к опциям, описанным выше, существует несколько специальных опций для динамических правил. Вы можете использовать ключевое слово currentprotocol вместо указания конкретного протокола. В этом случае используется протокол пакета, который вызвал выполнение этого уровня. Подобным же образом вы можете использовать ключевые слова sourcehost, sourcenet, desthost, destnet после ключевых слов to и from, чтобы были подставлены соответственно адреса хоста-источника, сети-источника, хоста-назначения, сети-назначения. Наконец возможно в конце конструкции указать значение тайм-аута ( в секундах ). Правило будет автоматически удалено по истечения тайм-аута. Используйте динамические правила с осторожностью, так как никогда не ясно, какое из них активно в данный момент. Также довольно трудно определить как эти правила влияют друг на друга, так как их приоритет зависит от порядка возникновения соответствующих событий. Вы можете использовать конструкцию if, чтобы выполнить некоторые действия только при определенном условии.

Переменные считаются объявленными неявно и имеют начальное значение, равное нулю. Переменные могут быть только целочисленного типа. При обращении к переменной, возможно через двоеточие указать один из квалификаторов sourcehost или desthost. В этом случае происходит обращение к специальному экземпляру переменной, адресуемой по адресу хоста-источника или хоста-назначения пакета, который вызвал выполнение этих действий. В случае обновления такой переменной изменяется как основная переменная, так и ее специальный экземпляр. Эта особенность используется, в частности, для организации счетчиков, как общего числа событий, так и отдельно, для каждого адреса источника и назначения.

В следующем примере показано использование переменных с квалификаторами, тайм-аутов и динамических правил. Если хост пингует вашу сеть 100 раз с интервалом между пингами не более 2 секунд, все пакеты с этого хоста блокируются на 10 минут. Уровень сообщения динамического правила установлен равным нулю, чтобы уменьшить количество передаваемой информации от фильтра к демону. accept icmp icmp_echo to inside notification_level 10; notification level 10: let pingcount:sourcehost := pingcount:sourcehost + 1 timeout 2; if pingcount:sourcehost > 100 then block all from sourcehost notification_level 0 timeout 600 endif; Написание правил фильтрацииВ этой главе мы обсудим вопросы написания фильтрующих правил для нашего брандмауэра. Мы настоятельно рекомендуем вам прочитать книгу "Firewalls and Internet Security", Cheswick и Bellovin (Addison-Wesley, 1994), чтобы иметь представление о проблемах, связанных с безопасностью использования протокола TCP/IP и правильной конфигурации брандмауэра. Блокировать или отражать (Block or Reject ) пакеты ?Часто, довольно трудно решить, блокировать пакет или отражать его. В первом случае, хост посылающий пакет думает, что пакет просто потерялся где-то при передаче. В этом случае, обычно, посылающее приложение несколько раз повторяет посылку пакета. Если же вы посылаете назад ICMP сообщение об ошибке, то, как правило, посылающая сторона не предпринимает больше попыток передать пакет.

Не следует отражать пакеты тех протоколов или приложений, которые игнорируют ICMP сообщения (как некоторые реализации DNS серверов), так как это вызовет наводнение сети ICMP сообщениями. Протокол TCP не игнорирует совсем ICMP сообщения, но все равно пытается заново передать пакет, так как он считает, что сообщения типа "...unreachable" могут быть вызваны временными причинами. Чтобы надежно отразить TCP пакеты, необходимо послать reset пакет (этого можно достичь с помощью либо reject with tcp_reset, либо reject with best ).

Многие программы не делают различий между различными ICMP "...unreachable" сообщениями. Таким образом, возможна ситуация, когда вы шлете сообщение "port unreachable", а принимающая сторона обрабатывает его как "host unreachable". В результате хост может стать недоступен, что может быть нежелательно.

Не следует отражать ICMP сообщения, так как это не будет работать, вследствии особенностей реализации ядра операционной системы.

Если вы используете инструкцию reject with best, то в этом случае TCP пакеты отражаются посылкой reset пакета; для UDP пакетов генерится ICMP сообщение port unreachable, а все остальные пакеты отражаются с ICMP сообщением host unreachable. Фильтрация TCP соединенийВ случае правил для протокола TCP, адрес после ключевого слова from обозначает инициатора соединения. Для установленных соединений прохождение пакетов в обратную сторону разрешается автоматически. Запись в лог-файл делается только в момент установления соединения.

Протокол FTP требует специальной обработки, так как при связи по этому протоколу, устанавливается два соединения - управляющее (control connection) и соединение для данных (data connection). Второе из них инициируется сервером. Однако вам не нужно явно разрешать входящие соединения. Каждое управляющее соединение просматривается на наличие команд PORT, которые вызывают установление соединений для данных на конкретный порт. И каждое такое соединение автоматически разрешается. Входящие и выходящие пакетыФильтр пакетов вызывается всякий раз, когда IP пакет принимается или отсылается. Пакеты, проходящие с одного интерфейса на другой, проверяются во время прихода в систему. При отсылке пакета проверяется только соответствие интерфейса адресу назначения ( для предотвращения спуфинга ). Локальные пакеты (то есть те, которые не собираются выходить из системы ) проверяются только при передаче. Подделка адресов (Address Spoofing)Следующие признаки подделки адресов вызывают сигнал тревоги: Пакет имеет внутренний исходный адрес, а пришел на внешний интерфейс ( и наоборот ). Это значит, что некоторый внешний хост пытается выдать себя за внутренний. Адрес назначения и интерфейс, через который отсылается пакет, не соответствуют друг другу. Это означает, что, скорее всего, нарушена таблица маршрутизации. Адрес локальной "петли" ( loopback address) используется на любом интерфейсе, отличном от локального ( loopback interface ). Заметьте, что адреса класса D и E не проверяются на предмет спуфинга. Фрагментированые IP пакетыВ случае фрагментации пакетов, проверяется только первый фрагмент пакета и результат проверки запоминается. В случае, если этот фрагмент не принят, то и все остальные фрагменты просто тихо отбрасываются. В случае, если фрагменты приходят не по порядку, то все фрагменты, пришедшие до первого, отбрасываются. Синтаксис файла конфигурацииconfiguration = setup_section rules_section [ notification_section ] "end.".setup_section = "setup" [ internal_statement ] mail_statement.rules_section = "rules" { ( block_statement | accept_statement | reject_statement ) }.setup_statement = "internalnets" address { "," address } ";".mail_statement = "mail_default" """ mailaddress(es) """ ";".block_statement = "block" rule ";".accept_statement = "accept" rule ";".reject_statement = "reject" [ "with" ( "icmp_net_unreachable" | "icmp_host_unreachable" | "icmp_protocol_unreachable" | "icmp_port_unreachable" | "tcp_reset" | "best" | "echo_reply" ) ] rule ";".rule = [ "options" ip_option { "," ip_option } ] ( "all" | protocol_number | "icmp" [ icmp_type { "," icmp_type } ] | "igmp" [ igmp_type { "," igmp_type } ] | "tcp" | "udp" | "rip" [ ( address { "," address } | inside | outside ) ] ) [ "from" ( fulladdr { "," fulladdr } | "inside" [ "port" port [ ".." port ] ] | "outside" [ "port" port [ ".." port ] ] ) ] [ "to" ( fulladdr { "," fulladdr } | "inside" [ "port" port [ ".." port ] ] | "outside" [ "port" port [ ".." port ] ] ) ] "notification_level" value. ip_option = ( "record_route" | "timestamp" | "security" | "loose_source_route" | "strict_source_route" | "sat_id" | "time_to_live" ( "<" | "=" | ">" | "!=" ) value ). icmp_type = ( "icmp_echo_reply" | "icmp_destination_unreachable" | "icmp_source_quench" | "icmp_redirect" | "icmp_echo_request" | "icmp_time_exceeded" | "icmp_parameter_problem" | "icmp_timestamp" | "icmp_timestamp_reply" | "icmp_info_request" | "icmp_info_reply" | "icmp_address" | "icmp_address_reply" ). igmp_type = ( "igmp_host_membership_query" | "igmp_host_membership_report" | "igmp_host_leave_message" ). fulladdr = ( address [ "port" port [ ".." port ] ] | "port" port [ ".." port ] ). address = ( ip_address | """ name """ ) [ "mask" mask ]. port = ( port_no | name ).notification_section = "notification" "level" ( value | "spoof" | "oversized" ) ":" ( { entry ";" } | ";" ) { "level" ( value | "spoof" | "oversized" ) ":" ( { entry ";" } | ";" ) }.entry = ( "message" """ text """ { """ text """ } | "syslog" | "report" | "mail" [ """ mailaddress(es) """ ] | "spy" | "exec" """ command """ | "relevel" value | "call" value | "if" ( variable | value ) ( "<" | "=" | ">" | "!=" ) ( variable | value ) "then" { entry ";" } "endif" | "let" variable ":=" ( value | "destport" | variable [ ( "+" | "-" ) ( value | variable ) ] ) [ "timeout" seconds ] | dynamic_rule [ "timeout" seconds ] ).variable = name [ ":" qualifier ]. qualifier = ( "sourcehost" | "desthost" ).[ специальные ключевые слова, допустимые в динамических правилах: "currentprotocol" uses protocol of actual packet "sourcehost" uses source host address "sourcenet" uses source net address "desthost" uses destination host address "destnet" uses destination net address ] Примеры, пожалуйста !Для начала, ознакомьтесь, пожалуйста, с описанием настройки конфигурации брандмауэра. В этом разделе мы опишем работающий (хотя и не очень полезный) пример с использованием уровней сообщений ( notification level ). Для удобства, этот пример включен в дистрибутив нашей программы.

Далее в тексте примера используется шрифт с фиксированой шириной. Важные ключевые слова выделены жирным шрифтом, а комментарии курсивом. # Образец файла конфигурации брандмауэра "sf firewall" setup internalnets 193.194.195.0; mail_default "adm@x.y.z"; rules # Некоторые простые правила для определения активности хакеров block tcp to port 87, /* link */ port 95 /* supdup */ notification_level 99; block options loose_source_route, strict_source_route all notification_level 13; # ...пропустим несколько правил для RIP протокола # обнаруживать дополнительные пути в интернет block rip from inside notification_level 12; # ...пропустим еще несколько правил с уровнем сообщений 0 # Разрешить входящие FTP запросы на наш FTP сервер accept tcp to 130.59.4.16 port 21 notification_level 1; # Разрешить входящие Telnet запросы на наш Telnet/Login сервер accept tcp to 130.59.4.16 port 23 notification_level 2; accept all from 127.0.0.1 to 127.0.0.1 notification_level 0; # запретить все остальные TCP соединения block tcp notification_level 99; notification level 1: /* регистрировать все разрешенные FTP соединения */ message "FTP connection request."; level 2: /* регистрировать все разрешенные Telnet соединения */ message "Telnet connection request."; level 3: /* регистрировать все разрешенные WWW соединения */ message "WWW connection request."; level 11: message "ICMP redirect received."; level 12: message "There may be a secondary route to the internet."; level 13: message "IP packet with source route option detected"; let sr:sourcehost := sr:sourcehost + 1 timeout 300; if sr:sourcehost = 1 then message "IP packet with source route option detected"; spy; endif; level 99: message "Illegal TCP connection."; syslog; let illtcp:sourcehost := illtcp:sourcehost + 1 timeout 600; if illtcp:sourcehost = 1 then message "Illegal TCP connection."; mail; spy; endif; end.Приведенный выше пример показывает использование всех возможных конструкций в секции "notification", за исключением relevel, exec и динамических правил. В то время, как использование инструкции exec довольно очевидно (например exec "ifconfig eth0 down" отключает интерфейс в случае крайней необходимости), использование инструкции relevel и динамических правил требует пояснений.

Изменнеие уровня правила с помощью relevel является постоянным и вследствии этого не очень полезно. Лучше использовать временные динамические правила.

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

Первая идея состоит в изменении уровня с помощью инструкции relevel: ... notification level 100: message "We have been pinged"; relevel 0; ...Однако это плохая идея. После первого же пинга регистрация пингов отключится совсем. Чтобы зарегистрировать первый пинг и потом, в течении некоторого времени, не регистрировать последующие пинги с того же хоста, нам надо отказатлься от relevel и сделать так: ... notification level 100: let pings:sourcehost := pings:sourcehost + 1 timeout 600; /* 10 minutes */ if pings:sourcehost = 1 then message "We have been pinged"; endif; ...Если мы беспокоимся о возможных атаках типа "отказ обслуживания" (denial-of-service attack), мы можем использовать динамические правила и блокировать пинги (после определенного их числа): if pings:sourcehost > 1000 then message "Possible denial-of-service attack"; spy; block all from sourcehost notification_level 0 timeout 600; endif;Конечно, реальная атака может использовать большое число других, отличных от пинга, видов соединений, например ftp. Запуск и управление брандмауэромПосле того, как вы установили брандмауэр и настроили его конфигурацию, вы, конечно, хотите знать как его запускать, останавливать и исследовать его состояние.

В этой главе описана программа sfc, которая является командным интерфейсом для демона брандмауэра и фильтрующего модуля ядра. Запуск брандмауэраДля начала, убедитесь, что модуль sf.o загружен в ядро (в этом вам поможет команда lsmod ). Если sf.o не загружен, посмотрите Руководство по Установке -- добавьте строку insmod /путь/к/sf.o в один из файлов запуска и перегрузите машину.

Команда sfc start используется для запуска демона брандмауэра. По умолчанию файл конфигурации находится в /etc/firewall.conf, но вы можете указать любой другой файл , например sfc start myconfig.

По команде start сначала происходит разбор конфигурационного файла. Затем проверяется не запущен ли уже демон брандмауэра, открывается файл логов, запускается демон и в конце снимает с демона привелегии суперпользователя. Остановка брандмауэраДля остановки демона брандмауэра используется команда sfc stop.

Предупреждение: Когда демон останавливается, то весь сетевой траффик блокируется. Вам надо, либо выгрузить модуль sf.o из ядра (rmmod sf.o), либо заново запустить демон (sfc start).

Причина: Предположим, в результате какой-нибудь ошибки в операционной системе, злой хакер сумел послать сигнал SIGKILL демону брандмауэра. Брандмауэр бы завершил свою работу и оставил бы систему незащищенной. Кстати, в версии Linux 1.2.11 была ошибка, позволяющая любому пользователю убивать любой процесс. Это еще одна причина, по которой никогда нельзя разрешать работу обычных пользователей на машине, где запущен брандмауэр. Изменение конфигурации брандмауэраВ некоторых случаях , желательно автоматически переключаться с одной конфигурации на другую. Предположим, что в некоторой организации, никто не работает по воскресеньям (мне говорили, что такие конторы существуют). Следовательно, сетевой траффик по воскресеньям должен проверяться гораздо строже, чем в обычные дни.

Для изменения конфигурации в определеннное время вы могли бы выполнить с помощью cron следующие команды sfc stop; sfc start newconfig. Однако, существует лучший способ смены конфигурации, заложеный в sfc - команда sfc reconfig newconfig (где newconfig это путь к файлу с новой конфигурацией. Если этот параметр пропущен, то будет использоваться /etc/firewall.conf ).

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

flush: При использовании этого параметра, все существующие TCP соединения, которые не разрешены в новой конфигурации будут прерваны. Другие TCP соединения останутся.

flush_all: Эта команда завершает все TCP соединения (эквивалентно последовательности stop; start ). Проверка синтаксиса файла конфигурацииЧтобы проверить файл конфигурации на синтаксические ошибки, используется команда sfc checkconfig myconfig (и снова myconfig может быть опущен, тогда используется /etc/firewall.conf).

В случае ошибки печатается номер строки. Отображение текущей конфигурацииКоманда sfc show показывает все активные правила и переменные.

Активные правила: Активные правила извлекаются из модуля фильтрации ядра и отображаются в том порядке, в каком они проверяются фильтром: Active rules: ------------- 1 (line 27) dynamic, timeout Aug 03 15:15:03 block, notification level 0 from 193.194.195.196 mask 255.255.255.255 2 (line 10) static block, notification level 7 protocol RIPВ первой колонке печатается последовательный номер правила, соответствующий порядку просмотра их ядром. Далее идет номер строки в конфигурационном файле и тип правила. Если правило динамическое, то приводится также и значение тайм-аута.

Во второй строке показывается действие, выполняемое фильтром по этому правилу (блокировать или пропускать пакет) и соответствующий уровень сообщения.

Все остальные строки необязательны. В некоторых случаях печатается тип протокола и адреса источника или назначения пакета.

Переменные: Значения переменных берутся из демона брандмауэра. Variables: ---------- mails = 0 pings = 5, timeout Aug 03 15:13:53 host 193.194.195.196 = 3, timeout Aug 03 15:13:53 alerts = 3В листинге показываются имена переменных и их общие значения. Если переменая динамическая (то есть она забудет свое значение по истечении тайм-аута), то показывается и значение тайм-аута.

В случае, если у переменной несколько экземпляров с разными адресами хостов, то все они печатаются с указанием IP адреса и, возможно, тайм-аута.

КонтрразведкаСкажем несколько слов о функции контрразведки, встроенной в брандмауэр:

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

Цель "шпионажа" за другими машинами в том, чтобы попытаться собрать информацию о этих машинах и пользователях, работающих на них. Действия выполняемые процессом-шпиономЧтобы узнать имя удаленной машины, запрашивается DNS (система доменных имен). Полученное имя затем транслируется в адрес (опять же с использованием DNS) и результат сравнивается с IP адресом пакета. Если адреса не совпадают, выдается специальное предупреждение.

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

Вначале брандмауэр пытается использовать протокол ident. Это возможно только если выполнение процесса-шпиона вызвано попыткой TCP соединения на сам брандмауэр (это ограничение данного протокола). Если все работает как нужно, вы получите имя пользователя, посылающего пакеты. Если нет, то вы увидете сообщения "no such user" или "connection refused".

Далее используется команда finger на удаленный хост. Если удаленная машина допускает finger запросы, то вы увидите список всех активных пользователей этой машины. Список может содержать интересную информацию о логических именах пользователей, их настоящих именах, времени работы в системе и др. Некоторые хосты возвращают только информацию типа "To send mail to someone at ..., address your mail using the following format: ...", а другие вообще отказываются обслуживать finger запросы.

Наконец, предпринимается попытка использовать команду rusers. Мне бы хотелось увидеть хост, который ответит на эту команду, но, тем не менее, если она пройдет, вы увидете список пользователей этой машины, хосты, с которых они залогинились и время работы. Куда записываются результатыЕсли ничего не указывать, то результаты шпионажа запишутся в файл firewall.spy в той же директории где находится лог-файл брандмауэра. Если вы укажете ключевое слово mail для того же уровня сообщения, что и ключевое слово spy, результаты будут также отправлены по почте. Пример результатов шпионажаРезультаты могут быть похожи на приведенный ниже пример (в реальной жизни возможно более двух пользователей): FIREWALL COUNTER INTELLIGENCE REPORT, Aug 09 12:20:02 Triggered by: (s 13) accept TCP 1.2.3.4:1065->193.194.195.196:telnet Host address: 1.2.3.4 Host name: oval.office.gov identd information: User ID: unabom. finger information: [1.2.3.4] Login: unabom Name: John F. Doe Directory: /home/unabom Shell: /bin/csh On since Wed Aug 9 10:27 (EST) on tty1 No Mail. No Plan. Login: bclinton Name: Bill Clinton Directory: /home/bclinton Shell: /bin/bash On since Wed Aug 9 9:32 (EST) on tty2, idle 0:22 New mail received Wed Aug 9 12:18 1995 (EST) Unread since Tue Aug 8 20:03 1995 (EST) Plan: We are using PGP to encrypt our E-mail here at the office. rusers information: unabom localhost:tty1 Aug 9 10:27 bclinton localhost:tty2 Aug 9 9:32 :22 Формат лог-файла брандмауэраВ зависимости от конфигурации, брандмауэр может создавать как небольшое, так и огромное количество записей в лог-файле( в случае недостатка места на диске, вы получите E-mail ). Эта глава поможет вам разобраться в содержимом лог-файла. Куда записывается информацияВесь вывод брандмауэра записывается в лог-файл брандмауэра. Если вы указали ключевое слово syslog, запись будет занесена и в системный лог-файл. Ключевое слово report копирует запись в файл firewall.report (являющийся ежедневным отчетом). А если вы указали ключевое слово mail, то запись будет направлена по электронной почте ( это может быть полезно в том случае, если хакер сумел войти в систему и изменить файлы логов, чтобы скрыть свое присутствие -- отправленную почту он не в силах изменить). Используемые сокращенияИз-за используемых сокращений, разобраться в содержимом файла, с первого взгляда, довольно сложно. Мы пошли на это для того, чтобы разместить как можно больше информации на одной строке.

Ниже приведен список возможных сокращений. За более подробной информацией обращайтесь к описанию:

Rule Types (Типы правил):
s = статическое правило
d = динамическое правило
SPOOF = неявное спуф-правило (включает название интерфейса)
XSIZE = неявное правило для чрезмерно больших (oversized) (включает название интерфейса)

Filter Actions (Действия фильтра):
accept - пропускать
block - не пропускать
reject - не пропускать, с посылкой ICMP сообщения (указывается и тип сообщения)

Protocols (Протоколы):
RIP
TCP
UDP
ICMP

Адрес источника пакета ( Packet Source) и адрес назначения ( Packet Destination ) включают и номера портов (через двоеточие), если они поддерживаются протоколом. Другие записи в лог-файлеДругие записи говорят сами за себя. ОграниченияВ этой главе описаны ограничения, присущие нашему брандмауэру. Текущее состояние делВ настоящее время, большинство систем полностью незащищены. Многие организации даже и не беспокоятся о замене клиентских программ, содержащих ошибки. Старые версии sendmail-а все еще работают на забытых всеми принт-серверах, где-нибудь в отдаленных углах офиса.

Таким образом, любой брандмауэр, будь он как угодно плохим, все равно улучшит ситуацию. Ожидаемая новая версия протокола IP v6 поможет решить многие вопросы безопасности. Но даже через несколько лет, когда новый протокол получит распространение, все равно останутся старые машины, работающие со старой версией протокола, уязвимые для атак. Защита, обеспечиваемая брандмауэром sf FirewallМы хотели бы сказать что вам теперь не о чем беспокоиться. Но это не правда. "sf Firewall" предотвращает большинство атак, но не все. Подобно запертой двери, брандмауэр создает препятствия на пути злоумышленника. Но если взломщик очень постарается, он может разбить стекло или вышибить дверь. В этом случае, он, скорее всего, произведет большой шум и наша программа поможет вам обнаружить его, увеличивая ваши шансы на успех.

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

Вы не будете защищены от подслушивания паролей. Если вы предоставляете ограниченый доступ в вашу сеть из Интернет с помощью паролей, используйте системы с одноразовыми паролями.

Для полной уверенности в подлинности собеседника используйте специальные системы, например Kerberos.

И наконец, прочитайте все-таки документацию - если вы неправильно настроите программу, то никто вам не поможет... Copyright ї 1996 Robert Muchsel и Roland Schmid. Чтобы послать ваши комментарии и предложения щелкните здесь.


  • Главная
  • Новости
  • Новинки
  • Скрипты
  • Форум
  • Ссылки
  • О сайте




  • Emanual.ru – это сайт, посвящённый всем значимым событиям в IT-индустрии: новейшие разработки, уникальные методы и горячие новости! Тонны информации, полезной как для обычных пользователей, так и для самых продвинутых программистов! Интересные обсуждения на актуальные темы и огромная аудитория, которая может быть интересна широкому кругу рекламодателей. У нас вы узнаете всё о компьютерах, базах данных, операционных системах, сетях, инфраструктурах, связях и программированию на популярных языках!
     Copyright © 2001-2024
    Реклама на сайте