Личный блог Suvan`a.

Работая и играя с Linux... И что из этого иногда получается.

Фильтрация локальных пакетов.

Рубрика: Безопасность -> Брандмауэр
Метки: | | | |
Четверг, 9 апреля 2009 г.
Просмотров: 6092

     До этого IPTables использовался централизованно - только на бранд­мауэре. Но это нельзя рассматривать как полную защиту сети - ведь защищать нужно не только сеть в целом, но и отдельную машину.

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


     Рассмотрим защиту DMZ-серверов. Предложенные правила нужно запускать на определенном DMZ-сервере, не на брандма­уэре. Предположим, что сервисы DNS, HTTP и SMTP запущены на отдельных машинах.

В начале сценария объявляются служебные переменные.

#!/bin/bash

IP_LAN="192.168.0.1"

IP_DMZ="192.168.1.1"

IF_EXT="eth2"

IF_LAN="eth0"

IF_DMZ="eth1"

DMZ_HTTP="192.168.1.2"

DMZ_DNS="192.168.1.3"

DMZ_MAIL="192.168.1.4"

IPT="/usr/local/sbin/iptables" # путь к iptables

     Крайне желательно произвести некоторые настройки ядра с помощью фай­ловой системы /рrос (см. здесь). Нужно создать политику по умолчанию - отбрасывать все пакеты:

# очищение всех цепочек

$IPT --flush $IPT -t nat --flush $IPT -t mangle --flush

$IPT -X

## Разрешение loopback-трафика

$IPT -A INPUT -i lo -j ACCEPT $IPT -A OUTPUT -o lo -j ACCEPT

## Политики по умолчанию

$IPT -P INPUT DROP

$IPT -P OUTPUT DROP

$IPT -P FORWARD DROP

$IPT -t nat -P PREROUTING DROP

$IPT -t nat -P OUTPUT DROP

$IPT -t nat -P POSTROUTING DROP

$IPT -t mangle -P PREROUTING DROP

$IPT -t mangle -P OUTPUT DROP

     HTTP-трафик.

     Web-серверу разрешаем принимать только TCP-пакеты с портами 80 и 443 (HTTPS). Порты отправителя должны принадлежать непривилегирован­ному диапазону (1024:65535). Все остальные пакеты должны относиться к уже установленным соединениям (ESTABLISHED, RELATED):

$IPT -A INPUT -p tcp --dport 80 --sport 1024:65535 -m state --state NEW,ESTABLISHED, RELATED -j ACCEPT

$IPT -A INPUT -p tcp --dport 443 --sport 1024:65535 -m state --state NEW,ESTABLISHED, RELATED -j ACCEPT

$IPT -A INPUT -m state --state ESTABLISHED, RELATED -j ACCEPT

     Какие пакеты могут отправляться Web-сервером, зависит от того, как на­строен Apache. Здесь нужно учитывать большое количество расширений Apache. В частности, PHP-функция может потребовать разрешения имени узла в IP-адрес или отправку сообщения: тогда нужно разрешить создание соедине­ний, но только по определенным портам - 53 и 25.

$IPT -A OUTPUT -d $DMZ_DNS -p tcp --dport 53 --sport 1024:65535 -m state --state NEW, ESTABLISHED, RELATED -j ACCEPT 

$IPT -A OUTPUT -d $DMZ DNS -p tcp --dport 53 --sport 53 -m state --state NEW, ESTABLISHED, RELATED -j ACCEPT 

$IPT -A OUTPUT -d $DMZ_MAIL -p tcp --dport 25 -m state --state NEW, ESTABLISHED, RELATED -j ACCEPT

     Также нужно разрешить трафику с портом отправителя 80 или 443 покидать пределы машины:

$IPT -A OUTPUT -p tcp --sport 80 --dport 1024:65535 -m state --state NEW, ESTABLISHED, RELATED -j ACCEPT

$IPT -A OUTPUT -p tcp --sport 443 --dport 1024:65535 -m state --state NEW, ESTABLISHED, RELATED -j ACCEPT

     Можно усилить ограничения, используя расширение -m owner, ука­зав UID пользователя, от имени которого запускается Apache (обычно это www, http, nobody или apache):

$IPT -A OUTPUT -m owner --uid-owner 99 -d $DMZ_DNS -p tcp --dport 53 --sport 1024:65535 -m state --state NEW, ESTABLISHED, RELATED -j ACCEPT

$IPT -A OUTPUT -m owner --uid-owner 99 -d $DMZ_DNS -p tcp --dport 53 --sport 53 -m state --state NEW, ESTABLISHED, RELATED -j ACCEPT

$IPT -A OUTPUT -m owner --uid-owner 99 -d $DMZ_MAIL -p tcp --dport 25 -m state --state NEW, ESTABLISHED, RELATED -j ACCEPT

$IPT -A OUTPUT -m owner --uid-owner 99 -p tcp --sport 80 --dport 1024:65535 -m state --state NEW, ESTABLISHED, RELATED -j ACCEPT

$IPT -A OUTPUT -m owner --uid-owner 99 -p tcp --sport 443 --dport 1024:65535 -m state --state NEW, ESTABLISHED, RELATED -j ACCEPT

     SMTP-трафик.

     Аналогично будет и для SMTP-сервера. Только здесь нужно разрешить входящие TCP-пакеты с портом получателя 25 и исхо­дящие TCP-пакеты с портом отправителя 25 и портом получателя из диа­пазона 1024:65535. Как правило, sendmail работает от имени пользователя root, следовательно, --uid-owner=0. Так же как и в случае с Apache, нужно разрешить DNS-трафик:

IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

$IPT -A INPUT -p tcp --dport 25 --sport 1024:65535 -m state --state NEW, ESTABLISHED, RELATED -j ACCEPT

$IPT -A OUTPUT -d $DMZ_DNS -p tcp --dport 53 --sport 1024:65535 -m state --state NEW, ESTABLISHED, RELATED -j ACCEPT

$IPT -A OUTPUT -d $DMZ_DNS -p tcp --dport 53 --sport 53 -m state --state NEW, ESTABLISHED, RELATED -j ACCEPT

$IPT -A OUTPUT -m owner --uid-owner 0 -d $DMZ_DNS -p tcp --dport 53 --sport 1024:65535 -m state --state NEW, ESTABLISHED, RELATED -j ACCEPT

$IPT -A OUTPUT -m owner --uid-owner 0 -d $DMZ_DNS -p tcp --dport 53 --sport 53 -m state --state NEW, ESTABLISHED, RELATED -j ACCEPT

$IPT -A OUTPUT -m owner --uid-owner 0 -d $DMZ_MAIL -p tcp --dport 25 -m state --state NEW, ESTABLISHED, RELATED -j ACCEPT

$IPT -A OUTPUT -m owner --uid-owner 0 -p tcp --sport 80 --dport 1024:65535 -m state --state NEW,ESTABLISHED, RELATED -j ACCEPT

$IPT -A OUTPUT -m owner --uid-owner 0 -p tcp --sport 25 -m state --state NEW, ESTABLISHED, RELATED -j ACCEPT

     DNS-трафик.

     Все типы входящего/исходяще­го трафика для DNS-сервера: это входящие TCP/UDP-запросы на порт 53 вместе с любыми пакетами, относящимися к установленным соединениям:

$IPT -A INPUT -m state --state ESTABLISHED, RELATED -j ACCEPT

$IPT -A INPUT -p tcp --dport 53 --sport 1024:65535 -m state --state NEW, ESTABLISHED, RELATED -j ACCEPT

$IPT -A INPUT -p tcp --dport 53 --sport 53 -m state --state NEW, ESTABLISHED, RELATED -j ACCEPT

$IPT -A INPUT -p udp --dport 53 --sport 1024:65535 -m state --state NEW, ESTABLISHED, RELATED -j ACCEPT

$IPT -A INPUT -p udp --dport 53 --sport 53 -m state --state NEW, ESTABLISHED, RELATED -j ACCEPT

     В зависимости от версии (и конфигурации), BIND использует также порт 53 или непривилегированный порт для установки исходящих соединений:

$IPT -A OUTPUT -m owner --uid-owner 0 -p tcp --sport 53 -m state --state NEW, ESTABLISHED, RELATED -j ACCEPT

$IPT -A OUTPUT -m owner --uid-owner 0 -p tcp --sport 1024:65535 -m state --state NEW, ESTABLISHED, RELATED -j ACCEPT

$IPT -A OUTPUT -m owner --uid-owner 0 -p udp --sport 53 -m state --state NEW, ESTABLISHED, RELATED -j ACCEPT

$IPT -A OUTPUT -m owner --uid-owner 0 -p udp --sport 1024:65535 -m state --state NEW, ESTABLISHED, RELATED -j ACCEPT

     SSHD.

     Для удаленного доступа к сети будет использовать­ся отдельный SSH-сервер, размещенный в нейтральной зоне. Удаленный доступ к брандмауэру возможен только через данный сервер.

Желательно, чтобы SSH-сервер запускался на отдельной машине. На этой же машине должен быть установлен IPTables.

     Правила IPTables разрешают исходящий трафик, если он адресован бранд­мауэру или же если он связан с уже установленными соединениями между SSH-демоном и удаленным узлом:

$IPT -A OUTPUT -p udp --sport 1024:65535 --dport 22 -d <IР-адрес брандмауэра> -m state --state NEW, ESTABLISHED, RELATED -j ACCEPT

$IPT -A OUTPUT -p udp --sport 22 -m state --state NEW, ESTABLISHED, RELATED -j ACCEPT