Идёт загрузка страницы...

htp://aptem.net.ru





Лед и пламя№30(201)/22.07.2002

Сергей ЯРЕМЧУК grinder@ua.fm
В настоящее время проблема защиты информации в сети Интернет стоит
весьма остро. Организации тратят огромные деньги на различные
системы защиты, но спасает это не всегда. А что делать обычному
пользователю, у которого нет достаточных средств для защиты
информации от посторонних глаз? Остается обратиться к специальным
программным средствам.
Я, конечно, не думаю, что на компьютер рядового пользователя будет
охотиться какая-нибудь хакерская группа, но из простого любопытства
или по случайности очень даже может быть. Поэтому затронутая тема
все же заслуживает внимания. Одним из способов защиты от
несанкционированного доступа является применение firewall'а (другими
словами, брандмауэра или межсетевого экрана) — программы,
предназначенной для фильтрации сетевого трафика. Делается это с
целью уменьшения вероятности несанкционированного проникновения из
одной части Сети в другую, а также с целью ограничения доступа из
внутренней сети к определенным ресурсам внешней (ну скажите, зачем в
нормальном офисе доступ к чатам и развлекательным web-порталам?)
Попутно такие программы могут обеспечивать блокировку рекламы и
активного содержания web-страниц. Одним из вариантов атаки является
негласная установка различных программ для удаленного управления или
кражи паролей с компьютера жертвы (слово «троян», я думаю, знакомо
многим) или более «легальный» вариант spyware — бесплатные
программы, которые, как правило, собирают информацию о посещаемых
страницах, ваших интересах и отправляют ее на сайт разработчика или
передают другому пользователю компьютера.
Как же работают межсетевые экраны? Вся связь в Интернете реализована
посредством протокола TCP/IP, а информация передается отдельными
пакетами. Каждый из них должен содержать IP-адрес принимающей машины
и номер порта, который определяет программу для обработки данного
пакета. А так как некоторые сервисы могут одновременно работать с
несколькими компьютерами (WWW, например), то в пакете должен
содержаться также и адрес отправителя. В состав пакетов также входят
т. н. АСК-биты (ACKnowledgement), подтверждающие прием предыдущих
пакетов. Таким образом, пакеты, являющиеся частью уже установленного
соединения могут проходить беспрепятственно, а остальные —
обрабатываться брандмауэром.
От чего же не может защитить брандмауэр? Самое первое, что приходит
в голову, это подделка адреса отправителя. И в самом деле,
контролируя DNS или воспользовавшись одной из множества программ,
запросто можно ввести брандмауэр в заблуждение. На более высоком
уровне реализации атаки можно получить управление, попробовав
подобрать значения ISN (Initial Seqence Number), которые формируются
для каждого сеанса индивидуально, но благодаря особенностям
реализации протокола в отдельно взятой ОС их практически без проблем
можно вычислить (подобрать). Это позволит либо вклиниться в текущий
сеанс, либо начать его от имени узла, которому доверяет защищаемый
компьютер. Так же злоумышленник может вполне легально разместить
исполняемый код, например, на web-странице, и, естественно, все
пакеты, идущие оттуда, будут пропущены. Я не говорю уже о таких
особенностях протокола TCP/IP как передача пароля в незашифрованном
виде в таких сервисах как telnet, ftp и прочих, что, естественно,
создает предпосылки для возможности их перехвата. И еще: протокол
TCP разбивает длинное сообщение на более короткие фрагменты;
брандмауэры рассматривают корректность только первого из них, а
остальные пропускают беспрепятственно. Поэтому при посылке
датаграммы, не содержащей информацию более высоких уровней, есть
вероятность, что она будет принята как часть более длинного
сообщения.
Теперь, когда мы разобрались с тем, что может и что не может
firewall, давайте разберемся с конкретной реализацией. Начать я
предлагаю с ОС Linux. Почему? Да потому что firewall поддерживается
этой системой на уровне ядра, и пользователю необходимо только его
настроить. При этом, конечно, много ручной работы, но в ходе задания
правил фильтрации вы убедитесь, что в этом нет ничего сложного и
непостижимого. Проверьте есть ли у вас файл /proc/net/ip_fwchains,
если есть, то ядро уже настроено для работы. А если нет то
необходимо пересобрать ядро и включить следующие параметры:
CONFIG_FIREWALL=y
CONFIG_IP_FIREWALL=y

