Перед прочтением этой части главы, Вы должны иметь установленный пакет iptables, как описано в предыдущем разделе.
Общим назначением экрана является защита компьютера или сети от злостных вторжений.
В хорошем мире каждый демон или сервис на каждой машине отлично настроен и имеет иммунитет к таким дефектам, как переполнение буфера или другим проблемам, нарушающим их безопасность. Более того, Вы доверяете каждому пользователю, получающему Ваши сервисы. В таком мире Вам не надо иметь экран.
Хотя в реальном мире демоны могут быть не настроенными и разработанными вопреки необходимым сервисам и являться свободно доступными. Вы можете захотеть выбрать сервис, доступный на некоторых машинах, или Вы можете захотеть ограничить машины или приложения, разрешенные для внешнего доступа, либо просто не доверять некоторым из приложений или пользователей. Возможно, Вы подключены к интернет. В таком мире экран необходим.
Не думайте, что наличие экрана сделает лишней осторожную конфигурацию, или что он сделает любое невнимание к конфигурации безвредным. Имея экран, необходимо содержать приложения и демоны в системе правильно настроенными и обновленными. Экран не является лекарством от всего, но должен быть важной частью Вашей общей стратегии безопасности.
Слово "экран" может иметь несколько различных значений.
Это аппаратное устройство или программа, коммерчески продаваемая такими компаниями, как Symantec, которая требуется для безопасности компьютера, имеющего доступ в интернет. Этот тип экрана является очень подходящим для пользователей, которые не знают, как их компьютеры могут быть доступны через интернет или как убрать этот доступ, особенно, если их подключение постоянно.
Это система, находящаяся между интернет и интранет. Для уменьшения риска от компромиссов самого экрана, он обычно имеет только одно назначение: защита интранет. Хотя освобождение от риска не полное, задачи маршрутизации и IP-маскарадинга (перезаписанные IP-заголовки пакетов он перенаправляет от клиентов с личными IP-адресами в интернет так, что они выглядят приходящими от самого экрана) являются общерассмотренными относительно безопасности.
Это часто старый компьютер, выполняющий функции маскарадинга или маршрутизации, но предлагающий не-экранирующие сервисы, например, интернет-кэша или почты. Это может быть использовано для домашних сетей, но не рассмотрено потому, что комбинация сервера и маршрутизатора/экрана на одной машине поднимает комплексность установки.
Этот вариант выполняет маскарадинг или маршрутизацию, но допускает общественный доступ к некоторым ответвлениям сети, которые, имея общественные IP-адреса и физически разделенную структуру, являются важными отдельными сетями с прямым доступом в интернет. Сервера в такой сети должны быть легко доступны как из интранет, так и из интернет. Экран защищает обе сети. Такой тип экрана имеет минимум три сетевых интерфейса.
Этот тип экрана выполняет маскарадинг или маршрутизацию, но не содержит таблицу состояния текущих потоков связи. Он быстр, но достаточно ограничен в своей способности блокировать подходящие пакеты без блокирования желательных пакетов.
Это введение в установку экрана не является полным руководством по безопасности системы. Установка экрана это комплексная задача, требующая осторожной конфигурации. Приведенные здесь скрипты просто дают примеры работы экрана. Они не предназначены для размещения в любой частной конфигурации и не могут предоставить полную защиту от атак.
Настройка этих скриптов для Вашей специфической ситуации будет необходима для оптимальной конфигурации, но Вы должны серьезно изучить документацию по iptables и созданию экранов вообще. Обратитесь к списку Дополнительного чтения по организации экрана в конце этого раздела для получения больших деталей. Здесь Вы найдете список адресов, содержащих достаточно исчерпывающую информацию о построении Вашего собственного экрана.
Скрипт конфигурации экрана, установленный в последнем разделе, отличается от стандартного скрипта конфигурации. Он имеет только две стандартных цели: start и status. Остальные цели пустые и заблокированные. Например при запуске:
/etc/rc.d/init.d/iptables start
экран будет перезапущен, как при старте системы. Цель status предоставит список всех включенных в данный момент правил. Пустые цели выключают все правила экрана, а цель lock заблокирует все пакеты в и из компьютера, включая кольцевой интерфейс.
Основной запуск экрана расположен в файле /etc/rc.d/rc.iptables. Разделы, описанные ниже, предоставляют три различных подхода, которые могут быть использованы в системе.
Вы должны всегда запускать Ваши правила для экрана из скрипта. Это подтвердит постоянство и запись того, что произошло. Это также позволит сохранить комментарии, полезные для понимания правил, через длительное время после их написания.
Личный экран разработан, чтобы дать Вам доступ ко всем сервисам, предлагаемым в интернет, но держать Вашу систему и данные в безопасности.
Ниже представлена слегка измененная версия рекомендаций Rusty Russell из Linux 2.4 Packet Filtering HOWTO. Они еще применимы к ядрам Linux 2.6.
cat > /etc/rc.d/rc.iptables << "EOF" #!/bin/sh # Begin $rc_base/rc.iptables # Insert connection-tracking modules # (not needed if built into the kernel) modprobe ip_tables modprobe iptable_filter modprobe ip_conntrack modprobe ip_conntrack_ftp modprobe ipt_state modprobe ipt_LOG # Enable broadcast echo Protection echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts # Disable Source Routed Packets echo 0 > /proc/sys/net/ipv4/conf/all/accept_source_route # Enable TCP SYN Cookie Protection echo 1 > /proc/sys/net/ipv4/tcp_syncookies # Disable ICMP Redirect Acceptance echo 0 > /proc/sys/net/ipv4/conf/all/accept_redirects # Don't send Redirect Messages echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects # Drop Spoofed Packets coming in on an interface, where responses # would result in the reply going out a different interface. echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter # Log packets with impossible addresses. echo 1 > /proc/sys/net/ipv4/conf/all/log_martians # be verbose on dynamic ip-addresses(not needed in case of static IP) echo 2 > /proc/sys/net/ipv4/ip_dynaddr # disable Explicit Congestion Notification # too many routers are still ignorant echo 0 > /proc/sys/net/ipv4/tcp_ecn # Set a known state iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUTDROP # These lines are here in case rules are already in place and the # script is ever rerun on the fly. We want to remove all rules and # pre-exisiting user defined chains before we implement new rules. iptables -F iptables -X iptables -Z iptables -t nat -F # Allow local-only connections iptables -A INPUT-i lo -j ACCEPT # Free output on any interface to any ip for any service # (equal to -P ACCEPT) iptables -A OUTPUT -j ACCEPT # Permit answers on already established connections # and permit new connections related to established ones # (e.g. port mode ftp) iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # Log everything else. What's Windows' latest exploitable vulnerability? iptables -A INPUT -j LOG --log-prefix "FIREWALL:INPUT " # End $rc_base/rc.iptables EOF
Этот скрипт очень прост, он запрещает весь трафик, приходящий в Ваш компьютер, который не был инициализирован из Вашего блока, но пока Вы просто смотрите что-либо в Internet, Вы вряд ли превысите ограничения.
Если Вы часто сталкиваетесь с некоторыми задержками при доступе к ftp-серверам, смотрите на BusyBox пример 4 .
Даже если Вы имеете демоны или услуги, выполняющиеся на Вашей системе, они будут недоступны всюду, но вполне доступны непосредственно с Вашего компьютера. Если Вы хотите позволить доступ к услугам на Вашей машине, типа ssh или ping, смотрите BusyBox.
Настоящий Firewall имеет два интерфейса, один связан с intranet, в этом примере eth0, а другой связан с Internet, здесь ppp0. Чтобы обеспечивать максимальную защиту для firewall непосредственно, удостоверитесь, что не имеется никаких ненужных серверов, выполняющихся на машине, например, X11. Как общий принцип, firewall непосредственно не должен обращаться к любому недоверенному обслуживанию в сети.
cat > /etc/rc.d/rc.iptables << "EOF" #!/bin/sh # Begin $rc_base/rc.iptables echo echo "You're using the example configuration for a setup of a firewall" echo "from Beyond Linux From Scratch." echo "This example is far from being complete, it is only meant" echo "to be a reference." echo "Firewall security is a complex issue, that exceeds the scope" echo "of the configuration rules below." echo "You can find additional information" echo "about firewalls in Chapter 4 of the BLFS book." echo "http://www.linuxfromscratch.org/blfs" echo # Insert iptables modules (not needed if built into the kernel). 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 # Enable broadcast echo Protection echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts # Disable Source Routed Packets echo 0 > /proc/sys/net/ipv4/conf/all/accept_source_route # Enable TCP SYN Cookie Protection echo 1 > /proc/sys/net/ipv4/tcp_syncookies # Disable ICMP Redirect Acceptance echo 0 > /proc/sys/net/ipv4/conf/all/accept_redirects # Don't send Redirect Messages echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects # Drop Spoofed Packets coming in on an interface where responses # would result in the reply going out a different interface. echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter # Log packets with impossible addresses. echo 1 > /proc/sys/net/ipv4/conf/all/log_martians # Be verbose on dynamic ip-addresses(not needed in case of static IP) echo 2 > /proc/sys/net/ipv4/ip_dynaddr # Disable Explicit Congestion Notification # Too many routers are still ignorant echo 0 > /proc/sys/net/ipv4/tcp_ecn # Set a known state iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUTDROP # These lines are here in case rules are already in place and the # script is ever rerun on the fly. We want to remove all rules and # pre-exisiting user defined chains before we implement new rules. iptables -F iptables -X iptables -Z iptables -t nat -F # Allow local connections iptables -A INPUT-i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT # Allow forwarding if the initiated on the intranet iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A FORWARD-i ! ppp+ -m state --state NEW-j ACCEPT # Do masquerading (not needed if # intranet is not using private ip-addresses) iptables -t nat -A POSTROUTING -o ppp+ -j MASQUERADE # Log everything for debugging # (last of all rules, but before policy rules) 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 " # Enable IP Forwarding echo 1 > /proc/sys/net/ipv4/ip_forward EOF
С этим скриптом Ваш intranet должен быть приемлемо защищен от внешних нападений. Никто не должен быть способен к установке нового подключения с любым внутренним обслуживанием и, если оно маскируется, делает Ваш intranet невидимым для Internet. Кроме того, firewall должен быть относительно безопасен, потому что не имеется никаких выполняющихся услуг, которые мог бы атаковать хакер.
Если интерфейс, который Вы подключаете к Internet, не соединяется через ppp, Вы должны будете изменить ppp+ на имя интерфейса, например, eth1, который Вы используете.
Этот скрипт не очень отличается от маскирующего маршрутизатора, но дополнительно предлагает некоторые услуги Вашему intranet. Примером этого может быть то, когда Вы хотите управлять firewall с другого компьютера в intranet, использовать этот как прокси или сервер имен.
Структурирование истинного понятия того, как защищать сервер, который предлагает услуги по Internet, идет далеко за пределы контекста этого документа. Смотрите ссылки в конце этого раздела для подробной информации.
Будьте осторожны. Каждый сервис, который Вы допустили, делает установку более сложный, а firewall менее безопасным. Вы подвергнуты рискам ошибочно настроенных сервисов или выполнения обслуживания с годной для использования ошибкой. Firewall не должен вообще выполнить никакие дополнительные услуги.
Если Вы хотите добавлять услуги типа внутреннего samba или сервера имен, которые не должны обратиться к Internet самостоятельно, дополнительные инструкции очень просты и должны все еще быть приемлемы из точки зрения защиты. Только добавьте следующие строки в скрипт перед правилами регистрации.
iptables -A INPUT-i ! ppp+-j ACCEPT iptables -A OUTPUT -o ! ppp+-j ACCEPT
Если серверы типа squid, должны обратиться к Internet самостоятельно, Вы могли бы открывать OUTPUT вообще и ограничивать INPUT.
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -j ACCEPT
Однако, вообще не желательно оставить OUTPUT неограниченным. Вы теряете любой контроль над троянами и получаете немного избыточности в случае, если имеете (плохо?) сконфигурированные серверы, которые посылают во внешнюю сеть широковещательные сообщения.
Чтобы выполнять это, Вы должны ограничить INPUT и OUTPUT на всех портах за исключением тех, что абсолютно необходимо иметь открытыми. Которые порты Вы должны открыть, зависит от Ваших потребностей: обычно Вы найдете их, ища неудачные доступ в Ваших журналах.
Взгляните на следующие примеры:
Squid кэширует web:
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
Вы хотите быть способным к ping на Ваш компьютер, чтобы гарантировать, что он все еще действующий:
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
Чтобы регистрировать и отклонить недопустимые пакеты (пакеты, которые пришли после окончания времени ожидания netfilter или некоторые типы сканирования сети):
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-spoofing:
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 (связь локальных сетей) и 192.0.2.0/24 (определенная IANA сеть для разных тестов).
Если Ваш firewall является клиентом DHCP, Вы также должны позволить эти пакеты:
iptables -A INPUT-i ppp0 -p udp -s 0.0.0.0 --sport 67 \ -d 255.255.255.255 --dport 68 -j ACCEPT
Чтобы упростить отладку и быть честным к любому, кто хотел бы обратиться к обслуживанию, которое Вы отключили, преднамеренно или по ошибке, Вы могли бы отклонять те пакеты, которые запрещены.
Очевидно, это должно быть выполнено непосредственно после регистрации как самые последние строки прежде, чем пакеты запрещены, стратегией:
iptables -A INPUT -j REJECT
Это только примеры, чтобы показать Вам некоторые из возможностей firewall кода в Linux. Взгляните на man-страницу iptables. Там Вы найдете много подробной информации. Номера портов, необходимые для этого, могут быть найдены в /etc/services.
В заключение, имеется один факт, который Вы не должны забыть: усилие, потраченное на взлом системы, соотносится с выгодой, которую хакер планирует получить от этого. Если Вы ответственны за ценную информацию, Вы должны тратить определенное время, чтобы защитить ее правильно.
www.netfilter.org: Homepage of the netfilter/iptables project
Netfilter related FAQ
Netfilter related HOWTO's
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.ibm.com/developerworks/security/library/s-fire.html
www.ibm.com/developerworks/security/library/s-fire2.html
www.interhack.net/pubs/fw-faq/
www.linuxsecurity.com/docs/
www.little-idiot.de/firewall (German & outdated, but very comprehensive)
www.linuxgazette.com/issue65/stumpel.html
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.linux-firewall-tools.com/linux/
logi.cc/linux/athome-firewall.php3
www.insecure.org/reading.html
www.robertgraham.com/pubs/firewall-seen.html
Last updated on 2005-03-13 00:24:56 -0700.