zivot_je_cudo 30.04.2009 11:47
Linux Network Administration — TARPIT без patch-o-matic
Нередко приходится видеть в логах брутфорс ssh или ftp или не менее назойливый скан httpd-директории. Иногда атаки совершаются не только с внешних адресов, но и с хостов с домашней локальной сети, где куча виндовых пользователей, подхвативших вирусы.Есть масса способов защититься от этого, и я использую fail2ban. В сравнении с аналогичными программами он обладает более широкой функциональностью и гибкостью — позволяет использовать регексы для нестандартных сервисов и менять правила блокировки. Но хочется не просто защитить свой сервер от атак, а еще и слегка проучить атакующего.
Стандартными средствами iptables этого не сделать, но в расширенном варианте patch-o-matic, патче для ядра linux, есть цель TARPIT, позволяющая создать «ловушку» для нежелательных tcp-соединений.Работает это следующим образом: при обращении к порту, на котором стоит правило TARPIT, атакующий получает в ответ SYN-ACK (биты подтверждения на установление соединения), а так же принудительное установление размера tcp-окна, равным нулю. Это приводит к тому, что атакующая сторона не может передать никаких данных, а все ее попытки разорвать соединение игнорируются. Таким образом, соединение находятся в подвисшем состоянии до истечения тайм-аута (12-24 минут), что расходует ресурсы атакующей машины, но не атакуемой.
Узнав об этом, я сразу захотел прописать TARPIT вместо DROP в конфиг fail2ban и в запрещающие правила iptables, но при мысли, что для этого при каждом обновлении мне придется патчить ядро с patch-o-matic заново, просто опускались руки. И вообще, казалось очень странным и совсем не хотелось применять патч пятилетней давности к свежим исходникам. Оно и правильно, как оказалось, TARPIT теперь доступен и без патча ядра в составе xtables-addons. Все уже есть в ядре, для его использования надо лишь убедиться, что опция CONFIG_NETFILTER_XTABLES в конфиге ядра включена (y|m).
Xtables-addons представляет собой дополнительные расширения для iptables, ip6tables и ebtables. Среди интересных целей есть не только TARPIT, а так же DELUDE, CHAOS, DHCPMAC, ECHO, IPMARK, LOGMARK, STEAL, SYSRQ, TEE и др.
DELUDE отправляет ответ SYN-ACK на SYN, но RST на все остальные. Таким образом, сканер атакующей машины при SYN-сканировании показывает, что целевой порт открыт, в то время как на самом деле порт закрыт.
CHAOS создает запутывающий эффект для входящих соединений. Он рандомно может отвечать на соединения как REJECT и TARPIT или как REJECT и DELUDE.
ECHO отправляет назад все полученные пакеты :)
IPMARK позволяет помечать пакеты на основе их ip-адреса.
STEAL действует как DROP, но не вызывает ошибок, свойственных DROP в цепочке OUTPUT.
SYSRQ при срабатывании правила вызывает сигнал sysrq. Это полезно, если на машине, доступной только по сети, повисли жизненно важные части системы. И, конечно, в xtables для этого правила предусмотрена специальная защита по mac/ip или по паролю.
TEE клонирует пакет и перенаправляет его клон на другую машину сегмента локальной сети.
Дождавшись заветного TARPIT, сразу внес его в конфиг fail2ban, а так же и в те правила, куда неплохо было бы прибавить «месть». Получилось вот что:
1 |
for port in 137:139 445; do
|
Сюда попадаются виндовые сканеры шар, например lanscope. Пока не тестил, но думаю, это выглядит как зависание на моем адресе при сканировании локальной сети.
1 |
for ip in 10.128.17.61 75.127.73.253 208.50.46.46; do
|
Под эти правила попали самые жесткие и самые назойливые нарушители, для них моя машина теперь как одна сплошная куча, куда они наступают.
А это очередная защита от брутфорса. Разрешает SYN на ssh и ftp не чаще одного раза в 20 секунд, иначе — TARPIT.
Пробовал тестировать telnet-соединение на правило TARPIT. Результат — терминал на долгое время ушел в аут, не реагируя ни на ctrl-c, ни на ^>, пришлось закрывать вкладку.
Xtables-addons, как сообщается на оффициальном сайте, содержится в Alpine Linux, CRUX, Debian, Gentoo, PLD Linux, openSUSE, openWRT, Shorewall, Slackware и, возможно, других. От себя могу добавить, что с недавнего времени он доступен и в Arch Linux в виде PKGBUILD'a в AUR.
UPD: комментарий melco:
Когда добавляешь правило для TARPIT нужно обязательно выключать conntraq raw
таблице, иначе ты кушаешь не только ресурсы системы, которая атакует, но и свои
тоже :)
iptables -t raw -I PREROUTING -p tcp --dport $port -j NOTRACK
Username 30.04.2009 12:20 #
+ 0 -
в мемориз. Просьба написать небольшйой гайд по защите небольшого сайта.
Не тру, точнее не всегда тру.
В корпоративных сетях (да и не только) могут быть прикрыты все нестандартные порты.
В корпоративных сетях (да и не только) могут быть прикрыты все нестандартные порты.
Я не люблю переносить порты и не люблю, когда это делают другие, а моя защита от брутфорса намного эффективнее и даже идеальна.
даже идеальна
В доказательство - вот, что вижу каждое утро в парсере логов:
--------------------- SSHD Begin ------------------------
Failed logins from:
91.207.192.252: 1 time
Illegal users from:
210.83.25.77: 1 time
Users logging in through sshd:
hхххххх:
78.85.хх.хх (mail2.hхххххх.org): 2 times
Could not get shadow information for:
NOUSER : 1 Time(s)
---------------------- SSHD End -------------------------
И все, брутфорсеры повторяют запрос чаще одного раза в 20 секунд и попадают в гостеприимный TARPIT.
Failed logins from:
91.207.192.252: 1 time
Illegal users from:
210.83.25.77: 1 time
Users logging in through sshd:
hхххххх:
78.85.хх.хх (mail2.hхххххх.org): 2 times
Could not get shadow information for:
NOUSER : 1 Time(s)
---------------------- SSHD End -------------------------
Статья порадовала, спасибо.
Одно но: какая-то у вас странная терминология. То, что вы называете цепочкой, в манах зовется "target", т.е. "цель". А словом "chain" (т.е. "цепь") там называется INPUT и прочие
Одно но: какая-то у вас странная терминология. То, что вы называете цепочкой, в манах зовется "target", т.е. "цель". А словом "chain" (т.е. "цепь") там называется INPUT и прочие
Когда добавляешь правило для TARPIT нужно обязательно выключать conntraq raw таблице, иначе ты кушаешь не только ресурсы системы, которая атакует, но и свои тоже :)
iptables -t raw -I PREROUTING -p tcp --dport $port -j NOTRACK
iptables -t raw -I PREROUTING -p tcp --dport $port -j NOTRACK