L  i  n  u  x    P  a  r  k
при поддержке ВебКлуба
Назад Оглавление Вперед

Глава 10 Программы обеспечения безопасности (Утилиты контроля) - PortSentry

В этой главе
Linux sXid
Конфигурация
Административные средства sXid
Linux Logcheck
Конфигурация
Linux PortSentry
Конфигурация
Запуск PortSentry

Linux PortSentry

Краткий обзор.

Брандмауэры помогают нам защитить сеть от вторжений. С их помощью мы выбираем какие порты открыть, а какие нет. Никто снаружи нашей сети не владеет информацией об этом, но может попытаться организовать атаку при помощи программ сканирования портов. Они покажут какие порты у нас открыты.

Как сказано во введение к PortSentry:

Сканирование портов это симптом больших проблем, которые вас ждут. Это часто является предвестником атак. PortSentry √ это программа созданная для определения и ответа на сканирование портов в реальном времени. Когда сканирование обнаружено могут последовать следующие ответы:

Цель этой программы √ дать администратору информацию о том, что их сервер исследуется.

Эти инструкции предполагают.
Unix-совместимые команды.
Путь к исходным кодам ⌠/var/tmp■ (возможны другие варианты).
Инсталляция была проверена на Red Hat Linux 6.1 и 6.2.
Все шаги инсталляции осуществляются суперпользователем ⌠root■.
PortSentry версии 1.0

Пакеты.
Домашняя страница Logcheck: http://www.psionic.com/abacus/portsentry/
Вы должны скачать: portsentry-1.0.tar.gz

Тарбол.

Хорошей идеей будет создать список файлов установленных в вашей системе до инсталляции PortSentry и после, в результате, с помощью утилиты diff вы сможете узнать какие файлы были установлены. Например,

