Адаптируемые межсетевые экраны на базе Linux
Автор: (C) Vasoo Veerapen
Перевод: (C) Иван Песин


Введение.

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

По умолчанию, iptables протоколирует сообщения при помощи демона syslogd. Файлы протоколов достаточно хороши для обеспечения базовой защиты, но не могут помочь в организации сложных межсетевых экранов. Для этого нужно, чтобы система реагировала на сообщения сразу же после их поступления. В зависимости от уровня опасности, систему можно запрограммировать на различные защитные действия, такие, например, как блокирование атакующего IP-адреса. Подход, применяемый в этом документе, не ограничивается утилитой iptables и может быть применен, с соответствующими изменениями, к любой системе, протоколирующей события при помощи syslog. Примером может служить система обнаружения вторжений SNORT.

Примеры, приведенные в этом документе, проверялись только на системах Red Hat 7.2/7.3. Тогда я обитал на острове Маврикий, который чертовски далек от цивилизации, и все мы носили скудную одежду, на подобие зулусских воинов :-) Дополнительную информации по острову Маврикий и подводному плаванью можно найти по адресу www.islandsoft.net

Великолепный документ, описывающий возможности брандмауэра Linux, это Iptables Tutorial Оскара Андреасона (Oskar Andreasson). Прочесть его можно по адресу http://iptables-tutorial.haringstad.com/ (перевод этого документа, сделанный Андреем Киселёвым, вы найдёте на сайте Russian Linux Gazette по адресу http://gazette.linux.ru.net/rus/articles/index-iptables-tutorial.html - Прим.пер.).


Рекомендуемая литература

Вот список некоторых книг по Linux, которые могут быть вам интересны. Пожалуйста, открывайте ссылки в новом окне. [Следует заметить, что речь идёт не об электронных версиях книг, а о ссылках на книги в интернет-магазине Amazon, где их можно заказать -- прим.ред.]

Advanced Linux Networking
Hack Attacks Revealed: A Complete Reference
Hacking Linux Exposed
Linux Firewalls (2nd Edition)
Linux Routers
Network Intrusion Detection (An Analysts Handbook, 2nd Edition)
PHP and PostgreSQL Advanced Web Programming
Real World Linux Security: Intrusion Prevention, Detection and Recovery
Red Hat Linux 7.3 Bible


Теория.

Демон syslogd имеет интересную возможность, которая позволяет перенаправлять его вывод в определяемый пользователем именованный канал (pipe) [Точнее программный канал. Другое дело, что в статье ведётся речь именно о named pipe, поэтому в переводе фигурирует термин именованный канал -- прим.ред.]. Для обработки поступаемых сообщений и динамической перенастройки брандмауэра я буду использовать скрипт на Perl.


Что вам понадобится.

Примеры в данном документе используют сервер БД postgresql. Много людей хорошо знакомы с сервером MySQL, портирование на который не должно быть проблемой. Мне больше нравится Postgres, так как он включает в себя много возможностей присущих коммерческим СУБД. За детальной информацией по PostgreSQL обращайтесь на http://www.postgresql.org/. Кроме того, на брандмауэре вам понадобятся пакеты postgresql-perl, Perl и iptables.

На сервере postgreSQL создайте базу данных "adaptive" и таблицу "iptables". Определите такие поля:

  1. ipaddress тип char 16
  2. severity тип int4
  3. time тип datetime

Основная безопасность.

TO DO: более детально рассмотреть MAC-адреса и ложные ARP ответы.

По моему мнению, на брандмауэре должны быть запущены только сервисы syslog и cron. Стоит также организовать дублирование системных протоколов на печать. Причина в том, что взломав межсетевой экран, нарушитель может переписать протоколы и вы не сможете узнать, какая уязвимость была использована. В случае наличия твердой копии протоколов этот вариант исключается. Желательно, чтобы межсетевой экран загружался с CD-ROM, а правила фильтрации считывались с дискеты, защищенной от записи.

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


Блокировка межсетевого экрана во время загрузки.

Первый шаг, который вы должны выполнить -- это обеспечить безопасность брандмауэра. По умолчанию, iptables разрешает прохождение пакетов по цепочкам INPUT, OUTPUT и FORWARD. Это является угрозой безопасности во время загрузки и открывает вашу сеть для разных типов атак. Во избежания этого, необходимо "проинструктировать" iptables блокировать все пакеты еще ДО инициализации интерфейсов.

