Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Системный администратор - секреты мастерства. Основы настройки брандмауэров.


Здравствуйте, уважаемые коллеги!

С вами Павел Медников, и мы продолжаем рассматривать всевозможные вопросы, связанные с администрированием компьютерных сетей. Все предыдущие статьи, а также другие мои материалы можно найти на сайте www.mednikov.ru/blog

Тема сегодняшней статьи – основные принципы настройки брандмауэров (их также называют словом firewall и термином «межсетевой экран»). Оговорюсь сразу, мы не будем рассматривать конкретные продукты конкретных производителей, а ограничимся общими принципами, зная которые можно справиться практически с любым продуктом – достаточно будет ознакомиться с его спецификой. Сегодня вас опять ждет много теории, так что запаситесь терпением!

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

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

Существуют более продвинутые решения. Например, продукты PIX и ASA компании Cisco, способны анализировать трафик по указанным администратором протоколам на предмет передачи через них нежелательных или потенциально опасных данных. Так, например, существует возможность «глушить» отдельные команды, передаваемые по протоколу SMTP с тем, чтобы предотвращать рассылку спама, вырезать определенные java-скрипты из передаваемых по сети HTML-документов, чтобы не допустить распространения сетевых вирусов через уязвимости, имеющиеся в Интернет-браузерах, и др.

THT

Я намеренно не буду заострять внимание на таких продуктах как брандмауэр Windows, Outpost Firewall, Zone Alarm, Kaspersky Anti-Hacker и др., имеющих помимо пакетного фильтра еще и функции предотвращения тех или иных потенциально опасных действий, выполняемых программами, запущенными на компьютере. Это продукты немного иного рода, имеющие расширенную функциональность, хотя, строго говоря, я не рекомендую использовать их в корпоративных сетях, потому что они ориентированы больше на применение индивидуальным пользователем. В крупной сети эти продукты доставят скорее проблемы, чем принесут пользу.

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

При установке сессии одна сторона всегда запрашивает соединение, а вторая постоянно находится в режиме ожидания и отвечает, как только ей приходит запрос. Сторона, ожидающая подключения считается сервером – она обслуживает входящие соединения и предоставляет запрошенные ресурсы, отсюда и название. Сторона, инициирующая подключение, считается клиентом, т.к. она запрашивает соединение и ресурсы у сервера. На каком бы мощном оборудовании не была организована компьютерная система, но если она делает первый шаг при установлении соединения, то считается клиентом, даже если запрос направляется дохленькой «персоналке». «Персоналка» будет в рамках данной сессии сервером, т.к. она предоставляет запрошенные у нее ресурсы.

Для описания сессии связи в IP-сетях используют понятие IP-адреса и порта. Что такое IP-адрес – это уже понятно, а что же такое порт?

Предлагаю рассматривать порты как виртуальные «двери» в систему. Всего хосту для организации сессии связи доступно 65535 портов. Пакеты данных, перемещающиеся между хостами в рамках текущей сессии, всегда используют для входа и выхода одни и те же «двери» (т.е. порты) о номерах которых хосты «договорились» в начале сессии. Это позволяет упорядочить сетевой обмен и отличать одну сессию связи от другой.

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

Сессия может осуществляться по протоколу tcp или udp. Протокол tcp используется всему службами, требующими гарантированной доставки данных: http, https, ftp, smtp, pop3, imap и другими службами, критичными к целостности данных. Он требует от получателя «докладывать» о том, что он получил данные в целости и сохранности. Поэтому обмен данными по tcp довольно медленный, а скорость обмена сильно зависит от качества канала связи. В противовес ему, протокол udp не требует подтверждения доставки, что делает сетевой обмен более быстрым. Udp используется там, где важна максимальная производительность и не критичны потери данных: передача голоса, звука, видео, трансляция логов и др.