До инсталляции:
find /* > Portsentry1

После инсталляции:
find /* > Portsentry2

Для получения списка установленных файлов:
diff Portsentry1 Portsentry2 > Portsentry-Installed

Раскрываем тарбол (tar.gz).

[root@deep /]# cp portsentry-version.tar.gz /var/tmp/
[root@deep /]# cd /var/tmp
[root@deep tmp]# tar xzpf portsentry-version.tar.gz

Компиляция и оптимизация.

Вы должны редактировать файл ⌠Makefile■ PortSentry, чтобы определить инсталляционные пути, флаги компиляции и оптимизации для вашей системы. Место, куда будет установлен PortSentry должно соответствовать структуре расположения системных файлов Red Hat.

Шаг 1.

Переместитесь в новый каталог PortSentry и выполните следующие команды:

Редактируйте файл Makefile (vi Makefile) и измените следующие строки:

CC = cc
Должна читаться:
CC = egcs

CFLAGS = -O
Должна читаться:
CFLAGS = -O9 -funroll-loops -ffast-math -malign-double -mcpu=pentiumpro -march=pentiumpro -fomit-frame-pointer -fno-exceptions -Wall

INSTALLDIR = /usr/local/psionic
Должна читаться:
INSTALLDIR = /usr/ psionic

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

Шаг 2.

Так как мы использовали альтернативное месторасположение файлов (не /usr/local/psionic), нужно изменить путь к конфигурационному файлу PortSentry в основном заголовочном файле ⌠portsentry_config.h■.

Перемещаемся в новый каталог PortSentry и редактируем файл portsentry_config.h (vi portsentry_config.h), изменяя следующие строки:

#define CONFIG_FILE "/usr/local/psionic/portsentry/portsentry.conf"
Должен читаться:
#define CONFIG_FILE "/usr/psionic/portsentry/portsentry.conf"

Шаг 3

Инсталируем Portsentry на вашей системе.

[root@deep portsentry-1.0]# make linux
[root@deep portsentry-1.0]# make install

Вышеприведенныя команды будут настраивать программу на операционную систему Linux, компилировать, создавать и в заключение инсталлировать файлы в заданное место.

Очистка после работы

[root@deep /]# cd /var/tmp
[root@deep tmp]# rm -rf portsentry-version/ portsentry-version_tar.gz

Команда ⌠rm■, использованная выше, будет удалять все исходные коды, которые мы использовали при компиляции и инсталляции PortSentry. Она также удалит .tar.gz архив из каталога /var/tmp.

Конфигурации.

⌠/usr/psionic/portsentry/portsentry.conf■ √ это основной конфигурационный файл для PortSentry; вы можете определить какие порты нужно слушать, какие IP адреса отклонены, контролируются, игнорируются, для каких отключается автоматический ответ и т.д. Для большей информации читайте файл ⌠README.install■ в каталоге с исходными кодами PortSentry.

Редактируйте файл portsentry.conf (vi /usr/psionic/portsentry.conf) и проверьте/измените опции, которые вам нужны:

# Конфигурация PortSentry
#
# $Id: portsentry.conf,v 1.13 1999/11/09 02:45:42 crowland Exp crowland $
#
# ВАЖНОЕ ЗАМЕЧАНИЕ: Вы не можете добавить пробелы между номерами 
# портов.
#
# По умолчанию настройки портов позволяют захватывать большое количество
# основных проверок
#
# Все элементы должны быть в кавычках.
#######################
# Конфигурации портов  #
#######################
#
#
# Несколько примеров настроены для классического и основного Stealth 
#  режимов
#
# Я люблю всегда сохранить некоторые порты в нижнем конце диапазона.
# Это позволит быстро обнаружить последовательное сканирование портов 
# и обычно эти порты не используются (например, tcpmux порт 1)
#
# ** Пользователи X-Windows **: Если вы запускаете X на вашем сервере, вам
# нужно быть уверенным, что PortSentry не привязан к порту 6000 (или порту
# 2000 для пользователей OpenWindows).
# Сделав это вы обеспечите правильный старт X-клиента.
#
# Эти привязанные порты игнорируются для режима Advanced Stealth Scan
# Detection Mode.
#
# Раскомментируйте это для чрезвычайного анализа:
#TCP_PORTS="1,7,9,11,15,70,79,80,109,110,111,119,138,139,143,512,513,514,515
,540,635,1080,1524,2000,2001,4000,4001,5742,6000,6001,6667,12345,12346,20034,
30303,32771,32772,32773,32774,31337,40421,40425,49724,54320"
#UDP_PORTS="1,7,9,66,67,68,69,111,137,138,161,162,474,513,517,518,635,640,64
1,666,700,2049,32770,32771,32772,32773,32774,31337,54321"
#
# Используйте их, если вы только хотите знать:
TCP_PORTS="1,11,15,79,111,119,143,540,635,1080,1524,2000,5742,6667,12345,
12346,20034,31337,32771,32772,32773,32774,40421,49724,54320"
UDP_PORTS="1,7,9,69,161,162,513,635,640,641,700,32770,32771,32772,32773,3
2774,31337,54321"
#
# Используйте это только для bare-bones
#TCP_PORTS="1,11,15,110,111,143,540,635,1080,524,2000,12345,12346,20034,32
771,32772,32773,32774,49724,54320"
#UDP_PORTS="1,7,9,69,161,162,513,640,700,32770,32771,32772,32773,32774,313
37,54321"
###########################################
# Опции Advanced Stealth Scan Detection              #
###########################################
#
# Это номера портов, которые PortSentry должен контролировать в 
# Advanced mode.
# Любые порты ⌠ниже■ этого числа будут контролироваться. Оставьте это
# для контроля всего ниже 1023.
#
# На многих Linux системах нельзя привязать порты выше 61000. Это
# потому, что эти порты используются как часть IP маскарадинга. Я не 
# рекомендую вам привязываться к этим номерам портов. Реальность: Я не 
# рекомендую использовать порты за 1023, так как это будет приводить к 
# ошибочным предупреждениям. Вы были предупреждены!
# Не пишите мне если у вас возникли проблемы, потому что я просто 
# высказываю вам свое мнение. Не используйте выше 1023 порта.
#
#
ADVANCED_PORTS_TCP="1023"
ADVANCED_PORTS_UDP="1023"
#
# Это поле говорит PortSentry, что порты (за исключением прослушиваемых 
# демонами) игнорируются. Это полезно для услуг, вызываемых ident,     
# например FTP, SMTP и wrappers, которые могут остаться не 
# запущенными.
#
# По установленным здесь портам PortSentry будет просто не отвечать
# на входящие запросы. Фактически, PortSentry будет их обрабатывать как 
# будто они привязаны к демонам. Заданные по умолчанию порты могут 
# выступать в отчетах, как возможно ложные сигналы тревоги и 
# вероятно должны быть оставлены для всез кроме особо изолированных систем
#
# TCP ident и NetBIOS сервисы
ADVANCED_EXCLUDE_TCP="113,139"
# UDP route (RIP), NetBIOS, bootp broadcasts.
ADVANCED_EXCLUDE_UDP="520,138,137,67"
######################
# Конфигурационные файлы #
######################
#
# Игнорируемые компьютеры
IGNORE_FILE="/usr/psionic/portsentry/portsentry.ignore"
# Компьютеры, которым было отказано в доступе (из истории работы)
HISTORY_FILE="/usr/psionic/portsentry/portsentry.history"
# Компьютеры доступ которым заблокирован только в этой сессии 
# (времмено до следующей перезагрузки)
BLOCKED_FILE="/usr/psionic/portsentry/portsentry.blocked"
###################
# Опции ответов      #
###################
# Опции ликвидации атакующего. Каждое из этих действий будет
# выполняться если будет обнаружена атака. Если вы не хотите отдельную
# опцию, то комментируйте ее и она будет пропущена.
#
# Переменная $TARGET$ будет замещена целью атаки, когда атака обнаружена.
# Переменная $PORT$ будет заменятьс портом, который был сканирован.
#
##################
# Опции игнорирования #
##################
# Эти опции позволяют вам допустить автоматический параметры ответа для 
# UDP/TCP. Это бывает полезно, если вы хотите получить предупреждение о 
# соединениях, но не хоти реагировать на определенный протокол.
# Для предотвращения возможных Denial of service атак через UDP и 
# определение stealth сканирования для TCP, вы можете пожелать отключить 
# блокирование, но оставить предупреждение.
# Лично я предпочитаю ждать начала возникновения проблем до того как
# что-нибудь предпринять, так как большинство атакующих ничего не делают.
# Третья опция позволяет вам запускать внешнюю команду в случае 
# сканирования. Это может быть полезно, например, для администраторов, 
# которые хотят блокировать TCP, но для UDP будет высылаться 
# предупреждения и т.д.
#
#
# 0 = Не блокировать UDP/TCP сканирование.
# 1 = Блокировать UDP/TCP сканирование.
# 2 = Запуск внешней команды (KILL_RUN_CMD)
BLOCK_UDP="1"
BLOCK_TCP="1"
###################
# Сброс маршрутов  #
###################
# Эти команды используются для удаления маршрута или
# хоста в локальную таблицу фильтрации.
#
# Шлюз (333.444.555.666) идеально должен быть неработающий хост
# в локальной подсети. На некоторых хостах вместо него используется
# localhost (127.0.0.1), что дает тот же эффект. ЗАМЕТИМ ЧТО 
# 333.444.555.66  НЕ БУДЕТ РАБОТАТЬ, ИЗМЕНИТЕ ЭТО!!
#
# ВСЕ ОПЦИИ ОТКЛЮЧЕНИЯ МАРШРУТОВ ИЗНАЧАЛЬНО 
# ЗАКОММЕНТИРОВАНЫ. Убедитесь, что вы раскомменировали
# правильные строки для вашей ОС. Если вашей ОС нет в списке
# и вы точно знаете команды сбрасывающие  маршруты, то,
# пожалуйста, пришлите их мне. ТОЛЬКО ОДНА KILL_ROUTE ОПЦИЯ
# МОЖЕТ БЫТЬ ИСПОЛЬЗОАНА ОДНОВРЕМЕННО, ТАК ЧТО 
# НЕ РАСКОММЕНТИРУЙТЕ БОЛЬШЕ ОДНОЙ СТРОКИ.
#
# ЗАМЕЧАНИЕ: route команды это наименее оптимальная дорога блокирования 
# и она не предоставляет полной защиты от UDP атак и 
# будет спокойно создавать предупреждения для UDP и stealth сканирований.
# Я всегда рекомендую вам использовать пакетный фильтр, потому что это
# соответствует замыслу.
#
# Общий
#KILL_ROUTE="/sbin/route add $TARGET$ 333.444.555.666"
# Общий для Linux
#KILL_ROUTE="/sbin/route add -host $TARGET$ gw 333.444.555.666"
# Новые версии Linux поддерживают сейчас флаг reject. Это лучше, чем
# вышестоящая опция
KILL_ROUTE="/sbin/route add -host $TARGET$ reject"
# Общие для BSD (BSDI, OpenBSD, NetBSD, FreeBSD)
#KILL_ROUTE="/sbin/route add $TARGET$ 333.444.555.666"
# Общий для Sun
#KILL_ROUTE="/usr/sbin/route add $TARGET$ 333.444.555.666 1"
# NEXTSTEP
#KILL_ROUTE="/usr/etc/route add $TARGET$ 127.0.0.1 1"
# FreeBSD (Оттестировано не достаточно хорошо)
#KILL_ROUTE="route add -net $TARGET$ -netmask 255.255.255.255 127.0.0.1 -blackhole"
# Digital UNIX 4.0D (OSF/1 / Compaq Tru64 UNIX)
#KILL_ROUTE="/sbin/route add -host -blackhole $TARGET$ 127.0.0.1"
# Общие HP-UX
#KILL_ROUTE="/usr/sbin/route add net $TARGET$ netmask 255.255.255.0 
127.0.0.1"
##
# Использование пакетного фильтра более предпочтительный метод. Ниже
# перечисленные строки подходят для многих ОС. Помните, вы можете
# раскомментировать только одну строку.
# Опции KILL_ROUTE.
##
###############
# TCP Wrappers#
###############
# Этот текст описывает внесение в файл hosts.deny для использования wrappers.
# Зжесь приводятся два формата TCP wrappers:
#
# Формат 1: Старый стиль √ по умолчанию, когда хост не допускает обработки
# параметров.
#
KILL_HOSTS_DENY="ALL: $TARGET$"
#
# Формат 2: Новый стиль √ включены расширенной обработки.
#  Вы можете просмотреть опции расширенной обработки, чтобы
# быть уверенными, что все перед символами ⌠%■ стоит символ ⌠\■
# (например, \%c \%h )
#
#KILL_HOSTS_DENY="ALL: $TARGET$ : DENY"
###################
# Внешние команды #
###################
# Эта команда выполняется когда хост подключен, это может быть то, что вам
# нужно (пэйджер и т.д.). Эта команда выполняется перед очисткой маршрута.
# Я НЕ РЕКОМЕНДУЮ ПОМЕЩАТЬ КАКИЕ-ЛИБО КАРАТЕЛЬНЫЕ 
# ДЕЙСТВИЯ ПРОТИВ ХОСТА СКАНИРУЮЩЕГО ВАС. TCP/IP это 
# протокол без подтверждения подлинности и люди могут организовать
# сканирование из ниоткуда. Единственное, что можно безопасно запустить
# это скрипт обратной проверки, который использует классический -tcp режим. 
This
# Этот режим требует полного соединения и очень труден для обмана (spoof).
#
#KILL_RUN_CMD="/some/path/here/script $TARGET$ $PORT$"
#####################
# Значение триггеров сканирования #
#####################
# Введите число соединений к портам, когда вам будет дано предупреждение. 
# По умолчанию значение равно 0 √ незамедлительная реакция.
# Значения 1 или 2 будут уменьшать количество ложных срабатываний. В более 
# высоком значение нет необходимости. Это значение должно быть определено, 
# но как правило можно оставить 0.
#
# ЗАМЕЧАНИЕ: Если вы используете продвинутые опции определения, вам
# нужно быть внимательным, чтобы не создать ситуацию ⌠спускового крючка,
# требующего легкого нажатия■. Поскольку расширенный режим будет 
# реагировать на любой удаленный компьютер соединяющийся с интервалом
# ниже определенного здесь, вы при определенных обстоятельствах 
# действительно разорвете что-нибудь. (например, кто-то невинно пытается 
# соединиться с вами через SSL [TCP порт 443] и вы сразу блокируете его). 
# Так что будьте внимательны.
#
SCAN_TRIGGER="0"
######################
# Секция заголовка (banner) порта  #
######################
#
# Введите здесь текст, который вы хотите показать человеку отключаемого 
# PortSentry. Я не рекомендую насмехаться над человек, так как это может его
# разозлить. Оставьте эти строки закомментироваными, чтобы отключить эту 
# возможность.
#
# Режим определения Stealth сканирования не использует эту возможность. 
#
PORT_BANNER="** UNAUTHORIZED ACCESS PROHIBITED *** YOUR 
CONNECTION ATTEMPT HAS
BEEN LOGGED. GO AWAY."
# EOF

Сейчас, вы должны проверить/изменить права установленные по умолчанию из соображения безопасности:

[root@deep /]# chmod 600 /usr/psionic/portsentry/portsentry.conf Конфигурирование файла ⌠/usr/psionic/portsentry/portsentry.ignore■.

В файл ⌠/usr/psionic/portsentry/portsentry.ignore■ вы добавляете компьютеры, которые должны быть проигнорированы если они соединяются к порту. Он всегда должен содержать localhost адрес (127.0.0.1) и адреса локальных машин. Не рекомендуется помещать в него все компьютеры из вашей локальной сети. Редактируйте фай portsentry.ignore file (vi /usr/psionic/portsentry.ignore) и добваьте в него все хосты, которые будут пропущены:

# Положите сюда адреса хостов, которые мы никогда не будем блокировать.
# Здесь должны находится адреса всех локальных интерфейсов на
# защищаемом сервере (например, virtual host, mult-home)
# Сохраните здесь 127.0.0.1 и 0.0.0.0.
127.0.0.1
0.0.0.0

Сейчас, мы должны проверить/изменить права доступа из соображений безопасности: [root@deep /]# chmod 600 /usr/psionic/portsentry/portsentry.ignore

Запуск PortSentry.

Программа PortSentry может быть сконфигурирована для работы в шести различных режимах, но запущена только для проверки одного протокольного режима за раз. Чтобы было более правильно, вы можете запустить одни TCP режим и один UDP режим, так как два TCP и один UDP, для примера, не работает. Доступные режимы:

?portsentry -tcp (основной port-bound TCP режим)
?portsentry -udp (основной port-bound UDP режим)
?portsentry -stcp (определение Stealth TCP сканирования)
?portsentry -atcp (продвинутое определение TCP stealth сканирования)
?portsentry -sudp (определение "Stealth" UDP сканирования)
?portsentry -audp (продвинутое определение UDP сканирования)

В моем случае я предпочитаю запускать TCP в протокольном режиме ⌠продвинутое определение TCP stealth сканирования ■ и UDP в протокольном режиме "определение Stealth UDP сканирования ■. Для получения большей информации о других протокольных режимах пожалуйста читайте ⌠README.install■ и ⌠README.stealth■ файлы в каталоге с исходными кодами PortSentry. Для TCP режима я выбираю:

- atcp - продвинутое определение TCP stealth сканирования
В режиме продвинутого определения TCP stealth сканирования, PortSentry будет вначале смотреть какие порты вы запустили на сервере, а затем выведет их из под наблюдения и начнет следить за остальными портами. Это очень полезно и очень быстро реагирует на сканирование портов. Этот режим, также, потребляет мало времени CPU.

Для UDP режима я выбрал:

-sudp √ режим определения "Stealth" UDP сканирования
В режиме определения "Stealth" UDP сканирования UDP порты сперва будут формироваться в список, а затем контролироваться.

Для запуска PortSentry в двух вышеприведенных режимах используйте команды:

[root@deep /]# /usr/psionic/portsentry/portsentry -atcp
[root@deep /]# /usr/psionic/portsentry/portsentry -sudp

ЗАМЕЧАНИЕ: Вы можете добавить вышеприведенные строки в файл ⌠/etc/rc.d/rc.local■, чтобы они автоматически запускались при каждой перезагрузке системы.

Инсталлированные файлы.
> /usr/psionic
> /usr/psionic/portsentry
> /usr/psionic/portsentry/portsentry.conf
> /usr/psionic/portsentry/portsentry.ignore
> /usr/psionic/portsentry/portsentry

Назад Оглавление Вперед