PortSentry - средство противодействия сканированию портов

Материал из Ай да Linux Wiki
Перейти к навигации Перейти к поиску


Введение

Сканирование портов является одним из самых распространенных и простых способов узнать, какая операционная система установлена на компьютере, какие службы запущены в данный момент и получить другую информацию о компьютере, подключенном к Internet , которая может быть использована для взлома и проникновения. Существует много программ для обнаружения сканирования портов. Но обнаружения не достаточно. Должна последовать адекватная реакция. "Адекватная реакция" может заключаться в отправке в сторону сканирующего тебя человека неправильного фрагментированного пакета, ответного сканирования портов, установки на него firewall'а и т.д. Также желательно, чтоб он получил недостоверную информацию об открытых портах на твоем компьютере. Все это и многое другое позволяет делать прекрасная программа Psionic Software Portsentry.

Когда сканирование обнаружено могут последовать следующие ответы:

  • занесение информации об инциденте в системный журнал через syslog().
  • Компьютер замеченный в сканировании автоматически заносится в файл /etc/host.deny для TCP Wrappers.
  • Локальный компьютер автоматически перенастраивается, чтобы направлять весь трафик от атакующего на несуществующий компьютер.
  • Локальный компьютер автоматически перенастраивается, чтобы блокировать все пакеты от атакующего пакетным фильтром.

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

Установка

Внимание: в версии portsentry 1.2 было найдено несколько багов, и поэтому, я рекомендую использовать версию 1.2-r1. Хотя и там ситуация не изменилась. Проблема заключалась в некорректной остановке демона. Ниже будет приведено решение данной проблемы.

Для этого необходимо:

 echo net-analyzer/portsentry ~x86 >> /etc/portage/package.keywords

Устанавливаем программу:

 emerge -av net-analyzer/portsentry

Настройка

Внимание: если у вас проблемы с остановкой или перезапуском демона, то необходимо поправить файл /etc/init.d/portsentry, а точнее разделы stop и restart:

 stop() {
       ebegin "Stopping portsentry"
       start-stop-daemon --stop --quiet --exec /usr/bin/portsentry
       eend $?
 }
 
 restart() {
         $stop
         $start
 }


Режим работы

Portsentry возможно запускать в трех режимах для каждого протокола. Одновременно можно использовать только один режим работы на одном протоколе.

Режим работы задается в файле:

 /etc/conf.d/portsentry

Достаточно раскомментировать необходимую стройку.

Classic

Работая в данном режиме Portsentry открывает порты, указанные в TCP_PORTS или UDP_PORTS и находится в состоянии ожидания соединения. При попытке подключения к перечисленному порту происходит блокирование удаленного хоста. В этом режиме Portsentry не реагирует на Stealth-сканирование. Данный режим работы задается опциями командной строки: -tcp и -udp , для TCP и UDP-портов соответственно.

Enhanced Stealth Scan Detection

Данный режим используется для проверки перечисленных в TCP_PORTS или UDP_PORTS портов на предмет подключения или сканирования. Отличительная черта, то что палит практически все типы Stealth-сканирования, а не ограничивается только сканирование подключением. Порты, в отличие от предыдущего режима открытыми не держит, посему атакующий получает достоверную информацию об открытых портах. Задается ключиками командной строки: -stcp и -sudp , для TCP и UDP-портов соответственно.

Advanced Stealth Scan Detection

Данный режим используется для проверки всех портов входящих в пул от 1 до ADVANCED_PORT_TCP (для TCP) или ADVANCED_PORT_UDP (для UDP). Порты, открытые работающими на хосте программами и перечисленные в ADVANCED_EXLUDE_TCP(для TCP) или ADVANCED_EXCLUDE_UDP(для UDP) не проверяются. Любой хост, попытавшийся подключится к порту из этого промежутка, мгновенно блокируется. Наиболее удобный для использования метод, т.к. реакция на сканирование или попытку подключения у данного метода самая быстрая, а также в этом режиме используется гораздо меньше процессорного времени, чем в остальных. Задается ключами из коммандной строки: -atcp и -audp , TCP и UDP-портов соответственно.

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