Для настройки фильтрации в Linux с версии 2.2 служит программа
ipchains, до того применялась программа ipfwadm. Примечательно, что
эти две программы полностью различаются по синтаксису. Мы будем
использовать ipchains, как более современную, тем более, пропатчив
ядро, можно будет использовать ее и в более старых версиях. К
пакетам в данной программе применяется набор правил (цепочка).
Небольшое уточнение: правилом обрабатывается только первый пакет,
без него невозможно будет собрать все фрагменты. Структуру правила
коротко можно охарактеризовать так: если пакет совпадает с
описанием, то с ним нужно сделать то-то и то-то. Каждой цепочка
имеет свою политику: что делать с пакетами по умолчанию, что делать
с исключениями и каковы они. Существуют три встроенные в ipchains
цепочки, которые должны быть всегда: input, forward и output (см.
Рис. 1). Поступивший пакет проходит цепочки, правило за правилом,
пока не будет обнаружено совпадение. Когда это произойдет,
определится область применения. Областью применения может быть имя
цепочки или специальное значение. Последнее может принимать одно из
следующих значений:
ACCEPT — пакет принимается;
DENY — пакет отбрасывается, отправитель думает, что пакет не дошел
до места назначения;
REJECT — то же, что и DENY, только отправителю отсылается
ICMP-сообщение о недоступности узла назначения;
MASQ — замаскарадить: можно использовать только в случае, если ядро
собрано с соответствующим параметром;
REDIRECT — пакет переадресовывается на определенный порт;
RETURN — переходит в конец цепочки без дальнейших проверок;
Определенные пользователем цепочки позволяют логически сгруппировать
правила, они вызываются из встроенных. Имя пользовательской цепочки
должно состоять из восьми символов нижнего регистра. При поступлении
пакета на вход программы первым делом проверяется контрольная сумма
— если она неправильная, то пакет, естественно, отбрасывается. Затем
проверятся корректность некоторых полей в заголовке, неправильно
сформированные пакеты отбрасываются и в системном журнале делается
запись. Далее пакет проверяется по правилам входной цепочки. Если
пакет не будет уничтожен или отвергнут, то следующим шагом, если
необходимо, производится демаскарадинг (demasquerade) пакета, и он
поступает в выходную цепочку. Если демаскарадинг не производится, то
ядро пересылает пакет в local process, если пакет предназначен для
этого компьютера, или в цепочку forward, после благополучного
прохождения которой пакет поступает в цепочку output и покидает
машину. Этот шаг обработки пакетов называется маршрутизацией
(routing). Пакеты, просто сгенерированные локальными процессами,
проходят только этапы маршрутизации и выходную цепочку. Пакеты,
сгенерированные локальными процессами и адресованные на локальный
интерфейс (loopback), проверяются на выходной цепочке по интерфейсу
lo, а затем по тому же интерфейсу на входную цепочку.
У программы ipchains довольно много параметров — все перечислять я
не буду, но с основными давайте познакомимся. Помните, что правила
прохождения проверяются по порядку, и первое правило может завершить
прохождение всей цепочки, поэтому начинать необходимо с простых
правил, а на их основе создавать более сложные.
Итак, включаем фильтр пакетов:
echo 1 > /proc/sys/net/ipv4/ip_forward

Сначала давайте выясним версию, установленную на компьютере:
[root@grinder sergej]# /sbin/ipchains --version
ipchains 1.3.10, 1-Sep-2000