Порты с номерами 0-1023 называются привилегированными и используются для размещения стандартных сетевых служб. Например, большинство web-серверов ждет подключение к службе http на порту 80, служба https работает на порту 443, smtp использует 25 порт, pop3 – порт 110 итд. Если на сервере запущена служба, которая принимает подключения, например, на порту 80, то мы говорим, что порт 80 у сервера открыт («дверь» открыта, и у нее стоит некто, готовый обслужить вас). Если подключение на этом порту не принимается, то порт считается закрытым (за «дверью» вообще ничего нет, либо охранник смотрит в глазок и отказывается открывать вам, если вы не похожи на человека, которого ждет хозяин).

Порты с номерами 1024-65535 используются для размещения нестандартных сервисов, а также организации исходящих соединений. При установке сессии связи клиент выбирает случайным образом любой из своих свободных портов из диапазона  1024-65535, и направляет с этого порта запрос серверу. Если в процессе работы потребуется установить еще одно соединение, оно будет инициировано с другого свободного порта, вне зависимости от того, к какому порту сервера нужно подключиться. Правило простое: новая сессия – новый клиентский порт. Сервер же может одновременно принимать на один порт множество подключений, а не запутаться, какой пакет данных принадлежит какой, сессии ему помогает ip-адрес клиента и номер клиентского порта.

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

Для начала выберем стратегию фильтрации IP-пакетов. Их может быть две «разрешено все, что не запрещено» и «запрещено все, что не разрешено». Первая стратегия более либеральна к пользователям и проста в настройке, а вторая более безопасна. Лично я предпочитаю второй вариант и буду отталкиваться от него.

Фильтровать будем IP-пакеты, поступающие как на интерфейс хоста, так исходящие с него. В качестве критериев фильтрации будут выступать:

  • протокол – tcp, udp или icmp;
  • порт отправителя пакета и/или порт получателя пакета;
  • ip-адрес отправителя и/или ip-адрес получателя пакета;
  • состояние сессии – новая или существующая

На самом деле, существуют и другие критерии, но для эффективной настройки большинства брандмауэров достаточно перечисленного.

С пакетами, проходящими через интерфейс, можно производить следующие действия:

  • Пропускать (ALLOW / ACCEPT) – пакеты проходят беспрепятственно
  • Отбрасывать (REJECT / DECLINE) – пакеты не принимаются, а отправителю отправляется icmp-уведомление о том, что доставка пакета невозможна. Такое поведение дает злоумышленнику косвенный сигнал о том, что по адресу, на который он отправляет пакеты все же есть какой-то хост, следовательно его можно попробовать на прочность. Однако иногда отправителя необходимо оповещать о невозможности доставки пакетов, и эта опция может быть полезной.
  • Игнорировать (DROP / IGNORE) – пакеты не принимаются, и отправителю не отправляется никакого уведомления.

Также пакеты можно определенным образом метить, менять содержимое заголовков IP-пакетов и др. Например, при помощи изменения заголовков можно публиковать отдельные серверные службы, расположенные за брандмауэром, не подвергая опасности остальное (действие DNAT в IPTABLES), или направлять пакеты на другой порт. В IPTABLES (интерфейс брандмауэра Linux-систем) существует, например, опция MIRROR, позволяющая перенаправить пришедший пакет обратно отправителю, таким образом хост «отзеркаливает» входящий трафик и злоумышленник принимается «ломать» свой собственный хост.

Начнем с входящего трафика – т.е. с IP-пакетов, которые поступают на наш хост извне. Сперва запретим все входящие пакеты. Многие софтверные решения изначально предоставляют возможность использовать только вторую, параноидальную стратегию настройки брандмауэра, поэтому запрещающее правило – единственное, что существует по умолчанию, притом его нельзя удалить.

Запрет всего входящего трафика «отрежет» наш хост от сети, поэтому для нормальной работы нужно будет немного ослабить защиту. Это можно сделать двояко. Вариант первый – пропускать все пакеты, относящиеся к установленным сессиям. Для этого нужно настроить брандмауэр на запрет хождения всех пакетов с установленным флагом SYN в заголовке и отсутствующим флагом ACK.