В Redhat-подобных дистрибутивах, символическая ссылка "S10network" в каталоге "/etc/rc.d/rc3.d" отвечает за запуск сети (Автор рассматривает только случай третьего уровня инициализации системы. Это не всегда так. Правильней было бы сказать, что за запуск сети отвечает скрипт /etc/rc.d/init.d/network. - Прим.пер.). Там же может находиться и ссылка "S08iptables", которая отвечает за инициализацию межсетевого экрана. Я предпочитаю удалять эту ссылку и создавать собственную, имя которой начинается с символов "S08". Скрипт, начинающийся с символов "S08" выполняется перед теми, которые начинаются с символов "S10". Тем самым мы будем уверены в том, что ни один пакет не пройдет сквозь брандмауэр.

(Не совсем понятна авторская неприязнь к штатным средствам RedHat. Как указывает сам автор, индекс позиции скрипта iptables равен 08, а индекс позиции скрипта network -- 10. Значит сперва выполняется настройка брандмауэра и лишь потом инициализируются интерфейсы. Собственно, чего и добивается автор. - Прим.пер.)

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

Для обеспечения безопасности во время загрузки, сделайте следующее:

  1. Перейдите в каталог "/etc/rc.d"
  2. Создайте файл "rc.autofwinit"
  3. Перенесите в него нижеприведенный скрипт.
  4. Выполните команду "chmod 755 rc.autofwinit"
  5. Перейдите в каталог "/etc/rc.d/rc3.d"
  6. Выполните команду "rm -f S08iptables"
  7. Выполните команду "ln -s /etc/rc.d/rc.autofwinit S08iptables_start"
  8. Выполните команду "./S08iptables_start"

Скрипт rc.autofwinit

#!/bin/sh
#
# rc.autofwinit - Инициализирует брандмауэр во время загрузки
#
# Copyright (C) 2001,2002 Vasoo Veerapen ([email protected]);
# http://www.islandsoft.net/veerapen.html
#
# This program is free software; you can distribute it and/or modify it under the terms of
# the GNU General Public License as published by the Free Software Foundation; version 2
# of the License.
#
# This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along with this program
# or from the site that you downloaded it from; if not, write to 
# the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307, USA
#
#
# Maybe you are more interested in scuba diving, marine conservation or my
# homeland, the paradise island of Mauritius where the Dodo used to live?
# Its simply http://www.islandsoft.net/
#
# ----------------------------------------------------------------------

echo "Initialising firewalling...Dropping all packets"

IPT=/sbin/iptables

# Блокирование ICMP пакетов-перенаправлений
for CONF in /proc/sys/net/ipv4/conf/*/accept_redirects; do
        echo 0 > $CONF
done

# Блокирование маршрутизации источником
for CONF in /proc/sys/net/ipv4/conf/*/accept_source_route; do
        echo 0 > $CONF
done