Приступаем к правке основный конфигурационных файлов. Будем отталкиваться от доступных файлов примеров:

 cp /etc/portsentry/portsentry.conf.sample /etc/portsentry/portsentry.conf
 cp /etc/portsentry/portsentry.ignore.sample /etc/portsentry/portsentry.ignore

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

#######################
# Конфигурации портов #
#######################
#
#
# Несколько примеров настроены для классического и основного 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,12 346,20034,27665,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,641,666,700,2049,31335,27444,34555,32770,32771,32772,32773,32774,3133 7,54321"
#
# Используйте их, если вы только хотите знать:
#TCP_PORTS="1,11,15,79,111,119,143,540,635,1080,1524,2000,5742,6667,12345,12346,20034,27665,31337,32771,32772,32773,32774,40421,49724,54320"
#UDP_PORTS="1,7,9,69,161,162,513,635,640,641,700,37444,34555,31335,32770,32771,32772,32773,32774,31337,54321"
#
# Используйте это только для bare-bones
#TCP_PORTS="1,11,15,110,111,143,540,635,1080,1524,2000,12345,12346,20034,32771,32772,32773,32774,49724,54320"
#UDP_PORTS="1,7,9,69,161,162,513,640,700,32770,32771,32772,32773,32774,31337,54321"
###########################################
# Опции Advanced Stealth Scan Detection #
###########################################
#
# Это номера портов, которые PortSentry должен контролировать в 
# Advanced mode.
# Любые порты "ниже" этого числа будут контролироваться. Оставьте это
# для контроля всего ниже 1023.
#
# На многих Linux системах нельзя привязать порты выше 61000. Это
# потому, что эти порты используются как часть IP маскарадинга. Я не 
# рекомендую вам привязываться к этим номерам портов. Реальность: Я не 
# рекомендую использовать порты за 1023, так как это будет приводить к 
# ошибочным предупреждениям. Вы были предупреждены!
# Не пишите мне если у вас возникли проблемы, потому что я просто 
# высказываю вам свое мнение. Не используйте выше 1023 порта.
#
# 
ADVANCED_PORTS_TCP="1024"
ADVANCED_PORTS_UDP="1024"
#
# Это поле говорит PortSentry, что порты (за исключением прослушиваемых 
# демонами) игнорируются. Это полезно для услуг, вызываемых ident, 
# например FTP, SMTP и wrappers, которые могут остаться не 
# запущенными.
#
# По установленным здесь портам PortSentry будет просто не отвечать
# на входящие запросы. Фактически, PortSentry будет их обрабатывать как 
# будто они привязаны к демонам. Заданные по умолчанию порты могут 
# выступать в отчетах, как возможно ложные сигналы тревоги и 
# вероятно должны быть оставлены для всез кроме особо изолированных систем
#
# TCP ident и NetBIOS сервисы
ADVANCED_EXCLUDE_TCP="113,139"
# Default UDP route (RIP), NetBIOS, bootp broadcasts.
ADVANCED_EXCLUDE_UDP="520,138,137,67" 

 ######################
