Наши партнеры








Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

На главную -> MyLDP -> Электронные книги по ОС Linux
Beyond Linux From Scratch. Version 2011-12-30
Назад 4. Безопасность Вперед

Настройка брандмауэра

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

Знакомимся с принципами создания брандмауэра

Основное назначение брандмауэра состоит в защите компьютера или сети от несанкционированного доступа.

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

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

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

Смысл понятия "Брандмауэр" ("Firewall")

Под понятием "брандмауэр" ("firewall") можно подразумевать разное.

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

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

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

Брандмауэр с демилитаризованной зоной

Такая система выполняет маскарадинг или маршрутизацию, но разрешает доступ к некоторой ветке вашей сети, которая вследствие использования общедоступных адресов IP и физически отдельной структуры, является, по сути, отдельной сетью с прямым доступом в интернет. К серверам, которые расположены в этой сети, должен быть доступ, как из интернета, так и из внутренней сети. Брандмауэр защищает обе сети. Этот тип брандмауэра имеет не менее трех сетевых интерфейсов.

Пакетный фильтр

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

Теперь вы можем начать сборку своего брандмауэра

Предосторожности

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

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

Конфигурационный скрипт брандмауэра, установленный в разделе, посвященном iptables, отличается от стандартного конфигурационного скрипта. В нем присутствуют только два стандартных задания: запуск и отображение статуса. Еще есть задание очистки clear и блокирования lock. Например, если вы наберете:

/etc/rc.d/init.d/iptables start

брандмауэр будет перезапущен точно также как и при загрузке системы. Отображение статуса выдаст список всех правил маршрутизации, используемых в данный момент. Очистка clear выключит все правила брандмауэра, а блокирование lock заблокирует все пакеты, идущие из компьютера и в компьютер, за исключением интерфейса loopback.

Основная настройка запускаемого брандмауэра находится в файле /etc/rc.d/rc.iptables. В следующих разделах описывается три разных подхода, которые можно использовать в системе.

Замечание

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

Персональный брандмауэр

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

Ниже приводится несколько измененный вариант рекомендации, предложенной Расти Расселом (Rusty Russell) в Linux 2.4 Packet Filtering HOWTO. Она также применима к ядрам Linux 2.6 (в приведенных ниже скриптах были переведены комментарии, исходные версии скриптов смотрите в оригинале - прим.пер.)

cat > /etc/rc.d/rc.iptables << "EOF"
#!/bin/sh

# Начало скрипта $rc_base/rc.iptables

# Вставка модулей, отслеживающих подключение
# (не нужны, если сборка осуществляется в ядре)
modprobe ip_tables
modprobe iptable_filter
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ipt_state
modprobe ipt_LOG

# Включается защита от широковещательного эхо-ответа
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

# Отключается маршрутизация исходных пакетов
echo 0 > /proc/sys/net/ipv4/conf/all/accept_source_route
echo 0 > /proc/sys/net/ipv4/conf/default/accept_source_route

# Включается защита от куки TCP SYN
echo 1 > /proc/sys/net/ipv4/tcp_syncookies

# Отключается разрешение на перенаправление ICMP
echo 0 > /proc/sys/net/ipv4/conf/all/accept_redirects

# Сообщения о перенаправлении не посылаются
echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects

# Отсекаются спуффинг-пакеты, поступающие на интерфейс, ответы на которые
# не должны поступать на другой интерфейс.
echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter
echo 1 > /proc/sys/net/ipv4/conf/default/rp_filter

# Запись в журнал пакетов с недопустимыми адресами.
echo 1 > /proc/sys/net/ipv4/conf/all/log_martians
echo 1 > /proc/sys/net/ipv4/conf/default/log_martians

# подробности при использовании динамических ip-адресов (не требуются в случае статического IP)
echo 2 > /proc/sys/net/ipv4/ip_dynaddr

