Смекни!
smekni.com

Организация безопасности сети предприятия с использованием операционной системы Linux (стр. 8 из 13)

Полная проверка справа тяжелая и длинное, часом настолько же тяжелое, как и разработка правильной конфигурации firewall, но заті защита будет действительно надежной!

Для iptables включили использование набора правил FORWARD через расхождение в реализации набора правил INPUT в netfilter. Это имеет значение: такое отличие значит, что ни одно йз правил не защищает firewall главный компьютер непосредственно. Точно подражать приклада из ipchains, ми скопировали каждое из наших правил в INPUT. Для ясности, ми пропустили все входные пакеты (datagrams), полученные из нашего внешнего интерфейса.

#!/bin/bash

############################################################

# IPTABLES VERSION

# This sample configuration is for а single host firewall configuration

# with no services supported by the firewall machine itself.

############################################################

# USER CONFIGURABLE SECTION

# The name and location of the ipchains utility.

IPTABLES=iptables

# The path to the ipchains executable.

PATH="/sbin"

# Our internal network address space and its supporting network device.

OURNET="172.29.16.0/24"

OURBCAST="172.29.16.255"

OURDEV="eth0"

# The outside address and the network device that supports it.

ANYADDR="0/0"

ANYDEV="eth1"

# The TCP services we wish to allow to pass - "" empty means all ports

# note: comma separated

TCPIN="smtp,www"

TCPOUT="smtp,www,ftp,ftp-data,irc"

# The UDP services we wish to allow to pass - "" empty means all ports

# note: comma separated

UDPIN="domain"

UDPOUT="domain"

# The ICMP services we wish to allow to pass - "" empty means all types

# ref: /usr/include/netinet/ip_icmp.h for type numbers

# note: comma separated

ICMPIN="0,3,11"

ICMPOUT="8,3,11"

# Logging; uncomment the following line to enable logging of datagrams

# that are blocked by the firewall.

# LOGGING=1

# END USER CONFIGURABLE SECTION

############################################################

# Flush the Input table rules

$IPTABLES -F FORWARD

# We want to deny incoming access by default.

$IPTABLES -P FORWARD deny

# Drop all datagrams destined for this host received from outside.

$IPTABLES -A INPUT -ые $ANYDEV -j DROP

# SPOOFING

# We should not accept any datagrams with а source address matching ours

# from the outside, so we deny them.

$IPTABLES -A FORWARD -s $OURNET -ые $ANYDEV -j DROP

# SMURF

# Disallow ICMP to our broadcast address to prevent "Smurf" style attack.

$IPTABLES -A FORWARD -m multiport -p icmp -ые $ANYDEV -d $OURNET -j DENY

# We should accept fragments, in iptables we must do this explicitly.

$IPTABLES -A FORWARD -f -j ACCEPT

# TCP

# We will accept all TCP datagrams belonging to an existing connection

# (i.e. having the ACK bit set) for the TCP ports we're allowing through.

# This should catch more than 95 % of all valid TCP packets.

$IPTABLES -A FORWARD -m multiport -p tcp -d $OURNET -іdports $TCPIN /

! -іtcp-flags SYN,ACK ACK -j ACCEPT

$IPTABLES -A FORWARD -m multiport -p tcp -s $OURNET -іsports $TCPIN /

! -іtcp-flags SYN,ACK ACK -j ACCEPT

# TCP - INCOMING CONNECTIONS

# We will accept connection requests from the outside only on the

# allowed TCP ports.

$IPTABLES -A FORWARD -m multiport -p tcp -ые $ANYDEV -d $OURNET $TCPIN /

-іsyn -j ACCEPT

# TCP - OUTGOING CONNECTIONS

# We will accept all outgoing tcp connection requests on the allowed /

TCP ports.

$IPTABLES -A FORWARD -m multiport -p tcp -ые $OURDEV -d $ANYADDR /

-іdports $TCPOUT -іsyn -j ACCEPT

# UDP - INCOMING

# We will allow UDP datagrams in on the allowed ports and back.

$IPTABLES -A FORWARD -m multiport -p udp -ые $ANYDEV -d $OURNET /

-іdports $UDPIN -j ACCEPT

$IPTABLES -A FORWARD -m multiport -p udp -ые $ANYDEV -s $OURNET /

-іsports $UDPIN -j ACCEPT

# UDP - OUTGOING

# We will allow UDP datagrams out to the allowed ports and back.

$IPTABLES -A FORWARD -m multiport -p udp -ые $OURDEV -d $ANYADDR /

-іdports $UDPOUT -j ACCEPT

$IPTABLES -A FORWARD -m multiport -p udp -ые $OURDEV -s $ANYADDR /

-іsports $UDPOUT -j ACCEPT

# ICMP - INCOMING

# We will allow ICMP datagrams in of the allowed types.