Флаг SYN в заголовке IP-пакета присутствует только в первом пакете, приходящем от клиента в момент установления соединения, и в первом ответном пакете от сервера (вместе с флагом ACK). SYN сигнализирует о том, что удаленный хост предлагает открыть сессию связи. Флаг ACK присутствует в пакетах, относящихся к уже открытым сессиям, поэтому, если мы запретим хождение какие-либо пакетов, имеющих только флаг SYN, то тем самым не дадим нашему хосту отвечать на «предложения» установить соединение и будем принимать лишь данные, относящиеся к существующим сессиям.

На самом деле, разрешить хосту принимать все пакеты с флагом ACK – не совсем надежное решение, т.к. это дает возможность злоумышленнику «закидать» нас специально сформированными пакетами с флагом ACK – зафлудить сетевой интерфейс и сделать продолжение работы невозможным. Чтобы этого не произошло, разумным шагом будет разрешить прохождение пакетов с флагом ACK только в том случае, если сессия уже установлена (брандмауэр должен уметь «запоминать» такие сессии – IPTABLES и продукты PIX и ASA это умеют).

Ниже перечислены номера портов наиболее популярных служб, которыми мы можем пользоваться:

а) Протокол tcp:
21 – ftp в passive mode
20 и 21 – ftp в active mode (необходимо разрешить входящие пакеты с SYN флагом от FTP-сервера, т.к. в рамках сессии он инициирует соединение с вашим клиентом)
22 – ssh
23 - telnet

25 - smtp
53 – dns (только для обмена dns-зонами между серверами, клиент работает с dns-сервером по udp)
80 – http
110 – pop3
143 - imap
443 – https
3389 – Windows terminal (RDP)

4899 – Remote administrator (RAdmin)
5190 – ICQ и его клоны

б) Протокол udp:
53 – dns (обычные dns-запросы от клиентов).
 

Итак, основные шаги настройки входящих соединений:

  • Запрещаем весь входящий трафик
  • Разрешаем входящие пакеты только с флагом ACK и, если брандмауэр позволяет сделать это, относящиеся только к установленным сессиям.

Если на защищаемых брандмауэром хостах работают какие-либо серверные службы, которые должны быть доступны извне, то нужно разрешить прием пакетов, приходящих на порты этих служб. Разрешающие правила должны стоять в списке правил ВЫШЕ запрещающих, т.к. при прохождении IP-пакета к нему применяется первое из правил, которому он удовлетворяет. Таким образом, пакеты, предназначенные для опубликованных служб пройдут, а все остальные будут отброшены.