# Отключается явное уведомление о перегрузке
# во многих маршрутизаторах это все еще игнорируется
echo 0 > /proc/sys/net/ipv4/tcp_ecn

# Установка известного состояния
iptables -P INPUT   DROP
iptables -P FORWARD DROP
iptables -P OUTPUT  DROP

# Эти сроки указаны для случая, когда правила уже записаны и  скрипт даже
# перезапускает их на лету. Мы хотим удалить все правила и,  перед тем, как мы
# реализуем новые правила, заранее имеющийся пользователь определит цепочки правил.
iptables -F
iptables -X
iptables -Z

iptables -t nat -F

# Разрешается только локальные подключения
iptables -A INPUT  -i lo -j ACCEPT

# Выдача разрешена на на любой интерфейс, на любой ip и для любого сервиса
# (это эквивалентно -P ACCEPT)
iptables -A OUTPUT -j ACCEPT

# Разрешается ответ на уже установленное подключение
# и разрешаются новые подключения, связанные с уже установленными подключениями
# (например, режим порта ftp)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Все остальное записывается в журнал. Самая последняя уязвимость для Windows?
iptables -A INPUT -j LOG --log-prefix "FIREWALL:INPUT "

# Конец скрипта $rc_base/rc.iptables
EOF
chmod 700 /etc/rc.d/rc.iptables

Этот скрипт сравнительно прост, он отсекает весь трафик, поступающий в ваш компьютер, который не был инициирован с вашего компьютера; до тех пор, пока вы просто бродите в интернете, вы вряд ли будете нарушать это правило.

Если у вас часто возникают определенные задержки в доступе к FTP-серверам, то посмотрите пример 4 для BusyBox.

Даже если у вас имеются демоны или сервисы, запущенные в системе, они будут отовсюду недоступны, кроме как с вашего компьютера. Если вы хотите разрешить доступ к сервисам на вашем компьютере, например, к ssh или ping, рассмотрите вариант BusyBox.

Маршрутизатор с маскарадингом

У настоящего брандмауэра есть два интерфейса, один из которых подключен к внутренней сети, в этом примере - eth0, а другой подключен к сети интернет, здесь - ppp0. Чтобы обеспечить максимальную безопасность самого брандмауэра, убедитесь, что нет ненужных серверов, работающих на нем, таких как X11 и другие. Согласно общему правилу, брандмауэр не должен самостоятельно обращаться к ненадежным сервисам (сервер, к которому происходит обращение, вероятно может отправить такие ответы, которые вызовут падение демона, работающего на вашей системе, или, что еще хуже, за счет переполнения буфера запустят червя).

cat > /etc/rc.d/rc.iptables << "EOF"
#!/bin/sh

# Начало скрипта $rc_base/rc.iptables

echo
echo "Вы используете пример конфигурации настройки брандмауэра,"
echo "взятый из книги Beyond Linux From Scratch."
echo "Не следует считать, что этот пример достаточно полон, он предназначен"
echo "только для изучения вопроса."
echo "Обеспечение безопасности с помощью брандмауэра является сложной задачей, которая выходит"
echo "за рамки правил конфигурирования, приведенных ниже."
echo "Дополнительную информацию о брандмауэрах"
echo "вы можете найти в главе 4 книги BLFS."
echo "http://www.linuxfromscratch.org/blfs"
echo

# Модули вставки iptables (не требуются если сборка была в ядре).

modprobe ip_tables
modprobe iptable_filter
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ipt_state
modprobe iptable_nat
modprobe ip_nat_ftp
modprobe ipt_MASQUERADE
modprobe ipt_LOG
modprobe ipt_REJECT

# Включается защита от широковещательного эхо-ответа
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

# Отключается маршрутизация исходных пакетов
echo 0 > /proc/sys/net/ipv4/conf/all/accept_source_route

# Включается защита от куки TCP SYN
echo 1 > /proc/sys/net/ipv4/tcp_syncookies

# Отключается разрешение на перенаправление ICMP
echo 0 > /proc/sys/net/ipv4/conf/all/accept_redirects

# Сообщения о перенаправлении не посылаются
echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects

# Отсекаются спуффинг-пакеты, поступающие на интерфейс, ответы на которые
# не должны поступать на другой интерфейс.
echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter

# Запись в журнал пакетов с недопустимыми адресами.
echo 1 > /proc/sys/net/ipv4/conf/all/log_martians

# подробности при использовании динамических ip-адресов (не требуются в случае статического IP)
echo 2 > /proc/sys/net/ipv4/ip_dynaddr

# Отключается явное уведомление о перегрузке
# во многих маршрутизаторах это все еще игнорируется
echo 0 > /proc/sys/net/ipv4/tcp_ecn

# Установка известного состояния
iptables -P INPUT   DROP
iptables -P FORWARD DROP
iptables -P OUTPUT  DROP

# Эти сроки указаны для случая, когда правила уже записаны и  скрипт даже
# перезапускает их на лету. Мы хотим удалить все правила и,  перед тем, как мы
# реализуем новые правила, заранее имеющийся пользователь определит цепочки правил.
iptables -F
iptables -X
iptables -Z

iptables -t nat -F

# Разрешаются только локальные подключения
iptables -A INPUT  -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# Допускается перенаправление, если они инициировано из внутренней сети
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD  -i ! ppp+ -m state --state NEW      -j ACCEPT

# Выполняется маскарадинг
# (не требуется, если во внутренней сети не используются приватные ip-адреса)
iptables -t nat -A POSTROUTING -o ppp+ -j MASQUERADE

# Все записывается в журнал для отладочных целей
# (оставшаяся часть правил, но перед правилами, определяющими политику)
iptables -A INPUT   -j LOG --log-prefix "FIREWALL:INPUT  "
iptables -A FORWARD -j LOG --log-prefix "FIREWALL:FORWARD"
iptables -A OUTPUT  -j LOG --log-prefix "FIREWALL:OUTPUT "

# Включается перенаправлление по IP
echo 1 > /proc/sys/net/ipv4/ip_forward
EOF
chmod 700 /etc/rc.d/rc.iptables

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

Замечание

Если интерфейс, через который вы подключаетесь к интернету, это не PPP, вам нужно изменить <ppp+> на имя используемого вами интерфейса (например, eth1).

Вариант BusyBox

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

Замечание

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

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

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

iptables -A INPUT  -i ! ppp+  -j ACCEPT
iptables -A OUTPUT -o ! ppp+  -j ACCEPT

Если демоны, например, squid, сами обращаются в интернет, вам, как правило, нужно будет открыть OUTPUT и ограничить INPUT.

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -j ACCEPT

Однако обычно не рекомендуется задавать OUTPUT без ограничений. Вы потеряете контроль над троянами, которые хотели бы сделать "домашний звонок", и небольшая избыточность в случае, если у вас есть (неправильно) сконфигурированный сервис, позволят им сообщить о себе в мировую сеть.

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

