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