$IPTABLES -A FORWARD -m multiport -p icmp -ые $ANYDEV -d $OURNET /

-іdports $ICMPIN -j ACCEPT

# ICMP - OUTGOING

# We will allow ICMP datagrams out of the allowed types.

$IPTABLES -A FORWARD -m multiport -p icmp -ые $OURDEV -d $ANYADDR /

-іdports $ICMPOUT -j ACCEPT

# DEFAULT and LOGGING

# All remaining datagrams fall through to the default

# rule and are dropped. They will be logged if you've

# configured the LOGGING variable above.

#

if [ "$LOGGING" ] then

# Log barred TCP

$IPTABLES -A FORWARD -m tcp -p tcp -j LOG

# Log barred UDP

$IPTABLES -A FORWARD -m udp -p udp -j LOG

# Log barred ICMP

$IPTABLES -A FORWARD -m udp -p icmp -j LOG

fi

#

# end.

Во многих простых случаях все, что нужно сделать для конкретного применения этого приклада, это поправить на кочану файла блок, обозначенный “USER CONFIGURABLE section” для указания, какие протоколы и пакеты нужно пропускать. Для больше сложных конфигураций нужно поправить этот раздел целиком.

Настройка IP Accounting Поскольку IP accounting очень тесно связан из IP firewall, для их настройки используется одна программа. В зависимости от реализации это ipfwadm, ipchains или iptables. Синтаксис команды очень похож на используемый при задании правил firewall.

Общий синтаксис для IP accounting из ipfwadm:

# ipfwadm -A [direction] [command] [parameters]

Появился новый параметр direction. Он принимает значение in, out или both. Все значения считаются с точками зрения linux-машины, так что in задает входной трафик, out задает выходной трафик, а both оба типа сразу.

Общий синтаксис для ipchains и iptables:

# ipchains -A chain rule-specification

# iptables -A chain rule-specification

Команды ipchains и iptables позволяют Вам определять направление в стиле, больше похожем на определение правил. IP Firewall Chains не позволяет настроить правила для обоих направлений сразу, но позволяет настроить правила в наборе forward, чего старая реализация не умела.

Команды очень похожи на свои аналоги для правил firewall за исключением того, что стратегии здесь не применяются. Ми можем добавлять, вставлять, удалять и пересматривать список правил учета. В случае ipchains и iptables, все имеющие силу правила считаются правилами для учета, и бу-яка команда, которая не определяет опцию -j, выполняет только учет.

Параметры спецификации правила для учета IP такие же, как и для IP firewall.

Учет по адресам

Давайте на примере покажем, как бы мы использовали учет IP.

Допустимо, у нас есть Linux-роутер, что обслуживает два департамента Virtual Brewery. Он имеет два устройства Ethernet, eth0 и eth1, по одному на департамент, и одно устройство PPP, ppp0, для связи через быстродействующую последовательную связь с университетским местечком Groucho Marx University.

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

Для ответа на вопрос, сколько данных каждый отдел передает по PPP, мы могли бы использовать правило, что напоминает:

# ipfwadm -A both -я -W ppp0 -S 172.16.3.0/24 -b

# ipfwadm -A both -я -W ppp0 -S 172.16.4.0/24 -b

или:

# ipchains -A input -ые ppp0 -d 172.16.3.0/24

# ipchains -A output -ые ppp0 -s 172.16.3.0/24

# ipchains -A input -ые ppp0 -d 172.16.4.0/24

# ipchains -A output -ые ppp0 -s 172.16.4.0/24

или из iptables:

# iptables -A FORWARD -ые ppp0 -d 172.16.3.0/24

# iptables -A FORWARD -o ppp0 -s 172.16.3.0/24

# iptables -A FORWARD -ые ppp0 -d 172.16.4.0/24

# iptables -A FORWARD -o ppp0 -s 172.16.4.0/24

Первая половина кожного набора правил задает подсчет всех данных, переданных по интерфейсе ppp0 с исходным адресом или адресом назначения 172.16.3.0/24. Здесь полезная опция -b в ipfwadm и iptables. Вторая половина кожного набора правил задает то же, но для второй сети Ethernet.

Для ответа на вопрос, сколько трафика проходить между департаментами, нужно правило, которое выглядит таким способом:

# ipfwadm -A both -я -S 172.16.3.0/24 -D 172.16.4.0/24 -b

или:

# ipchains -A forward -s 172.16.3.0/24 -d 172.16.4.0/24 -b

или:

# iptables -A FORWARD -s 172.16.3.0/24 -d 172.16.4.0/24

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

Учет по портам сервисов

Допустимо, мы хотим также знати, какой именно трафик преобладает на связи через PPP. Например, нужно выяснить, сколько данных проходить по протоколам FTP, smtp и World Wide Web.