Рассмотрим следующие примеры:

  • Squid, кэширующий веб-трафик:
    iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT iptables -A INPUT  -p tcp --sport 80 -m state --state ESTABLISHED \
      -j ACCEPT
           
  • Ваш кэширующий сервер имен (например, named) использует UDP:
    iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
    	
  • Вы хотите иметь возможность пинговать свой компьютер с тем, чтобы знать, что он работает:
    iptables -A INPUT  -p icmp -m icmp --icmp-type echo-request -j ACCEPT
    	iptables -A OUTPUT -p icmp -m icmp --icmp-type echo-reply   -j ACCEPT
    	
  • Если вы часто обращаетесь к серверам FTP или пользуетесь чатом, вы можете обратить внимание на определенные задержки, поскольку некоторые реализации этих демонов обладают особенностью - обращаются к сервису identd, имеющемуся в вашей системе, за именем пользователя. Хотя на самом деле в этом вреда мало, не рекомендуется, чтобы в системе работал сервис identd, поскольку многие эксперты по безопасности считают, что такой сервис предоставляет слишком много дополнительной информации.

    Чтобы избежать таких задержек, вы должны отклонять такие запросы с помощью 'tcp-reset':

    iptables -A INPUT  -p tcp --dport 113 -j REJECT --reject-with tcp-reset
    	
  • Чтобы регистрировать в журнале и отклонять испорченные пакеты (пакеты, которые пришли после истечения таймаута сетевого фильтра, или некоторые типы пакетов, используемых для сканирования сети):
    iptables -I INPUT -p tcp -m state --state INVALID \
    	  -j LOG --log-prefix "FIREWALL:INVALID"
    	iptables -I INPUT -p tcp -m state --state INVALID -j DROP
    	
  • Любой, кто обращается извне, не должен указывать приватный адрес; такая атака обычно называется спуффингом IP-адресов:
    iptables -A INPUT -i ppp+ -s 10.0.0.0/8     -j DROP
    	iptables -A INPUT -i ppp+ -s 172.16.0.0/12  -j DROP
    	iptables -A INPUT -i ppp+ -s 192.168.0.0/16 -j DROP
    	

    Есть и другие адреса, которые вы, возможно, также захотите исключить: 0.0.0.0/8, 127.0.0.0/8, 224.0.0.0/3 (групповые и экспериментальные), 169.254.0.0/16 (Link Local Networks) и 192.0.2.0/24 (тестовая сеть IANA).

  • Если ваш брандмауэр является клиентом DHCP, вам нужно разрешить следующие пакеты:
    iptables -A INPUT  -i ppp0 -p udp -s 0.0.0.0 --sport 67 \
    	   -d 255.255.255.255 --dport 68 -j ACCEPT
    	
  • Чтобы упростить отладку и быть беспристрастными к тем, кто намеренно или по ошибке пытался получить доступ к службе, которая у вас отключена, вам следует указать REJECT для пакетов, которые отклонены.

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

    iptables -A INPUT -j REJECT
    	

Это только примеры, в которых вам показаны некоторые возможности настройки брандмауэра в Linux. Посмотрите страницу man по iptables. Там вы найдете гораздо больше информации. Номера портов, необходимые для этого, можно найти в /etc/services в случае, если вы не смогли найти их методом проб и ошибок в журнальном файле.

Заключение

Наконец, есть один факт, о котором вам не следует забывать: усилия, затрачиваемые на атаку системы, соответствуют тому, что взломщик ожидает от этого получить. Если вы несете ответственность за ценную информацию, нужно потратить время, чтобы правильно ее защитить.

Дополнительная информация

С чего начать дальнейшее изучение документации по брандмауэрам

www.netfilter.org - Домашняя страница проекта netfilter/iptables
FAQ относящиеся к netfilter
HOWTO относящиеся к netfilter
en.tldp.org/LDP/nag2/x-087-2-firewall.html
en.tldp.org/HOWTO/Security-HOWTO.html
en.tldp.org/HOWTO/Firewall-HOWTO.html
www.linuxsecurity.com/docs/
www.little-idiot.de/firewall (на немецком языке и устаревшее, но очень подробное описание)
linux.oreillynet.com/pub/a/linux/2000/03/10/netadmin/ddos.html
staff.washington.edu/dittrich/misc/ddos
www.e-infomax.com/ipmasq
www.circlemud.org/~jelson/writings/security/index.htm
www.securityfocus.com
www.cert.org - tech_tips
security.ittoolbox.com
www.insecure.org/reading.html

Перевод сделан с варианта оригинала, датированного 2011-10-28 18:57:13 +0000


Предыдущий раздел: Оглавление Следующий раздел:
Пакет Iptables-1.4.12   Пакет GnuPG-1.4.11