Фильтрация локальных пакетов.
Метки: DMZ | DNS | IPTables | SMTP | SSH
Четверг, 9 апреля 2009 г.
Просмотров: 2271
До этого IPTables использовался централизованно - только на брандмауэре. Но это нельзя рассматривать как полную защиту сети - ведь защищать нужно не только сеть в целом, но и отдельную машину.
Возьмем, к примеру, ситуацию, в отдельных случаях крекеру удается каким-то образом проникнуть в нейтральную зону - он получил доступ к серверу из нейтральной зоны. В настоящее время он пытается расширить свои «права», то есть получить доступ к другим машинам, в том числе и брандмауэру. Следовательно, брандмауэр IPTables нужно запускать и на других машинах сети - чтобы защитить эти машины.
Рассмотрим защиту DMZ-серверов. Предложенные правила нужно запускать на определенном DMZ-сервере, не на брандмауэре. Предположим, что сервисы DNS, HTTP и SMTP запущены на отдельных машинах.
В начале сценария объявляются служебные переменные.
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 -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 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 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 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 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 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 -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 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 22 -m state --state NEW, ESTABLISHED, RELATED -j ACCEPT