PortSentry - средство противодействия сканированию портов
Введение
Сканирование портов является одним из самых распространенных и простых способов узнать, какая операционная система установлена на компьютере, какие службы запущены в данный момент и получить другую информацию о компьютере, подключенном к Internet , которая может быть использована для взлома и проникновения. Существует много программ для обнаружения сканирования портов. Но обнаружения не достаточно. Должна последовать адекватная реакция. "Адекватная реакция" может заключаться в отправке в сторону сканирующего тебя человека неправильного фрагментированного пакета, ответного сканирования портов, установки на него firewall'а и т.д. Также желательно, чтоб он получил недостоверную информацию об открытых портах на твоем компьютере. Все это и многое другое позволяет делать прекрасная программа Psionic Software Portsentry.
Когда сканирование обнаружено могут последовать следующие ответы:
- занесение информации об инциденте в системный журнал через syslog().
- Компьютер замеченный в сканировании автоматически заносится в файл /etc/host.deny для TCP Wrappers.
- Локальный компьютер автоматически перенастраивается, чтобы направлять весь трафик от атакующего на несуществующий компьютер.
- Локальный компьютер автоматически перенастраивается, чтобы блокировать все пакеты от атакующего пакетным фильтром.
Цель этой программы – дать администратору информацию о том, что их сервер исследуется.
Установка
Для этого необходимо:
echo net-analyzer/portsentry ~x86 >> /etc/portage/package.keywords
Устанавливаем программу:
emerge -av net-analyzer/portsentry
Настройка
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}
############################
В случае фаервола естественно необходимо открыть прослушиваемые порты, для более успешной рыбалки.
Информация взята с odminblog.ru и lissyara.su