Иммунитет для Linux
Александр Красоткин
Перед всеми, кто пользуется сетевыми коммуникациями, встает достаточно
серьезная задача сетевой безопасности. Если компьютер подключен к Интернету, то
пользователя всегда волнует вопрос: будут или нет взламывать систему? Но
подобная формулировка, пожалуй, неверна. Точнее было бы спросить: когда же
попытаются ее взломать? Ответ таков: сразу же, как только вы подключитесь к
Интернету. Низкий моральный уровень определенного слоя обитателей Сети,
доступность автоматизированных программных средств исследования и взлома систем,
а также самостоятельные сетевые <черви> и вирусы, охотники за корпоративными
секретами, войны, развязываемые хакерами, - все это и многое другое превращает
Интернет в довольно небезопасное место, некое подобие мегаполиса, где новейшие
технологии используются в бандитских разборках.
Проект Iptables
Основателем и идейным вдохновителем этого проекта стал Пауль Рассел. Сейчас
проект развивается и поддерживается группой из пяти разработчиков, задающих
основное направление, и множеством энтузиастов Linux. Основная часть функций
пакетной фильтрации Iptables, вошедшая в код ядра операционной системы, может
быть скомпилирована либо как часть ядра, либо в виде отдельных модулей.
Брандмауэр распространяется бесплатно, по условию соблюдения GNU GPL (GPL,
General Public License - стандартная публичная лицензия). Web-сайт разработчиков
- www.iptables.org.
Использование Iptables предоставляет возможности:
- пакетной фильтрации сетевого трафика - функции брандмауэра;
- маскировки или преобразования IP-адресов (DNAT, SNAT, MASQUERADE);
- прозрачного проксирования трафика;
- изменения параметров IP-заголовка сетевого пакета (например, изменение
параметра TOS - Type Of Service - позволяет установить определенный вариант
маршрутизации).
Получение и установка
Последняя доступная на момент публикации статьи версия Iptables 1.2.7a была
обнародована 26 августа 2002 г. Переписать дистрибутив брандмауэра, файл с
цифровой подписью и PGP-ключом можно по ссылкам: http://www.iptables.org/files/iptables-1.2.7a.tar.bz2
(брандмауэр), http://www.iptables.org/files/iptables-1.2.7a.tar.bz2.
sig (цифровая подпись), http://www.iptables.org/files/coreteam-gpg-key.txt
(PGP-ключ).
Чтобы установить брандмауэр, включите поддержку Iptables в ядре, а также те
опции Iptables, которые вы собираетесь использовать в составе ядра или отдельных
модулей. Нужно обратить внимание на перечисленные ниже параметры сборки
ядра:
CONFIG_PACKET - требуется для приложений, работающих непосредственно с
сетевыми устройствами, например tcpdump или snort.
CONFIG_NETFILTER - необходим тогда, когда компьютер служит сетевым
экраном (firewall) или шлюзом (gateway) в Интернете.
CONFIG_IP_NF_CONNTRACK - модуль для трассировки соединений, также
используется при трансляции сетевых адресов и маскарадинге (NAT и Masquerading).
Так что если вы решили строить сетевой экран - брандмауэр для локальной сети, то
вам определенно потребуется эта опция.
CONFIG_IP_NF_FTP - модуль трассировки FTP-соединений. Обмен по FTP
происходит слишком интенсивно, чтобы можно было использовать обычные методы
трассировки.
CONFIG_IP_NF_IPTABLES - необходим для выполнения операций фильтрации,
преобразования сетевых адресов (NAT) и маскарадинга (masquerading).
CONFIG_IP_NF_MATCH_LIMIT - модуль не обязателен. Он предоставляет
возможность ограничения количества проверок для некоторого правила. Например, -m
limit -limit 3/minute указывает, что заданное правило может пропустить не более
трех пакетов в минуту. Таким образом, данный модуль способен защитить от
нападений типа Отказ в обслуживании.
CONFIG_IP_NF_MATCH_MAC - модуль позволяет строить правила, основанные
на MAC-адресации. Поскольку каждая сетевая карта имеет собственный уникальный
Ethernet-адрес, то можно блокировать пакеты, поступающие с определенных
MAC-адресов, или выполнять привязку IP-адреса к MAC-адресу карты.
CONFIG_IP_NF_MATCH_MARK - необязательная функция маркировки пакетов
(MARK). С ее помощью можно помечать требуемые пакеты, а затем в других таблицах
в зависимости от значения метки принимать решение о маршрутизации такого
пакета.
CONFIG_IP_NF_MATCH_MULTIPORT - модуль позволяет строить правила с
проверкой на принадлежность пакета к диапазону номеров портов
источника/приемника.
CONFIG_IP_NF_MATCH_TOS - модуль помогает строить правила на основе
состояния поля TOS (Type Of Service) в пакете, а также устанавливать или
сбрасывать биты этого поля в правилах таблицы mangle.
CONFIG_IP_NF_MATCH_TCPMSS - опция добавляет возможность проверки поля
MSS для TCP-пакетов.
CONFIG_IP_NF_MATCH_STATE - одно из самых серьезных усовершенствований
по сравнению с ipchains. Этот модуль предоставляет возможность управления TCP
пакетами на основе их состояния (state).
CONFIG_IP_NF_MATCH_UNCLEAN - модуль реализует проведение
дополнительной проверки IP-, TCP-, UDP- и ICMP-пакетов для обнаружения в них
несоответствий, <странностей>, ошибок.
CONFIG_IP_NF_FILTER - модуль реализации таблицы filter, где в основном
и происходит фильтрация и где находятся цепочки INPUT, FORWARD и OUTPUT. Он
обязателен, если вы планируете осуществлять фильтрацию пакетов.
CONFIG_IP_NF_TARGET_REJECT - добавляется действие REJECT,
обеспечивающее передачу ICMP-сообщения об ошибке в ответ на входящий пакет,
отвергаемый заданным правилом. TCP-соединения, в отличие от UDP и ICMP, всегда
завершаются или отвергаются пакетом TCP RST.
CONFIG_IP_NF_TARGET_MIRROR - возможность отправки обратно полученного
пакета, поменяв местами адреса отправителя и получателя (отражение).
CONFIG_IP_NF_NAT - NAT, т. е. трансляция сетевых адресов в различных
ее видах. С помощью этой опции вы сможете предоставить выход в Интернет всем
компьютерам локальной сети при наличии лишь одного уникального IP-адреса.
CONFIG_IP_NF_TARGET_MASQUERADE - маскарадинг, в отличие от NAT
используемый тогда, когда IP-адрес в Интернете неизвестен заранее, т.е. для
DHCP, PPP, SLIP или какого-либо другого способа подключения, подразумевающего
динамическое получение IP-адреса. Маскарадинг несколько повышает высокую
нагрузку на компьютер по сравнению с NAT, однако он работает в таких ситуациях,
когда нельзя заранее указать собственный внешний IP-адрес.
CONFIG_IP_NF_TARGET_REDIRECT - перенаправление. Вместо того чтобы
просто пропустить пакет дальше, это действие перенаправляет его на другой порт
сетевого экрана. Обычно это действие применяется совместно с proxy. Иными
словами, есть возможность выполнять <прозрачное проксирование>.
CONFIG_IP_NF_TARGET_LOG - модуль добавляет действие LOG в iptables,
фиксирует отдельные пакеты в системном журнале (syslog), что бывает весьма
полезно при отладке сценариев.
CONFIG_IP_NF_TARGET_TCPMSS - опция, помогающая преодолевать
ограничения, накладываемые отдельными провайдерами (Internet Service Providers),
блокирующими пакеты ICMP Fragmentation Needed.
CONFIG_IP_NF_COMPAT_IPCHAINS - добавляет совместимость с более старой
технологией ipchains. Вполне возможно, что совместимость подобного рода будет
сохранена и в ядрах серии 2.6.x.
CONFIG_IP_NF_COMPAT_IPFWADM - обеспечивает совместимость с ipfwadm,
несмотря на то, что это очень старое средство построения брандмауэров.
Информация по конфигурированию и установке брандмауэра находится в файле
INSTALL. В данном случае установка выглядит так: $ bzip2 -cd iptables-1.2.7a.tar.bz2 | tar
-xvf -
$cd iptables-1.2.7a
$make KERNEL_DIR=/usr/src/linux
$/bin/su root
# make install KERNEL_DIR=/usr/src/linux
В переменной KERNEL_DIR следует указать путь к исходнным текстам ядра.
Если требуется установить файлы для разработчика: дополнительные библиотеки и
документацию, выполните: # make install-devel
Хотите использовать статическую компиляцию библиотек Iptables к ядру, что
освобождает от необходимости загружать модули при запуске, выполните: $make NO_SHARED_LIBS=1
Если нужно установить систему по определенному пути, отличному от
используемого по умолчанию (/usr/local/bin, /usr/local/lib, /usr/local/man),
то: $make BINDIR=/usr/bin LIBDIR=/usr/lib
MANDIR=/ usr/man
$make BINDIR=/usr/bin LIBDIR=/usr/lib
MANDIR=/ usr/man install
После изменения конфигурации ядра его необходимо перекомпилировать и
установить.
Методика работы
Когда пакет приходит на брандмауэр, то сначала он попадает на сетевое
устройство, перехватывается соответствующим драйвером и направляется в ядро.
Далее пакет проходит ряд таблиц (Mangle, Nat, Filter) и цепочек в составе этих
таблиц (например, предопределенные цепочки PREROUTING, OUTPUT, POSTROUTING в
таблице Nat) и либо передается локальному приложению, либо переправляется на
другую машину. Порядок следования пакета приведен в табл.
1.
Значит, прежде чем пакет будет перенаправлен далее, он пройдет несколько
этапов. Причем на каждом из них пакет может быть остановлен, будь то цепочка
Iptables или что-либо еще, но нас интересует Iptables. Заметьте, что нет никаких
цепочек, специфичных для отдельных интерфейсов или чего-либо подобного. Цепочку
FORWARD проходят все пакеты, перемещающиеся через наш брандмауэр/роутер. Не
используйте цепочку INPUT для фильтрации транзитных пакетов, они туда просто не
попадают. Через эту цепочку движутся только те пакеты, которые предназначены
данному хосту!
А теперь рассмотрим порядок движения пакета, предназначенного локальному
процессу/приложению (он приведен в табл.
2).
Важно помнить, что на этот раз пакеты идут через цепочку INPUT, а не через
FORWARD. И в заключение рассмотрим порядок движения пакетов, созданных
локальными процессами (табл. 3).
Более подробную информацию о видах таблиц и цепочек можно получить из
документации, поставляемой с системой, или из приведенных ниже источников.
Вопросы и примеры
?Каким образом с помощью одного внешнего
сетевого адреса могут работать в Интернете все клиенты локальной сети?
Это классический случай применения SNAT. Использовать действие MASQUERADE
целесообразно лишь в случае получения динамического IP-адреса. #!/bin/sh
IPTABLES="/usr/local/sbin/iptables"
INET_IFACE = eth0
INET_IP_1="XXX.XXX.XXX.XXX"
...
#включить здесь или в sysctl.conf разрешение на пересылку пакетов -
необходимо для шлюза echo "1">/proc/sys/net/ipv4/ip_forward
...
$IPTABLES -t nat -A POSTROUTING -o
$INET_IFACE -j SNAT -to-source $INET_IP_1
?Как поступить, если один адрес из локальной
сети ($INNER) нужно транслировать во внешнюю сеть отдельно от остальных в
случае, когда есть несколько внешних IP-адресов?
Необходимо создать фиктивный внешний интерфейс (например, когда имеется
реальный интерфейс eth0, то фиктивный будет eth0:0) и присвоить ему требуемый
IP-адрес ($INET_IP_2). Дальнейшие действия в Iptables: $IPTABLES -t nat -A POSTROUTING
-s $INNER -j SNAT -to-source $INET_IP_2
$IPTABLES -t nat -A POSTROUTING
-o $INET_IFACE -j SNAT
-to-source $INET_IP_1
?Как перенаправить сетевой трафик на локальный
порт?
Все это выполняется действием Redirect. Перенаправление производится на
другой порт той же самой машины. Действие может выполняться только в цепочках и
подцепочках PREROUTING и OUTPUT таблицы Nat.
Действие REDIRECT очень удобно для прозрачного проксирования (transparent
proxying), когда машины в локальной сети даже не подозревают о существовании
прокси. В частности, пакеты, поступающие на HTTP-порт можно перенаправить на
порт HTTP proxy, например: $IPTABLES -t nat -A PREROUTING -p tcp
-dport 80 -j REDIRECT -to-ports 3128
Можно произвести перенаправление на диапазон портов, указываемый ключом,
например: -to-ports 40000-40100.
В этом случае необходимо указать используемый протокол (TCP или UDP) ключом
-protocol.
?Как перенаправить сетевой трафик на порт
удаленного сервера?
Для выполнения данной операции следует в цепочке PREROUTING таблицы Nat
изменить адрес и порт получателя полученного сетевого пакета (действие DNAT).
Затем нужно разрешить прохождение транзитного трафика между отправителем и новым
получателем в цепочке FORWARD. И наконец, требуется заменить адрес отправителя
пакета (действие SNAT) в цепочке POSTROUTING таблицы Nat.
В приведенном отрывке скрипта показан пример перенаправления smtp- и
pop-трафика с одного сервера на другой. $cat rc.add2mail
#!/bin/sh
#
IPTABLES="/usr/local/sbin/iptables"
MAILEXT="XXX.XXX.XXX.XXX"
MAILINT="YYY.YYY.YYY.YYY"
# для сети 192.168.1.0/24
# pop3-сервис
$IPTABLES -t nat -I PREROUTING -i eth1
-s 192.168.1.0/24 -d $MAILEXT -p tcp
-dport 110
-j DNAT -to $MAILINT:110
$IPTABLES -I FORWARD -s 192.168.1.0/24
-d $MAILINT -i eth1 -o eth1
-p tcp -dport 110 -j ACCEPT
# smtp-сервис
$IPTABLES -t nat -I PREROUTING -i eth1
-s 192.168.1.0/24 -d $MAILEXT -p tcp
-dport 25
-j DNAT -to $MAILINT:25
$IPTABLES -I FORWARD -s 192.168.1.0/24
-d $MAILINT
-i eth1 -o eth1 -p tcp -dport 25 -j ACCEPT
# общая часть
$IPTABLES -t nat -I POSTROUTING -o eth1
-s 192.168.1.0/24 -d $MAILINT -j SNAT
-to 192.168.1.5
Поддержка
Если в процессе работы возник сложный вопрос по Iptables, то, вероятно, вас с
удовольствием просветит ближайший Linux-гуру, а Linux-сайты часто являются
местными фан-клубами Iptables. В сети выложено множество материалов, тематически
связанных с Iptables, так что прежде чем изобретать велосипед, проверьте, вдруг
он уже придуман, отлажен и выпускается серийно. Если же ваша задача так и не
разрешилась, обратитесь к разработчикам. Посмотрите, кто был автором того
модуля, с которым связаны ваши затруднения, и обращайтесь прямо к нему.
Заключение
Сетевая безопасность - комплексный вопрос. После настройки брандмауэра не
стоит забывать об уязвимости сетевых сервисов. Можно проверить надежность,
исследовав защиту с внешней стороны и попробовав ее взломать. Если взлом не
увенчается успехом, то все равно рано радоваться. Не исключено, что просто вам
не хватило квалификации. Кроме того, не забывайте про пользователей в вашей
локальной сети и социальную инженерию. Бывает, деятельность отдельных
самонадеянных индивидов просто приводит всех в изумление. Так что, возможно,
установка и настройка брандмауэра будут самыми несложными задачами.
В общей сложности нужно контролировать не только сетевой трафик (пакетная
фильтрация), но и содержимое потоков обмена данными на уровне приложений
(например, для Web и трафика e-mail это элементы ActiveX, Java-аплеты, cookies и
т. д.), а также сетевую активность системных сервисов и пользовательских
приложений (возможные <троянские> программы и вирусы). В общем, задача
обеспечения сетевой безопасности насколько интересная, настолько и сложная. Она
требует постоянного внимания, и вряд ли удастся ее окончательно решить, не
предприняв такие кардинальные меры, как отключение от сети, выключение питания,
разбивка жесткого диска и установка охраны.
Об авторе Александр Красоткин - программист, системный
администратор, начальник отдела предоставления Интернет-услуг ОАО <ТМБЦ>.
С автором можно связаться по адресу: shura@tibc.ru
Ссылки и дополнительные материалы
В рамках одной ознакомительной статьи нельзя подробно осветить обширную тему,
затрагивающую построение межсетевых экранов, фильтрацию и операции с сетевыми
пакетами. Поэтому имеет смысл обратить внимание на следующие ресурсы и
документы.
С этого нужно начинать http://www.tldp.org/LDP/solrne/
Securing-Optimizing-Linux-TheUltimate-Solution-v2.0.pdf
Руководство по Iptables. Автор Oskar Andreasson http://www.iptables.org/documentation/
tutorials/blueflux/
Часто задаваемые вопросы по Iptables http://www.iptables.org/documentation/
FAQ/netfilter-faq.html
Packet Filtering HOWTO http://www.iptables.org/documentation/
HOWTO//packet-filtering-HOWTO.html
Networking Concepts HOWTO http://www.iptables.org/documentation/
HOWTO/networking-concepts-HOWTO.html
NAT HOWTO http://www.iptables.org/documentation/
HOWTO/NAT-HOWTO.html
Разное Securing & Optimizing Linux: The Ultimate Solution
http://www.tldp.org/LDP/solrhe/
Securing-Optimizing-Linux-The-Ultimate-Solution-v2.0.pdf
Сайты http://www.linuxguruz.org/iptables/
Другие брандмауэры Ipchains Ipfw IPFilter для OpenBSD
Packet Filter
Дополнительные программы
Наряду с продуктами, рассмотренными в статье, рекомендую обратить внимание на
несколько достаточно важных и интересных программ.
Nessus - сетевой сканер вторжения. Предназначен для поиска уязвимых и
слабо защищенных сетевых сервисов. Сканер разработан по технологии клиент -
сервер. Применяется модульная архитектура, расширяющая функциональность сканера.
Для описания уязвимых мест используется специальный язык NASL (Nessus attack
script language). Материал о сетевом сканере Nessus см.в <Мире ПК>, №3/03.
Сайт разработчика: www.nessus.org.
Nmap - сетевой сканер портов. Рекомендуется для определения доступных
и закрытых брандмауэром сетевых сервисов. В процессе работы доступны несколько
оригинальных методик сканирования. Позволяет с высокой степенью точности
произвести оценки типа и версии операционной системы сканируемого хоста.
Изначально разработанный для UNIX-систем, сканер был портирован на
Windows-платформу. Сайт разработчика: www.nmap.org. Существует локализованная версия nmap с
некоторыми дополнениями на русском языке (www.nmap.ru).
Snort - система анализа сетевого трафика системы. Позволяет по
характерным признакам распознавать попытки проведения сетевых атак, сканирования
системы и сетевой активности <троянских> программ. Имеется возможность
оповещения администратора в случае обнаружения атаки. На базе snort можно
построить свою систему IDS (Intrusion Detection System - система обнаружения
вторжения). Сайт разработчика: www.snort.org
Все рассмотренные программные продукты распространяются свободно, в исходных
кодах на условиях лицензии GNU GPL (General Public License).
|