У меня установлен Red Hat 7.3 2002 года и, как видите, программа
давно не обновлялась.
Теперь давайте проверим прохождение ICMP-пакетов командой ping по
внутреннему кольцу.
# ping -c 1 127.0.0.1
PING 127.0.0.1 (127.0.0.1) from 127.0.0.1 : 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=255 time=0.185 ms

--- 127.0.0.1 ping statistics ---
1 packets transmitted, 1 received, 0% loss, time 0ms
rtt min/avg/max/mdev = 0.185/0.185/0.185/0.000 ms

Теперь выполните следующую команду:
/sbin/ipchains -A input -s 127.0.0.1 -p icmp -j DENY
попробуем еще раз
# ping -c 1 127.0.0.1
PING 127.0.0.1 (127.0.0.1) from 127.0.0.1 : 56(84) bytes of data.
1 packets transmitted, 0 packets received, 100% packet loss

Как видите, пакет не прошел. Что же мы сделали? -A (add) —
добавляется новое правило во входную цепочку input; после флага -s
указывается исходный адрес (флаг -d предваряет адрес назначения),
сетевая маска или порт, адрес 0/0 используется по умолчанию и
соответствует всем адресам. Флаг -р означает протокол, здесь можно
использовать параметр all — все протоколы, — или применять
логическое инвертирование ! («все, кроме…») Так как icmp не
использует никакие порты, то либо указывается имя icmp, либо номер
типа. Последний можно узнать, если ввести /sbin/ipchains -h icmp
(просто -h без указания типа выведет справку) — вы получите примерно
такой список (сокращен):
Type Description
0 echo-reply (ping)
destination-unreachable
5 redirect
echo-request (ping)
time-exceeded (ttl-exceeded)

Как видите, программой ping используется 0 и 8 тип, тип 11
использует программа traceroute, 5 — маршрутизация, а по 3 типу
передаются очень важные системные сообщения destination-unreachable.
Отсюда вывод: ICMP-пакеты — это не только пинги, поэтому, полностью
заблокировав их, вы можете сильно замедлить передачу данных. Тип 3
вообще не советую отключать.
Чтобы удалить правило, можно воспользоваться одним из двух
вариантов: # ipchains -D input 1 (удаляет правило под номером 1 во
входной цепочке) или # ipchains -D input -s 127.0.0.1 -p icmp -j
DENY. В последнем примере мы просто заменили в -А на -D — такой
вариант удобен, если вы не знаете номер или не хотите считать его.
Если одинаковых правил несколько, то будет удалено только первое из
них.
Исходный адрес и адрес назначения (после параметров -s и -d) может
быть задан в одной из четырех форм:
в виде символического имени (localhost, http://www.linux.org);
в виде IP-адреса (127.0.0.1);
как IP-адрес с маской в виде четырех десятичных чисел
(192.168.0.0/255.255.255.0);
в виде IP-адреса с битовой маской (192.168.0.0/24);
Последние два примера абсолютно идентичны по результату: они
охватывают все узлы в диапазоне с 192.168.0.0 по 192.168.0.255.
Флаги -s и -d, как и -р, допускают инвертирование путем указания !
перед параметром. Например, так можно обозначить все пакеты, кроме
пришедших с localhost: -s ! localhost. Протоколы могут указываться
по номеру (см. файл /etc/protocols) или по имени. Вот так можно
указать на все протоколы кроме TCP — -p ! TCP. Для протоколов UDP и
TCP можно еще указать и номера портов в виде символического имени
(например, www — cм. в /etc/services) или в виде десятичного номера
(либо диапазона номеров — знак :. Например, 6000:6010 означает 11
портов в диапазоне с 6000 по 6010. Если опущена нижняя граница
диапазона, то подразумевается 0 (например, :1024, означает все порты
в диапазоне от 0 по 1024), аналогично пропущенная верхняя граница
соответствует максимальному порту т. е. 65535. По умолчанию
подразумеваются все порты. Естественно, и здесь можно использовать
инверсию — например, так выделяются все TCP-пакеты, кроме пришедших
на www (80 порт).
(Продолжение следует)


Перейти на главную страничку раздела "Интернет"