Для сбора этой информации пригоден такой скрипт с правилами:

#!/bin/sh

# Collect FTP, smtp and www volume statistics for data carried on our

# PPP link using ipfwadm

#

ipfwadm -A both -я -W ppp0 -P tcp -S 0/0 ftp ftp-data

ipfwadm -A both -я -W ppp0 -P tcp -S 0/0 smtp

ipfwadm -A both -я -W ppp0 -P tcp -S 0/0 www

или:

#!/bin/sh

# Collect ftp, smtp and www volume statistics for data carried on our

# PPP link using ipchains

#

ipchains -A input -ые ppp0 -p tcp -s 0/0 ftp-data:ftp

ipchains -A output -ые ppp0 -p tcp -d 0/0 ftp-data:ftp

ipchains -A input -ые ppp0 -p tcp -s 0/0 smtp

ipchains -A output -ые ppp0 -p tcp -d 0/0 smtp

ipchains -A input -ые ppp0 -p tcp -s 0/0 www

ipchains -A output -ые ppp0 -p tcp -d 0/0 www

или:

#!/bin/sh

# Collect ftp, smtp and www volume statistics for data carried on our

# PPP link using iptables.

#

iptables -A FORWARD -ые ppp0 -m tcp -p tcp -іsport ftp-data:ftp

iptables -A FORWARD -o ppp0 -m tcp -p tcp -іdport ftp-data:ftp

iptables -A FORWARD -ые ppp0 -m tcp -p tcp -іsport smtp

iptables -A FORWARD -o ppp0 -m tcp -p tcp -іdport smtp

iptables -A FORWARD -ые ppp0 -m tcp -p tcp -іsport www

iptables -A FORWARD -o ppp0 -m tcp -p tcp -іdport www

Здесь есть пару интересных свойств. Во-первых, мы определили протокол. Когда мы определяем порты в наших правилах, мы должны также определить протокол потому, что TCP и UDP имеют отдельные наборы портов. Потому что все эти услуги основаны на TCP, мы определяем именно этот протокол. По-другу, мы определили два сервиса, ftp и ftp-data в одной команде ipfwadm позволяет определять одиночные порты, диапазоны портов или произвольные списки портов. Команда ipchains позволяет определять любой одиночный порт или диапазон портов. Запись "ftp-data:ftp" означает "порты из ftp-data (20) по ftp (21)", так можно кодировать порты в ipchains и iptables. Когда вы имеете список портов в правиле учета, значат, что любые данные для кожного из портов в списке будут прибавлены к общему количеству для этой записи. Поскольку FTP использует два порта, команды и данные, ми прибавили их вместе к общему трафику FTP. Наконец, мы определили исходную адресу как 0/0, что отвечает всем адресам и нужно ipfwadm и ipchains для определения портов.

Теперь нас интересует соотношение полезного трафика по FTP, SMTP и World Wide Web к трафику по другим протоколам. Для этого зададим такие правила:

# ipfwadm -A both -я -W ppp0 -P tcp -S 0/0 ftp ftp-data smtp www

# ipfwadm -A both -я -W ppp0 -P tcp -S 0/0 1:19 22:24 26:79 81:32767

Если вы уже исследовали ваш файл /etc/services, вы увидите, что вторую правило покрывает все порты за исключением (ftp, ftp-data, smtp и www).

Как сделать это с командами ipchains или iptables, ведь они позволяют только один параметр в спецификации порта? Мы можем эксплуатировать обусловленные пользователями цепочки в учете так именно легко, как в правилах firewall. Рассмотрим следующий подход:

# ipchains -N a-essent

# ipchains -N a-noness

# ipchains -A a-essent -j ACCEPT

# ipchains -A a-noness -j ACCEPT

# ipchains -A forward -ые ppp0 -p tcp -s 0/0 ftp-data:ftp -j a-essent

# ipchains -A forward -ые ppp0 -p tcp -s 0/0 smtp -j a-essent

# ipchains -A forward -ые ppp0 -p tcp -s 0/0 www -j a-essent

# ipchains -A forward -j a-noness

Здесь мы создаем два обусловленных пользователей цепочки: a-essent, где мы фиксируем данные для полезного трафика и a-noness, где мы собираем данные для всего другого. Потом прибавим правила к цепочке forward, которые отвечают полезным сервисам и задают переход в цепочку a-essent, что только считает трафик. Последнее правило в нашей цепочке forward задает переход к цепочке a-noness, где тоже есть только одно правило, которое считает трафик. Правило, что переходить к цепочке a-noness, не будет достигнуто бути^-яким пакетом из полезных сервисов, поскольку они будут приняты в их собственной цепочке. Наши счетчики для полезных и других услуг будут доступны только в правилах внутри тихнув цепочек. Это только один подход, что вы могли бы обрати. Реализация того же подхода для iptables: