В первой части мы рассказали о методах, которые использует PortSentry для обнаружения нападения, а также о возможных типах нападений. В этой статье мы остановимся на установке и конфигурировании программы. Мы обсудим основные опции конфигурации, доступные в PortSentry, а также пользы и недостатки этих опций.
В первой части мы рассказали о методах, которые использует PortSentry для обнаружения нападения, а также о возможных типах нападений. В этой статье мы остановимся на установке и конфигурировании программы. Мы обсудим основные опции конфигурации, доступные в PortSentry, а также пользы и недостатки этих опций.
Компиляция PortSentry проста. Загрузите gzipped tarball файл из Web сайта Psionic Technologies. Перед компиляцией программы, нужно определить несколько переменных в файле portsentry_config.h:
• CONFIG_FILE - путь к конфигурационным файлам PortSentry (по умолчанию: /usr/local/psionic/portsentry2/portsentry.conf).
• WRAPPER_HOSTS_DENY – путь и имя TCP wrappers hosts.deny файла (по умолчанию: /etc/hosts.deny).
• SYSLOG_FACILITY – определяем используемое PortSentry средство syslog (по умолчанию: LOG_DAEMON).
• SYSLOG_LEVEL – Уровень syslog, который будет использовать PortSentry (по умолчанию: LOG_NOTICE).
Обычно переменная CONFIG_FILE должна соответствовать местной инсталляционной схеме на хосте, и syslog_FACILITY должен быть заменен на одно из LOG_LOCAL [0-7] значений. Изменение syslog_FACILITY к одному из значений LOG_LOCAL позволяет администратору более гибко управлять файлом регистрации. Другие две переменные могут быть оставлены с заданными по умолчанию значениями.
Далее определим операционную систему, в которой будет использоваться PortSentry. В настоящее время PortSentry определяет следующие системы: Linux, BSD, OpenBSD, FreeBSD, NetBSD, и generic. На Linux системе команда:
# make linux
Скомпилирует программу. Для того, чтобы установить программу:
# make install
По умолчанию, программа будет установлена в файл /usr/local/Psionic. Заданное по умолчанию местоположение может быть изменено в переменной INSTALLDIR в Makefile. Любые изменения этой переменной должны быть отражены в переменной CONFIG_FILE в файле PortSentry_config.h, как отмечено выше. После установки программы, потребуется ее сконфигурировать.
PortSentry управляется двумя файлами:
172.16.88.0/24
10.16.17.0/24
192.168.0.0/16
127.0.0.1/32
Этот файл должен содержать localhost (127.0.0.1) и IP адреса, назначенные на интерфейсы местной системы.
В файле portsentry.conf содержится информация о том, как PortSentry должен следить и реагировать на просмотр портов. Первая часть файла конфигурации определяет интерфейс, который будет контролировать PortSentry, так как программа способна контролировать только один интерфейс одновременно. Для многоузловых систем это не проблема. Однако на системах с двумя или более интерфейсами, PortSentry будет слушать на первичном интерфейсе. Одна очевидная проблема - контроль интерфейса модемной связи. Portsentry не может инициализировать тип datalink, используемый с P2P интерфейсами модемной связи, так что использование portsentry на портативных компьютерах в настоящее время не поддерживается. Для контроля только одного интерфейса на многоузловой системе, следующие переменные должны быть установлены в файле portsentry.conf:
1. INTERFACE – установите в “AUTO” или к имени интерфейса, который должен быть проверен (например, eth0, fxp0 и т.п.).
2. INTERFACE_ADDRESS – эта переменная должна быть установлена в IP адрес проверяемого интерфейса. Эта информация не может быть автоматически определена PortSentry .
Следующие два раздела конфигурируют порты, которые будет контролировать PortSentry, а также местоположение файлов истории, блокирования и игнорирования. Psionic обеспечивает некоторые заданные по умолчанию списки портов, которые могут быть разделены на три группы: "comprehensive", "aware", и "bare-bones". Список "comprehensive" включает 54 TCP порта и 32 UDP порта в диапазоне от tcpmux до 54321/TCP TCP (порт, иногда используемый троянами SchoolBus и BackOrifice 2000). Список "aware" состоит из 30 TCP и 18 UDP портов с подобным распространением. Список "bare-bones" содержит 24 TCP и 14 UDP портов.
Как упомянуто выше, portsentry.ignore файл - список IP адресов наряду с их связанными сетевыми масками в ‘slash’ формате, на которые PortSentry не будет реагировать, если просмотр происходит от одного из этих адресов. Этот список должен быть коротким. Если вся локальная сеть включена в этот список, PortSentry будет игнорировать все просмотры от локальных хостов, даже если просматриваемая машина была скомпрометирована атакующим.
По умолчанию, PortSentry не будет резольвить IP адреса в имя хоста. Эта функция может быть включена, устанавливая значение RESOLVE_HOST к 1 в файле конфигурации, однако это не рекомендуется, так как большое количество подключений заставит PortSentry делать множество DNS запросов, что может сказаться на производительности системы.
Следующий ряд разделов в файле конфигурации определяет, как PortSentry должен реагировать на обнаруженный просмотр. В этих разделах вы можете задать изменение маршрута, добавление хостов в TCP wrappers hosts.deny файл или запуск внешних команд, как будет обсуждено ниже. Переменные конфигурации, которые фактически управляют, отвечает ли portsentry на просмотр или не отвечает, это BLOCK_TCP и BLOCK_DUP. В зависимости от значений из этих двух переменных, portsentry может регистрировать просмотр (значение 0) но не отвечать, или отвечать на просмотр или блокировать его или выполнять внешние команды (значения 1 или 2 соответственно).
Блокирование просмотра может быть сделано несколькими способами, два из которых взаимно исключаемы, в то время как третий может быть дополнителен к любому из первых двух. Чтобы блокировать просмотр, PortSentry может или вставлять маршрут в таблицу маршрутизации хоста, которая направляет вредоносный трафик к "black hole", или может использовать один из нескольких фильтрующих программных пакетов (ipfwadm, ipchains, ipf, ipfw, или iptables) чтобы блокировать трафик от просматриваемого хоста. Действие определяется установкой переменной конфигурации KILL_ROUTE.
Изменяя маршрут для подозрительного трафика, PortSentry блокирует дальнейшие просмотры от атакующего хоста. Обычно маршрут от такого хоста перенаправляется на бездействующий IP или "dead host". Однако это метод может создать асинхронную маршрутизацию, посредством чего трафик входит в хост через один маршрут и выходит через другой. Также, этот тип защиты блокирует только TCP просмотры, а UDP все еще могут выполняться вслепую.
Более предпочтительным методом блокирования в PortSentry является использование пакетных фильтров. Когда PortSentry вставляет дополнительные маршруты в таблицу маршрутизации, при этом увеличивается размер таблицы в OS и не обеспечивается защита от UDP атак. Пакетные фильтры блокируют только нежелательный трафик и поэтому их использование предпочтительно.
Беспорядочное блокирование подозрительных IP адресов может привести к отказу в обслуживании. Атакующий может подменить IP адрес, тем самым заставляя систему блокировать (или изменять маршрут) для таких адресов. Рассмотрим два типичных случая:
1. Атакующий подменяет IP адрес DNS сервера, который использует система. В этом случае portsentry конфигурирован со следующей KILL_ROUTE переменной:
KILL_ROUTE="/sbin/ipchains -I input -s $TARGET$ -j DENY"
Просмотр вставит следующее правило фильтрации ipchains:
ipchains -I input -s -j DENY
И все пакеты от DNS сервера будут блокированы пакетным фильтром. Хост не сможет делать DNS запросы. Любые сервисы, которые требуют выполнение DNS запросов, не смогут работать.
2. Во втором случае сервис на хосте получает запросы от других систем типа NNTP сервиса или NTP сервиса. Нападающий может подделать адрес NNTP сервера, тем самым, блокируя получение Usenet новостей. В случае блокирования NTP сервера, может усложниться работа приложений, требующих точной синхронизации времени.
В обоих случаях, приведенных выше, PortSentry заблокировал важные хосты, потому что атакующий использовал поддельные просмотры. Хосты, использующие PortSentry, должны также проверяться (Psionic Technologies рекомендует использовать программу LogSentry, которая контролирует журналы регистрации PortSentry), чтобы гарантировать, что хост не заблокировал необходимый, законный трафик.
Переменная KILL_HOSTS_DENY обеспечивает вставку IP сканирующего хоста в etc/hosts.deny файл. Это обеспечивает дополнительную защиту, если хост перезагружен, и правило/маршрут пакетного фильтра, блокирующее трафик от просматривающего хоста, был потерян.
Еще одна опция в PortSentry – это возможность выполнять внешнюю команду, перед
или после того, как хост был заблокирован. Это конфигурируется опцией
KILL_RUN_CMD. Выполнена ли эта команда, прежде или после того, как PortSentry
заблокирует трафик от хоста источника просмотра, определяется опцией
KILL_RUN_CMD_FIRST. Установка этого параметра к ‘1’, выполнит команды прежде,
чем PortSentry примет меры против источника просмотра. Значение ‘0’ сперва
заблокирует хост и только затем выполнит команду. Нужно осторожно использовать
эту опцию. Существует множество средств, которые позволяют атакующему
подменивать свой IP адрес, тем самым, заставляя PortSentry использовать
враждебные действия против ни в чем неповинных хостов. Например, атакующий может
использовать nmap с опциями –s
Последняя переменная, задаваемая в файле portsentry.conf - значение SCAN_TRIGGER.
Она управляет числом просмотренных портов, которые позволит просмотреть
PortSentry перед реагированием. По умолчанию переменная установлена в '0',
заставляя PortSentry немедленно реагировать на просмотр. Эта переменная может
быть установлена на любое положительное значение, но авторы программы не
рекомендуют устанавливать ее более чем 2. Пример файла конфигурации приведен в
конце статьи.
После настройки файла конфигурации, нам осталось запустить программу. В
PortSentry 1.0 требовалось, чтобы программа была выполнена с одним из двух
флажков: -tcp или –udp, для контроля только TCP или UDP трафика соответственно.
Начиная с версии 2.0, PortSentry начинает автоматически контролировать TCP и UDP
трафик после запуска программы. Если мы все выполнили правильно, следующие
сообщения должны быть зарегистрированы при запуске PortSentry :
May 26 22:46:57 rashi portsentry[3111]: adminalert: Monitoring interface eth0
PortSentry обеспечивает универсальный способ обнаруживать просмотр портов на хосте и соответственно реагировать на такой просмотр. Хотя и нужно аккуратно
использовать методы ответа на возможные нападения, PortSentry все же
обеспечивает хорошую первую линию защиты против нападений.
Запуск PortSentry
and address: 10.16.17.101
May 26 22:46:57 rashi portsentry[3111]: adminalert: Initializing PortSentry BPF
filters. May 26 22:46:57 rashi portsentry[3111]: adminalert: Monitoring TCP
ports:
1,11,15,79,111,119,143,515,540,635,666,1080,1524,2000, 6667,12345,12346,
20034,27374,27665,31337,32771,32772,32773,32774,40421, 49724,54320,54321
May 26 22:46:57 rashi portsentry[3111]: adminalert: Monitoring UDP ports:
1,7,9,69,161,162,513,635,2049,27444,32770,32771, 32772,32773,32774,
31337,54321 May 26 22:46:57 rashi portsentry[3111]: adminalert: PortSentry is
initialized and monitoring.
May 26 22:54:50 rashi portsentry[3111]:
attackalert: Host 10.16.17.1 has been
blocked via wrappers with string: "ALL: 10.16.17.1"
May 26 22:54:50 rashi portsentry[3111]:
attackalert: TCP SYN scan from host
10.16.17.1/10.16.17.1 to TCP port: 2000 from TCP port: 4427
Заключение
Храним важное в надежном месте