Если ваши службы работают внутри частной сети (о публичных и частных сетях см. статью на соответствующую тему http://www.mednikov.ru/blog/post_1185397873.html), то правила, разрешающие пакеты, адресованные на порты этих служб, должны не просто пропускать трафик, а модифицировать заголовки IP-пакетов, изменяя адрес получателя с адреса брандмауэра на частный адрес, по которому находится ваша служба в частной сети. Если же брандмауэр разделяет две публичные сети и между ними есть маршрутизация, то достаточно просто разрешить прохождение пакета, не изменяя его заголовков.

После того, как правила для входящих пакетов настроены, нужно убедиться, что весь нужный нам трафик пропускается, а остальной – отсеивается, и скорректировать настройки, в случае необходимости. Для проверки служб, работающих по протоколу tcp, можно использовать сканеры портов и утилиту telnet, пытаясь подключиться с ее помощью к интересующему вас порту: telnet <ip-адрес> <номер проверяемого порта>. Если все настроено корректно, переходим к настройке правил для исходящего трафика.

Если вы настраиваете брандмауэр для вашей собственной машины, вам вряд ли захочется как-то ограничивать себя в действиях. Однако в корпоративных сетях не следует давать пользователям больше возможностей, чем им требуется по работе, а потому исходящий трафик также следует фильтровать. Фильтрацию можно осуществлять как на интерфейсе брандмауэра, «смотрящем» в локальную сеть (внутренний интерфейс), так и на интерфейсе, соединенном с «публичной сетью» (внешний интерфейс).

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

Далее разрешим прохождение пакетов, приходящих извне от портов служб, необходимых пользователям сети. В первую очередь разрешим хождение пакетов, отправленных за пределы сети на 53 порт по протоколу udp, чтобы обеспечить нормальную работу DNS (работоспособность службы dns можно проверить при помощи утилиты nslookup.). Затем будем открывать порты для остальных служб. Помним о том, что разрешающие правила должны стоять в списке правил выше запрещающих.

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

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

Дано: локальная сеть 192.168.0.0 / 24. Брандмауэр имеет два интерфейса: внешний адрес 217.210.21.124, внутренний 192.168.0.1 – он же является основным шлюзом для локальной сети (выполняет функции маршрутизатора). Внешний интерфейс называется eth0, внутренний eth1. Внутри сети работает хост, имеющий адрес 192.168.0.2, которым необходимо управлять по протоколу ssh (порт 22), причем доступ к нему должен быть с любого IP- адреса из сети 89.169.0.0 / 16.

Требуется: разрешить пользователям работать со службами http, https и icq, отправлять электронную почту только через smtp-сервер с адресом 82.204.216.116, но разрешить получать ее по pop3 или imap  с любого сервера из Интернет. Остальной трафик запрещен. Компьютер администратора с адресом 192.168.0.254 должен иметь неограниченный доступ, компьютер с адресом 192.168.0.100 не должен иметь доступа в Интернет вообще.

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

Копия таблицы лежит здесь: http://www.mednikov.ru/blog/documents/firewall_rules.htm

Внешний интерфейс eth0

Направление трафика

Протокол

Адрес отправителя

/

source

Порт отправителя

/

source port

Адрес получателя

/

destination

Порт получателя / destination port

Действие

Флаги

1. Разрешаем входящие tcp-пакеты из сети 89.169.0.0 / 16 на порт 22 и направляем их внутрь сети на 192.168.0.2

IN

tcp

89.169.0.0 / 16

1024 - 65535

217.210.21.124

22

Перенаправить / DNAT

на 192.168.0.2

 

2. Разрешаем входящие udp-пакеты от DNS-сервера в рамках уже установленной сессии

IN

udp

Адрес DNS-сервера

53

217.210.21.124

1024 - 65535

Разрешить / ACCEPT

 

3. Разрешаем хождение icmp-пакетов, чтобы обеспечить работу команд PING и TRACERT (traceroute)

IN

icmp

0.0.0.0

 

217.210.21.124

 

Разрешить / ACCEPT

 

4. Запрещаем все входящие tcp-пакеты, в которых присутствует флаг SYN, но нет флага ACK, т.е. пакеты, содержащие запросы на установку новой сессии

IN

tcp

0.0.0.0

0 - 65535

217.210.21.124

0 - 65535

Запретить / DROP

Есть SYN, нет ACK

5. Разрешаем все исходящие пакеты

OUT

все

0.0.0.0

0 - 65535

0.0.0.0

0 - 65535

Разрешить / ACCEPT

 

6. Запрещаем весь входящий трафик. Это правило будет применяться последним и сработает, если входящие ip-пакеты не попадают под условия, описанные в правилах 1-4

IN

все

0.0.0.0

0 - 65535

217.210.21.124

0 - 65535

Отклонить / REJECT

 

 

Внутренний интерфейс eth1

Направление трафика

 

Протокол

Адрес отправителя

/

source

Порт отправителя

/

source port

Адрес получателя

/

destination

Порт получателя / destination port

Действие

Флаги

1. Разрешаем прохождение через интерфейс eth1 пакетов, отправляемых службой ssh (порт 22) с хоста 192.168.0.2

IN

tcp

192.168.0.2

22

89.169.0.0 / 16

1024 - 65535

Разрешить / ACCEPT

 

2. Не принимаем никакие пакеты с хоста 192.168.0.100, который не должен иметь выхода в интернет

IN

все

192.168.0.100

0 - 65536

0.0.0.0

0 - 65535

Отклонить / REJECT

 

3. Разрешаем прохождение через интерфейс eth1 пакетов любых пакетов с хоста 192.168.0.254, принадлежащего администратору

IN

tcp

192.168.0.254

0 - 65535

0.0.0.0

0 - 65535

Разрешить / ACCEPT

 

4. Разрешаем прохождение через интерфейс eth1 пакетов с DNS-запросами от всех хостов локальной сети

IN

udp

192.168.0.0 / 24

1024 - 65535

Адрес DNS-сервера

53

Разрешить / ACCEPT

 

5. Разрешаем прохождение через интерфейс eth1 пакетов, адресованных smtp-службе (порт 25) хоста 82.204.216.116

IN

tcp

192.168.0.0 / 24

1024 - 65535

82.204.216.116

25

Разрешить / ACCEPT

 

6. Разрешаем прохождение через интерфейс eth1 пакетов, адресованных произвольным хостам в сети Интернет, на порты 80 (http), 443 (https), 110 (pop3), 143 (imap) и 5190 (icq)

IN

tcp

192.168.0.0 / 24

1024 - 65535

0.0.0.0

110

Разрешить / ACCEPT

 

IN

tcp

192.168.0.0 / 24

1024 - 65535

0.0.0.0

143

Разрешить / ACCEPT

 

IN

tcp

192.168.0.0 / 24

1024 - 65535

0.0.0.0

80

Разрешить / ACCEPT

 

IN

tcp

192.168.0.0 / 24

1024 - 65535

0.0.0.0

443

Разрешить / ACCEPT

 

IN

tcp

192.168.0.0 / 24

1024 - 65535

0.0.0.0

5190

 

 

7. Разрешаем всем хостам локальной PING и TRACERT (traceroute) хостов в интернет

IN

icmp

192.168.0.0 / 24

 

0.0.0.0

 

Разрешить / ACCEPT

 

8. Разрешаем «выпускать» в частную сеть пакеты, пришедшие из сети 89.169.0.0 / 16 на ssh-службу (порт 22) хоста 192.168.0.2, имеющие флаг SYN – т.е. запросы на подключение к службе

OUT

Все

89.169.0.0 / 16

1024 - 65535

192.168.0.2

22

Разрешить / ACCEPT

Есть SYN

9.  Запрещаем «выпускать» в частную сеть пакеты с установленным флагом SYN, но без флага ACK, пришедшие из Интернет.

OUT

Все

0.0.0.0

 

0.0.0.0

 

Запретить / DROP

Есть SYN, нет ACK

10. Разрешаем «выпускать» в частную сеть любые пакеты, пришедшие из Интернет. Это правило будет применяться последним и сработает, если ip-пакеты не попадают под условия, описанные в предыдущих правилах

OUT

Все

0.0.0.0

 

0.0.0.0

 

Разрешить / ACCEPT

 

11. Запрещаем прохождение через интерфейс eth1 пакетов, адресованных произвольным хостам в сети по любому из протоколов. Это правило будет применяться последним и сработает, если ip-пакеты не попадают под условия, описанные в предыдущих правилах.

IN

Все

0.0.0.0

0-65535

0.0.0.0

0-65535

Отклонить / REJECT

 

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

На этом закончим. Спасибо всем, кто нашел в себе силы одолеть столь объемный материал. Если вы чувствуете, что застряли, отложите статью на некоторое время и вернитесь к ней через 2-3 дня со свежей головой. Статью можно найти на моем сайте по адресу.

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

Предыдущие статьи данного цикла и некоторые другие материалы на ИТ-тематику вы по-прежнему можете найти на www.mednikov.ru/blog  

С уважением,
Павел Медников

P.S. Уважаемые коллеги! По понятным причинам у меня нет возможности отвечать на вопросы каждому индивидуально, но тем не менее я очень хочу, чтобы ни одного вопроса не осталось без ответа. Поэтому предлагаю вам отправлять свои вопросы при помощи web-формы, размещенной в моем блоге (кнопка e-mail в главном меню). Я буду сортировать их и готовить мини-выпуски с ответами на накопившиемя вопросы. Спасибо за понимание!
 


В избранное