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

Материал из Ай да Linux Wiki
Перейти к навигации Перейти к поиску
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.


Введение

Сканирование портов является одним из самых распространенных и простых способов узнать, какая операционная система установлена на компьютере, какие службы запущены в данный момент и получить другую информацию о компьютере, подключенном к 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@mail.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