PortSentry - средство противодействия сканированию портов
Достали всякие малолетние
придурки, сканящие порты да радостно брутфорсящие ssh... Ну правда
достали. Порылся в инете нашёл пару решений. Самым толковым, на мой
взгляд, оказалось PortSentry (сайт, к сожалению сдох - http://www.psionic.com/ ). Правда, в портах, оно водится.
/usr/home/lissyara/>cd /usr/ports
/usr/ports/>make search name='PortSentry'
Port: portsentry-1.1
Path: /usr/ports/security/portsentry
Info: Port scan detection and active defense
Maint: ports@FreeBSD.org
B-deps:
R-deps:
WWW:
/usr/ports/>cd /usr/ports/security/portsentry
/usr/ports/security/portsentry/>make && make install && make clean
| После установки идём править конфиги:
/usr/ports/security/portsentry/>cd /usr/local/etc/
/usr/local/etc/>ls | grep portsentry
portsentry.conf.default
portsentry.ignore.default
/usr/local/etc/>
/usr/local/etc/>cp portsentry.conf.default portsentry.conf
/usr/local/etc/>cp portsentry.ignore.default portsentry.ignore
/usr/local/etc/>
| Приводим конфиг программы - /usr/local/etc/portsentry.conf - к такому виду:
# TCP-порты которые должен слушать PortSentry - тут нельзя указывать
# порты, которые заняты приложениями - тока свободные. Проверить,
# что занято можно примерно так:
# sockstat | grep udp | grep -v 127.0.0.1 | awk '{print $6}' | sort | uniq -c
# или так, для tcp:
# sockstat | grep tcp | grep -v 127.0.0.1 | awk '{print $6}' | sort | uniq -c
TCP_PORTS="1,11,15,23,79,81,111,119,540,635,1080,1524,2000,5742,6667,8080,8085"
# UDP-порты для прослушивания
UDP_PORTS="1,7,9,69,513,635,640,641,700"
# Верхний порт диапазона, если используется метод
# Advanced Stealth Scan Detection Options - но я его не юзаю,
# по причине, что снаружи можно подключаться тока к
# ограниченному списку портов - поэтому слушать весь
# диапазон от 1 до 1024 просто бесполезно....
ADVANCED_PORTS_TCP="1024"
ADVANCED_PORTS_UDP="1024"
# порты исключаемые из прослушивания при работе в Адванцед моде
ADVANCED_EXCLUDE_TCP="113,139"
ADVANCED_EXCLUDE_UDP="520,138,137,67"
# Список игнорируемых хостов (как бы они себя не вели,
# и какие б действия не предпринимали, к ним не будут
# применяться меры противодействия)
IGNORE_FILE="/usr/local/etc/portsentry.ignore"
# Список хостов, которые были внесены в блэклист
# (история работы программы)
HISTORY_FILE="/usr/local/etc/portsentry.history"
# строка по которой строится имя файла куда писать
# заблокированные хосты
BLOCKED_FILE="/usr/local/etc/portsentry.blocked"
# резольвить IP хостов в имена, или нет. Рекомендуется не
# резольвить - лишняя нагрузка на сервер...
RESOLVE_HOST = "1"
# Какие телодвижения предпринимать при обнаружении сканирования:
# 0 = ничё не делать - некатит, такая опция :)
# 1 = заблокировать хост и запустить внешнюю команду
# 2 = только запустить внешнюю команду
BLOCK_UDP="1"
BLOCK_TCP="1"
# команда на блокирование хоста. я использую IPFW поэтому им и блокирую.
# а вообще рекомендую посмотреть пример конфига, котороый идёт с программой
# там есть и другие варианы, в частностью с помощью роутинга...
KILL_ROUTE="/sbin/ipfw add 2 deny all from $TARGET$:255.255.255.255 to any"
# Если поставить 1 то вначале запускается KILL_RUN_CMD а потом
# уже KILL_ROUTE, ну и наоборот если 0
KILL_RUN_CMD_FIRST = "0"
# Внешняя команда выполняемая при обнаружении сканирования портов,
# я написал скриптик, шлющий мне письмо...
KILL_RUN_CMD="/usr/script/work/scan_port_mail.sh $TARGET$ $PORT$"
# Сколько портов будет позволено отсканить прежде чем будет выполнено
# действие. 0 - реагирует сразу после первого же порта, 1 - на втором,
# 2 - на третьем, 3 - ....
SCAN_TRIGGER="0"
# Какой `баннер` вешать на порты слушаемые PortSentry. Вообще, это делать не
# рекомендуется, т.к. может разозлить нападающего...
#PORT_BANNER="*** YOUR CONNECTION ATTEMPT HAS BEEN LOGGED..."
| И файл со списком игнорируемых хостов и сетей - /usr/local/etc/portsentry.ignore:
# Файл с игнорируемыми хостами для PortSentry
# Забиваются либо хосты, либо сеть/маска
# по одному на строчку.
127.0.0.1/32
0.0.0.0
192.168.20.0/24
| Затем создаём директорию, где хранится указанный в конфиге скрипт
/usr/local/etc/>mkdir -p /usr/script/work/
/usr/local/etc/>cd /usr/script/work/
/usr/script/work/>touch scan_port_mail.sh
/usr/script/work/>chmod +x scan_port_mail.sh
| Ну и пишем сам скрипт:
#!/bin/sh -xv
# оповещение по почте о попытках сканирования хостов
# вводим переменные:
main_e_mail="admin@lissyara.su"
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}
| Теперь надо в файрволле открыть снаружи порты, которые слушает PortSentry, это кусок моего файрволла:
# для сканируемых портов правила. Для TCP разбиты на
# две группы по причине, что ipfw не позволяет перечислять
# больше 10 портов за раз.
${FwCMD} add allow tcp from any to ${IpOut} \
1,11,15,23,79,81,111,119,540,635 via ${LanOut}
${FwCMD} add allow tcp from any to ${IpOut} \
1080,1524,2000,5742,6667,8080,8085 via ${LanOut}
${FwCMD} add allow udp from any to ${IpOut} \
1,7,9,69,513,635,640,641,700 via ${LanOut}
| Перезапускаем файрволл командой:
Запускаем PortSentry:
/usr/local/etc/>/usr/local/etc/rc.d/portsentry.sh start
portsentry (tcp udp)
/usr/local/etc/>
| Сморим открытые порты:
/usr/local/etc/>sockstat | grep ports
root portsent 439 0 udp4 *:1 *:*
root portsent 439 1 udp4 *:7 *:*
root portsent 439 2 udp4 *:9 *:*
root portsent 439 3 udp4 *:69 *:*
root portsent 439 4 udp4 *:513 *:*
root portsent 439 5 udp4 *:635 *:*
root portsent 439 6 udp4 *:640 *:*
root portsent 439 7 udp4 *:641 *:*
root portsent 439 8 udp4 *:700 *:*
root portsent 437 0 tcp4 *:1 *:*
root portsent 437 1 tcp4 *:11 *:*
root portsent 437 2 tcp4 *:15 *:*
root portsent 437 3 tcp4 *:23 *:*
root portsent 437 4 tcp4 *:79 *:*
root portsent 437 5 tcp4 *:81 *:*
root portsent 437 6 tcp4 *:111 *:*
root portsent 437 7 tcp4 *:119 *:*
root portsent 437 8 tcp4 *:540 *:*
root portsent 437 9 tcp4 *:635 *:*
root portsent 437 10 tcp4 *:1080 *:*
root portsent 437 11 tcp4 *:1524 *:*
root portsent 437 12 tcp4 *:2000 *:*
root portsent 437 13 tcp4 *:5742 *:*
root portsent 437 14 tcp4 *:6667 *:*
root portsent 437 15 tcp4 *:8080 *:*
root portsent 437 16 tcp4 *:8085 *:*
/usr/local/etc/>
| Ну и
всё. Если есть возможность пробуем снаружи, если нету, то изнутри,
предвартельно убрав свою сеть из списка игнорируемых (на крайний случай с
локалхоста, убрав его из этого списка, и презапустив прогу), и
наблюдаем в /var/log/messages такие сообщения:
Feb 20 12:17:52 bsd-411 portsentry[288]: adminalert: PortSentry is now active and listening.
Feb 20 12:19:02 bsd-411 portsentry[286]: attackalert: Connect from host: 192.168.20.254/192.168.20.254 to TCP port: 1
Feb 20 12:19:02 bsd-411 portsentry[286]: attackalert: Host
192.168.20.254 has been blocked via dropped route using command:
"/sbin/ipfw add 1 deny all from 192.168.20.254:255.255.255.255 to any"
Feb 20 12:19:02 mail2 portsentry[286]: attackalert: External command run
for host: 192.168.20.254 using command:
"/usr/script/work/scan_port_mail.sh 192.168.20.254 1"
|
Правила в файрволле так и будут висеть до перезагрузки или перезапуска
файрволла. При этом если их убрать, но программу не перезапустить, то
снова для этого хоста правило не добавится:
Feb 20 12:19:55 bsd-411 portsentry[286]: attackalert: Connect from host: 192.168.20.254/192.168.20.254 to TCP port: 1
Feb 20 12:19:55 bsd-411 portsentry[286]: attackalert: Host: 192.168.20.254 is already blocked. Ignoring
|
Советую внимательно сверить списки открытых портов и слушаемых portSentry, наличие таких строк
sockstat | grep "*.*"
root portsent 58212 3 udp4 *:* *:*
| говорит о вашей попытке повесить прослушку на занятый порт.
|