# Блокирование IP-спуфинга
for CONF in /proc/sys/net/ipv4/conf/*/rp_filter; do
        echo 1 > $CONF
done

# Очистка таблиц
for TABLE in filter nat; do
        $IPT -t $TABLE -F
        $IPT -t $TABLE -X
done

# Отбрасывание всех пакетов
$IPT -P INPUT DROP
$IPT -P OUTPUT DROP
$IPT -P FORWARD DROP

echo "Done initialising."
sleep 2

Вместо всех этих удалений и добавлений, можно просто один раз настроить защитный экран (Это вы должны будете сделать в любом случае. Автор это делает в следующем разделе). После чего выполнить команду: service iptables save. Все. - Прим.пер.


Создание скрипта Iptables.

После того как процесс загрузки межсетевого экрана будет обезопасен, следует создать сценарий, который позволит протоколировать подозрительные пакеты средствами syslog. Скрипт iptables, приведенный ниже, очень прост. Если вам хочется приключений -- попробуйте доработать и использовать DMZ-скрипт из "Iptables Tutorial".

  1. Перейдите в каталог "/etc/rc.d"
  2. Создайте файл "rc.autofirewall"
  3. Скопируйте в него указанный ниже скрипт.
  4. Выполните команду "chmod 755 rc.autofirewall"
  5. Выполните скрипт "./rc.autofirewall"
  6. Выполнение должно пройти без ошибок. Если они всё же были, проверьте скрипт на синтаксические ошибки, а также настройки iptables и ядра.

Скрипт rc.autofwrules

#!/bin/sh
#
# rc.autofwrules - Скрипт автоматического ужесточения правил брандмауэра
#
# Copyright (C) 2001,2002 Vasoo Veerapen ([email protected])
# http://www.islandsoft.net/veerapen.html
#
# This program is free software; you can distribute it and/or modify it under the terms of
# the GNU General Public License as published by the Free Software Foundation; version 2
# of the License.
#
# This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along with this program
# or from the site that you downloaded it from; if not, write to 
# the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307, USA
#
# Maybe you are more interested in scuba diving, marine conservation or my
# homeland, the paradise island of Mauritius where the Dodo used to live?
# Its simply http://www.islandsoft.net/
#
# ----------------------------------------------------------------------

IPT="/sbin/iptables"

INT_IF="eth0"
EXT_IF="ppp0"

LOG_LEVEL="notice"
#
$IPT -P INPUT ACCEPT
$IPT -P OUTPUT ACCEPT
$IPT -P FORWARD ACCEPT



#*******************************************************************************
#FILTER_FLAGS
#*******************************************************************************
echo Entering FILTER_FLAGS
$IPT -N FILTER_FLAGS
$IPT -F FILTER_FLAGS
##----------------------------------------------------------------------------##
$IPT -A FILTER_FLAGS -p tcp --tcp-flags ALL FIN -m limit \
        --limit 5/minute -j LOG --log-level $LOG_LEVEL \
        --log-prefix "iptables:SCAN:"
$IPT -A FILTER_FLAGS -p tcp --tcp-flags ALL FIN -j DROP

##----------------------------------------------------------------------------##
echo Leaving FILTER_FLAGS

#*******************************************************************************
# BANNED
#*******************************************************************************
echo Entering BANNED
$IPT -N BANNED
$IPT -F BANNED
##----------------------------------------------------------------------------##
# Leave blank
##----------------------------------------------------------------------------##
echo Leaving BANNED

        $IPT -A INPUT -j BANNED
        $IPT -A INPUT -j FILTER_FLAGS

        $IPT -A OUTPUT -j BANNED
        $IPT -A OUTPUT -j FILTER_FLAGS

#------------- Конец скрипта

Создание поименованного канала.

Поименованный канал -- это интерфейс между syslog и блокирующим скриптом.

  1. Перейдите в каталог "/etc/rc.d" (хотелось бы заметить, что есть более логичные места для размещения поименованного канала. - Прим.пер.)
  2. Выполните "mknod /etc/rc.d/syslog_auth p"
  3. Выполните "chmod 600 /etc/rc.d/syslog_auth"

В поисках более детальной информации вам поможет "man mknod".


Настройка блокирующего скрипта.

После настройки iptables и поименованного канала, нужно создать скрипт, обрабатывающий сообщения демона syslog. Этот скрипт является основой процесса ужесточения настроек межсетевого экрана. Нижеприведенный скрипт демонстрирует автоматическую блокировку машины и работу с сервером СУБД PostgreSQL.

  1. Перейдите в каталог "/etc/rc.d"
  2. Создайте файл "rc.autoharden"
  3. Скопируйте в него приведенный ниже скрипт.
  4. Выполните "chmod 755 rc.autoharden"
  5. Выполните "./rc.autoharden"
  6. Вы можете увидеть некоторые сообщения ядра, но никаких сообщений об ошибках. Если они все же были, проверьте скрипт на правильный синтаксис и настройки Perl.
  7. Откройте новую консоль, нажав, например, Alt-F2. Войдите в систему пользователем root.
  8. Выполните "/sbin/iptables -L" и посмотрите на выводимые данные. Обратите внимание на цепочку "BANNED".

Скрипт rc.autofwharden

#!/usr/bin/perl -w
#
# rc.autofwharden - Обработка сообщений от демона syslogd
#
# Copyright (C) 2001,2002 Vasoo Veerapen ([email protected]);
# http://www.islandsoft.net/veerapen.html
#
# This program is free software; you can distribute it and/or modify it under the terms of
# the GNU General Public License as published by the Free Software Foundation; version 2
# of the License.
#
# This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along with this program
# or from the site that you downloaded it from; if not, write to 
# the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307, USA
#
#
# Maybe you are more interested in scuba diving, marine conservation or my
# homeland, the paradise island of Mauritius where the Dodo used to live?
# Its simply http://www.islandsoft.net/
#
# ----------------------------------------------------------------------

use Pg;
use strict;

my $log_datetime="";
my $log_address="";

my @parms = ();
my $msgSource = "";
my $sourceIP = "";
my $sourcefile = "dump";
my $tmprec = "";
my $conn="";
my $result="";
my $temp="";


# Открываем базу данных
$conn=Pg::connectdb("dbname=adaptive user=postgres password=password");
( PGRES_CONNECTION_OK eq $conn->status )
    and print "Pg::connectdb ok:\n"
    or  die   "Pg::connectdb failed: ", $conn->errorMessage, "\n";

#Открываем поименованный канал
#open(FIFO, "< /etc/rc.d/syslog_auth") or die $!;
#printf "Pipe opened. \n";
#while(<FIFO>) {

#Возможно вы хотите открыть тестовый файл?
open(SOURCE, "< $sourcefile") or die $!;
printf "File opened. \n";
while (<SOURCE>) {
        
        @parms = split(/ /, $_);
        $msgSource = $parms[5];
        
        if ($msgSource eq "iptables:SCAN:")
        {
                #Set date and time
                $log_datetime="$parms[1]-$parms[0]-2002 $parms[2]";
                
                #Set source address
                $temp = $parms[9];
                $log_address = substr($temp, 4, length($temp) -4);
                printf "Adding address %s to database. \n", $log_address;       

                $result = $conn->exec("INSERT INTO iptables (ipaddress, severity, time) VALUES ('$log_address', '1','$log_datetime')");
                die $conn->errorMessage unless PGRES_COMMAND_OK eq $result->resultStatus;
                
                $temp = "/sbin/iptables -A BANNED -s $log_address -j DROP";
                printf "%s \n", $temp;
                system($temp);
        }
}

#close(FIFO);

#Закрываем тестовый файл.
close(SOURCE);

$result=$conn->exec("DROP DATABASE adaptive");
die $conn->errorMessage unless PGRES_COMMAND_OK eq $result->resultStatus;
#--------------- Конец скрипта rc.autofwharden

Настройка Syslogd.

Последний шаг -- это настройка демона syslog. Обычно, сообщения записываются в файл "/var/log/messages", а некоторые дублируются на консоль. Мы настроим syslog на посылку сообщений в поименованный канал.

Найдите строку, начинающуюся со слов
*.info;mail.none;authpriv.none

Измените ее так, чтобы она выглядела следующим образом (если вы не нашли такой строки, то просто добавьте ее):
*.info;mail.none;authpriv.none |/etc/rc.d/syslog_auth
(Если вы исправите существующую строку, то соответствующие протоколы перестанут вестись. Наверное, лучше добавить эту строчку. - Прим.пер.)


Просмотр результатов.

Запустите с удаленной системы программу nmap, указав опцию FIN-сканирования. Саму программу можно получить по адресу http://www.insecure.org/nmap.

На машине с брандмауэром, выполните команду "/sbin/iptables -L" и обратите внимание на различия в цепочке "Banned".

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

Эти команды выведут список всех заблокированных адресов, сохраненных в базе.


Часто задаваемые вопросы по адаптируемым межсетевым экранам.

В. Насколько безопасны скрипты, использованные в этом документе"?

О. Блокирующий скрипт, который я здесь использовал очень (ну ОЧЕНЬ - Прим.пер.) простой. Поскольку он автоматически блокирует адреса, можете представить себе что произойдет если кто-то будет проводить сканирование с измененным адресом источника. В этом случае, будет заблокирован ни в чем не повинный IP-адрес. Однако, если адреса не подменены, вы сможете идентифицировать источник атаки и заблокировать попытки соединений.

В. Мой брандмауэр постоянно протоколирует пакеты ACK, FIN, URGP=0 ?

О. В 99.99% случаев -- это нормальное поведение. Происходит это из-за того, что Iptables "помнит" о каждом соединении в течении 60 секунд. Если соединение не активно на протяжении этого времени, Iptables вытирает его из таблицы активных соединений. Но ведь "другой конец" соединения об этом ничего не знает и когда он пытается закрыть соединение со своей стороны, то посылает пакет с такими флагами. Этот пакет и перехватывается брандмауэром.


Благодарности.

Я хочу поблагодарить Оскара Андреасона за вклад, внесенный им в создание этого документа.


Copyright (c) 2002, Vasoo Veerapen. Copying license http://www.linuxgazette.com/copying.html
Published in Issue 82 of Linux Gazette, September 2002

Вернуться на главную страницу