RussianLDP Рейтинг@Mail.ru
WebMoney: 
WMZ Z294115950220 
WMR R409981405661 
WME E134003968233 
YandexMoney: 
41001198119846 
E-gold:
5128052

Beyond Linux From Scratch. Версия 6.0

Глава 4. Безопасность

Установка межсетевого экрана (firewall)

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

Введение в создание экрана

Общим назначением экрана является защита компьютера или сети от злостных вторжений.

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

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

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

Значение слова "экран"

Слово "экран" может иметь несколько различных значений.

Личный экран

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

Маскирующий маршрутизатор

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

BusyBox

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

Экран с демилитаризованной зоной (не описанный здесь в дальнейшем)

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

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

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

Теперь Вы можете начинать строить свой экран

[Caution]

Внимание

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

Настройка этих скриптов для Вашей специфической ситуации будет необходима для оптимальной конфигурации, но Вы должны серьезно изучить документацию по 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.

Маршрутизатор Masquerading

Настоящий 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 должен быть относительно безопасен, потому что не имеется никаких выполняющихся услуг, которые мог бы атаковать хакер.

[Note]

Примечание

Если интерфейс, который Вы подключаете к Internet, не соединяется через ppp, Вы должны будете изменить ppp+ на имя интерфейса, например, eth1, который Вы используете.

BusyBox

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

[Note]

Примечание

Структурирование истинного понятия того, как защищать сервер, который предлагает услуги по 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.