# Конфигурационные файлы #
######################
#
# Игнорируемые хосты
IGNORE_FILE="/etc/portsentry/portsentry.ignore"
# Хосты, которым было отказано в доступе (из истории работы)
HISTORY_FILE="/var/log/portsentry/portsentry.history"
# Компьютеры доступ которым заблокирован только в этой сессии 
# (времмено до следующей перезагрузки)
BLOCKED_FILE="/var/log/portsentry/portsentry.blocked"
##############################
# Различные конфигурационные опции #
##############################
#
# Определять ли "имя" атакующего хоста используя DNS Name resolution 
# 1 – определять
# 0 – не определять
RESOLVE_HOST = "0"
###################
# Опции ответов #
###################
# Опции ликвидации атакующего. Каждое из этих действий будет
# выполняться если будет обнаружена атака. Если вы не хотите отдельную
# опцию, то комментируйте ее и она будет пропущена.
#
# Переменная $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.
##
# Linux с поддержкой ipfwadm
#KILL_ROUTE="/sbin/ipfwadm -I -i deny -S $TARGET$ -o"
#
#Linux с поддержкой ipfwadm (без логгирования)
#KILL_ROUTE="/sbin/ipfwadm -I -i deny -S $TARGET$"
#
#Linux с поддержкой ipchain
#KILL_ROUTE="/sbin/ipchains -I input -s $TARGET$ -j DENY -l"
#
#Linux с поддержкой ipchain (без логгирования)
#KILL_ROUTE="/sbin/ipchains -I input -s $TARGET$ -j DENY"
#
#Linux с поддержкой iptables
KILL_ROUTE="/sbin/iptables -I portscan_deny -s $TARGET$ -j DROP"
#
#Linux с поддержкой iptables support с лимитированием и логгирование
# лимитирование пакетов обеспечит защиту от DOS атак
# KILL_ROUTE="/sbin/iptables -I INPUT -s $TARGET$ -j DROP && /sbin/iptables -I INPUT -s $TARGET$ -m limit –limit 3/minute –limit-burst 5 -j LOG –log-level DEBUG –log-prefix 'Portsentry: dropping: '"
#
# For those of you running FreeBSD (and compatible) you can
# use their built in firewalling as well.
#
#KILL_ROUTE="/sbin/ipfw add 1 deny all from $TARGET$:255.255.255.255 to any"
#
#
# For those running ipfilt (OpenBSD, etc.)
# NOTE THAT YOU NEED TO CHANGE external_interface TO A VALID INTERFACE!!
#
#KILL_ROUTE="/bin/echo 'block in log on external_interface from $TARGET$/32 to any' | /sbin/ipf -f -" 

###############
# 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 режим. 
# Этот режим требует полного соединения и очень труден для обмана (spoof).
#
# Переменная KILL_RUN_CMD_FIRST должна быть выставлена в "1" для запуска внешней команды
# ДО блокирования. Установите в "0" для выполнения команды ПОСЛЕ блокирования
#
#KILL_RUN_CMD_FIRST = "0"
#
#
KILL_RUN_CMD="/usr/home/script/work/scan_port_mail.sh $TARGET$ $PORT$ $MODE$"
# for examples see /usr/share/doc/portsentry/examples/

#####################
# Значение триггеров сканирования #
#####################
# Введите число соединений к портам, когда вам будет дано предупреждение. 
# По умолчанию значение равно 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

В файле portsentry.ignore мы упоминаем IP-адреса компьютеров, которые не должны быть блокированы при подключении к отслеживаемому порту. По умолчанию, в файле заданы два IP-адреса: 127.0.0.1 и 0.0.0.0. туда следует добавить внутреннюю сеть и свои сервера.

После этого создаем указанный в конфиге внешний скрипт для отправки почты:

mkdir -p /usr/home/script/work/
cd /usr/home/script/work/
touch scan_port_mail.sh
chmod +x scan_port_mail.sh
 ###################### /usr/home/script/work/scan_port_mail.sh ######################
#!/bin/bash
# оповещение по почте о попытках сканирования хостов

# вводим переменные:
main_e_mail=”root@sane4ka.ru”
attak_date=”`date +%Y-%m-%d`”
attak_time=”`date +%H:%M:%S`”
local_mashine=”`uname -n`”

# достаём хост с которого сканили
hacker_IP=$1
scanned_port=$2

# определяем DNS-атакующего
hacker_DNS=`host ${hacker_IP} | awk ‘{print $5}’`

# ваяем тревожную мессагу
echo ” обнаружена попытка сканирования .
Имя машины:             ${local_mashine}
Отсканенные порты:       ${scanned_port}

Прикрепляем данные атакующего:
IP:     ${hacker_IP}
DNS:    ${hacker_DNS}
=======
Атака заблокирована.
” | mail -s port_scanned_on_${local_mashine} ${main_e_mail}

############################

Внимание: для работы скрипта необходимы: mail-client/mailx и net-dns/bind-tools

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



Информация взята с odminblog.ru и lissyara.su