Переведены две статьи про блокирование "bruteforce" атак на ssh с помошью pf:
- Блокировка bruteforce атак на ssh с помощью PF (http://wiki.bsdportal.ru/doc:grblocksshbroteforce)- Замедление bruteforce атак на SSH с помощью PF (http://wiki.bsdportal.ru/doc:grblocksshbruteforce)
URL: http://wiki.bsdportal.ru/doc:grblocksshbroteforce
Новость: http://www.opennet.me/opennews/art.shtml?num=7471
Имхо проще перенести sshd на нестандартный порт.
IMHO такие вещи лучше решать с помощью файрвола. А сканить будут один фиг по диапазону портов. И ваш "нестандартный" порт будут пытаться сломать всё равно.....
Я чего-то остро недопонимаю - сканят, да пусть хоть обсканятся наизнанку.Не ханипоты же поднимать для выявления активности???
Ну а "брутфорс", не громковато ли сказано для возможности отрубить средствами sshd
на полчасика вход после первой неудачной попытки, когда имя судуера
тоже надо еще как УГАДАТЬ?Только судуер "kjhcsa8ucwh9cwh2h73rc73f2npeklu;" может войти по SSH.
Одна попытка на 10 сек и 30 мин отдыхать. КАКОЙ "брутфорс"?Мне сканирующие порты господа очень помогают - я вижу точки и почерк
развития активности.ИМХО описанный подход - это как охране банка конопатить уши ватой,
чтобы не раздражал скрип пилы об сейф.
>Ну а "брутфорс", не громковато ли сказано для возможности отрубить средствами sshd
>
>на полчасика вход после первой неудачной попытки, когда имя судуера
>тоже надо еще как УГАДАТЬ?
>
>Только судуер "kjhcsa8ucwh9cwh2h73rc73f2npeklu;" может войти по SSH.
>Одна попытка на 10 сек и 30 мин отдыхать. КАКОЙ "брутфорс"?Не мог бы кто-нибудь ткнуть меня носом, как именно это сделать? в манах нету, в доках не нашёл... А очень хочется знать.
>Имхо проще перенести sshd на нестандартный порт.
Поддерживаю.
а для iptables как подобного добиться?
Поддерживаю - перенес sshd на нестандартный порт и все.
iptables -A INPUT -p tcp --syn --dport 22 -m recent --name radiator --set
iptables -A INPUT -p tcp --syn --dport 22 -m recent --name radiator --update --seconds 60 --hitcount 4 -j DROP
Три соединения (новых) в минуту пускает нормально, дальше дропает. Если минуту не дергаться, соответственно можно опять подключаться. Переборшиков блокирует на ура.
на 2.4.31 это работать должно? у меня не пускает ни разу по этой паре правил.
и на 2.6.16.7 тоже дропаются соединения. вы это проверяли? может еще что-то дописать нужно?
Это точно работает так, как задумано на 2.6.12/iptables 1.3.4 (то что сейчас крутится)
"recent match support" включено?
включено. эксперимент на 2.6.16.7/14 - показал что это (больше) не работает.
iptables v1.3.5
*очень уж хочется, что-бы это работало :)*может я торможу и там само-собой еще какие-нибудь правила нужно дописать? где собственно оно пускает-то? accept где будет?
Дык, блин...
Ну конечно ACCEPT после этих правил должен идти. Что-нить стандартное типа `-dport 22 -j ACCEPT`.
угу, уже работает, догадался :)
спасибо. хорошая штука.вообще удобный модуль (посмотрел его сайт - мне понравился пример с блокированием всего от того, кто стукнулся на не тот порт).
Кстати, сперто отсюда
http://www.linux.org.ru/view-message.jsp?msgid=1320671
man iptables
---
limit
This module matches at a limited rate using a token bucket filter. A
rule using this extension will match until this limit is reached
(unless the `!' flag is used). It can be used in combination with the
LOG target to give limited logging, for example.--limit rate
Maximum average matching rate: specified as a number, with an
optional `/second', `/minute', `/hour', or `/day' suffix; the
default is 3/hour.--limit-burst number
Maximum initial number of packets to match: this number gets
recharged by one every time the limit specified above is not
reached, up to this number; the default is 5.
---
Интересно, а как модуль limit сможет отличить авторизацию на ssh, от работы уже авторизованного пользователя?, а то получиться что он будет тормозить нормальную работу.
[!] --syn
Only match TCP packets with the SYN bit set and the ACK,RST and
FIN bits cleared. Such packets are used to request TCP connec-
tion initiation; for example, blocking such packets coming in an
interface will prevent incoming TCP connections, but outgoing
TCP connections will be unaffected. It is equivalent to --tcp-
flags SYN,RST,ACK,FIN SYN. If the "!" flag precedes the
"--syn", the sense of the option is inverted.
Тогда получиься задержка не на каждую авторизацию, а на каждую вторую авторизацию, т.к. ssh сервер (у меня по крайней мере) допускает две попытки авторизации в рамках одного соединения, хотя и этого достаточно.
Что-то мне все эти лимиты не нравятся. Лучше уж разрешить доступ только для определённых сетей.
пожалуйста, не пишите ересь про перенос на нестандартный порт. это помогает только против школьников.
надежной защитой является правильная настройка firewall + запрет на доступ из внешних сетей + авторизация по ключам.
Под BSD найти бы такое...iptables -A INPUT -d $INADDR -m state --state NEW -m tcp -p tcp --dport 22 -m recent --rcheck --name SSH -j ACCEPT
iptables -A INPUT -d $INADDR -m state --state NEW -m tcp -p tcp --dport 1599 -m recent --name SSH --remove -j DROP
iptables -A INPUT -d $INADDR -m state --state NEW -m tcp -p tcp --dport 1600 -m recent --name SSH --set -j DROP
iptables -A INPUT -d $INADDR -m state --state NEW -m tcp -p tcp --dport 1601 -m recent --name SSH --remove -j DROP
iptables -A INPUT -d $INADDR -p tcp --dport 22 -j DROPНа 22 коннект закрыт пока не стукнешься на 1600.
telnet myhost 1600
и мой IP заносится в список, теперь можно на 22 коннектить...
Очень интересный пример кстати!
/usr/ports/security/doorman - не поможет?
Я чуть-чуть доработал пример - иначе nmap открывает порт.
iptables -A INPUT -d $INADDR -m recent --rcheck --name SCAN --seconds 60 -j DROP
iptables -A INPUT -d $INADDR -m state --state NEW -m tcp -p tcp --dport 22 -m recent --seconds 5 --rcheck --name SSH -j ACCEPT
iptables -A INPUT -d $INADDR -m state --state NEW -m tcp -p tcp --dport 1599 -m recent --name SSH --remove -j DROP
iptables -A INPUT -d $INADDR -m state --state NEW -m tcp -p tcp --dport 1600 -m recent --name SSH --set -j DROP
iptables -A INPUT -d $INADDR -m state --state NEW -m tcp -p tcp --dport 1601 -m recent --name SSH --remove -j DROP
iptables -A INPUT -d $INADDR -p tcp --dport 22 -m recent --name SCAN --set -j DROP
Ещё один вариант:
http://ethernet.org/~brian/src/timelox/
и небольшой комментарий к нему:
http://wwwx.cs.unc.edu/~hays/dev/timelox_and_TheHand/
Для IPTables есть hashlimit, который уже, даже, включен стд релиз.
http://www.netfilter.org/projects/patch-o-matic/pom-submitte...$IPTABLES -A tcp_packets -p tcp -m tcp -d $SSH_SERVER --dport 22 -m state --state NEW -m hashlimit --hashlimit 1/hour --hashlimit-burst 2 --hashlimit-mode srcip --hashlimit-name SSH --hashlimit-htable-expire 360000 -j ACCEPT
Почти такое же решение, но своего "производства", использовал на фре. Потом отказался. ИМХО лучше прописать доступ по ssh с доверенного хоста/хостов.
Основное тут, то что можно и нужно не блокировать, а затормозить и выдать ошибочную информацию для атакующего :)
Для аттакующего разбор логов Nmap и поиск по этим результатам уязвимостей и применение их и так процесс достаточно "депресивный" а тут еще и обманывают его на каждом порту/шаге :)
>Основное тут, то что можно и нужно не блокировать, а затормозить и
>выдать ошибочную информацию для атакующего :)
>Для аттакующего разбор логов Nmap и поиск по этим результатам уязвимостей и
>применение их и так процесс достаточно "депресивный" а тут еще и
>обманывают его на каждом порту/шаге :)
Ну для особо боязливых (я к ним отношусь) существует portsentry. Бывае иногда что срывается по постяками, но в основном я доволен.
pf рулит однако... хотя с другой стороны дыры php на хостинговом сервере таким образом не заткнешь :-/
Ребятя, а про sshlockout уже все забили ?
Или никто и не знал ?
> Ребятя, а про sshlockout уже все забили ?
Какой именно? Гугл показал несколько версий, например:
http://www.xyz.com/progs/sshlockout.c
http://archives.neohapsis.com/archives/freebsd/2005-10/0023....
http://tinyurl.com/84b5o// greyork
Любой, главное у тебя есть открытый код который можно локализировать под свои нужды.
> Любой, главное у тебя есть открытый код который можно локализировать под свои нужды.Вы совершенно правы. Но, аргументы вроде этого:
$ apt-cache search sshlockout
(пусто)
тоже по своему верны, вы не находите? :) Особенно - в случае "боевого" сервера.// greyork
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <stdarg.h>
#include <syslog.h>int
main(int ac, char **av)
{
char buf[1024];
char *str;
int n1;
int n2;
int n3;
int n4;openlog("sshlockout", LOG_PID|LOG_CONS, LOG_AUTH);
syslog(LOG_ERR, "sshlockout starting up");
freopen("/dev/null", "w", stdout);
freopen("/dev/null", "w", stderr);while (fgets(buf, sizeof(buf), stdin) != NULL) {
if (strstr(buf, "sshd") == NULL)
continue;
if (strstr(buf, "Failed password") == NULL)
continue;
if ((str = strstr(buf, "Failed password for root from")) != NULL ||
(str = strstr(buf, "Failed password for admin from")) != NULL
) {
while (*str && (*str < '0' || *str > '9'))
++str;
if (sscanf(str, "%d.%d.%d.%d", &n1, &n2, &n3, &n4) == 4) {
syslog(LOG_ERR, "Detected ssh password login attempt for root, locking out %d.%d.%d.%d\n", n1, n2, n3, n4);
snprintf(buf, sizeof(buf), "ipfw add 2100 deny tcp from %d.%d.%d.%d to me 22", n1, n2, n3, n4);
system(buf);
}
continue;
}
if ((str = strstr(buf, "Failed password for invalid user")) != NULL) {
str += 32;
while (*str == ' ')
++str;
while (*str && *str != ' ')
++str;
if (strncmp(str, " from", 5) == 0 &&
sscanf(str + 5, "%d.%d.%d.%d", &n1, &n2, &n3, &n4) == 4) {
syslog(LOG_ERR, "Detected ssh password login attempt for an invalid user, locking out %d.%d.%d.%d\n", n1, n
2, n3, n4);
snprintf(buf, sizeof(buf), "ipfw add 2100 deny tcp from %d.%d.%d.%d to me 22", n1, n2, n3, n4);
system(buf);
}
}
}
syslog(LOG_ERR, "sshlockout exiting");
return(0);
}
нестандартный порт и сообщений об ошибочной авторизации более чем
достаточно для выявления и пресечения нежелательной активности.я печатаю быстро вслепую, частенько ошибаюсь. что, полчаса ждать разрешения?
кстати, печатать медленно гораздо опаснее: часто рядом не в меру любопытный
юзверь на твои руки зеньки лупит. просить отвернуться как то неудобно:
я ведь не ссать собираюсь :-)хуйнёй вы занимаетесь, ребята, никому это не надо.
1. xinetd, я так понимаю, никто не использует, и не знает о его параметре only_from2. использовать в качестве метода защиты DoS sshd - да это круто.
согласен с предыдущим оратором - хуйней вы занимаетесь.
> 1. xinetd, я так понимаю, никто не использует, и не знает о его параметре
> only_from
> 2. использовать в качестве метода защиты DoS sshd - да это круто.ну тупой, ну тупой - америкосы рядом даже не валялись
прочитай внимательно"Переведены две статьи про блокирование "bruteforce" атак на ssh"
Для подобных целей использую софтинку по имени fail2ban. Весьма удобно и конфигурябельно.
Смотрит лог и блокирует IP после N неудачных попыток авторизации, на M минут. M и N настраиваемо. В мыло шлет сообщения о заблокированных брутфорсерах.
ИМХО единственный минус - написано не питоне, ибо не на всех боевых серверах есть питон.
Вот тоже как вариант
/usr/ports/security/bruteforceblocker/BruteForceBlocker is a perl script, that works along with pf - OpenBSD's
firewall (Which is also available on FreeBSD since version 5.2 is out).
It's main purpose is to block SSH bruteforce attacks via firewall.
When this script is running, it checks sshd logs from syslog and looks
for Failed Login attempts - mostly some annoying script attacks, and
counts number of such attempts. When given IP reaches configured limit
of fails, script puts this IP to the pf's table and blocks any further
traffic to the that box from given IP (This also depends on
configuration done in pf.conf).
По моему такие вещи должны решаться на уровне самого sshd.
первый человек, смотрящий в корень проблемы.
Вопрос в том, почему до сих пор разработчики SSHD не предусмотрели возможность блокировать IP после определенного количества неудачных логинов?
еще бы chroot сделали из коробочки...
от нафлудили...а доступ по паре клюучей сделать слабо, да ?
или серты это типа тока ентрепрайз... ???я вообще от паролей отошел уже давно ибо у меня ноут мой и таксаю я везде его с собой, и помнить всех и вся мне в лом...
а брутфорсеры ?! ну пусть подбриают мой 1024-rsa + dsa хостовый :))))
Мне кажется тут в запарке забыли, что бывает не только скан 64к портов на одном адресе, но и скан всей сетки по порту.
Ежели не забанить желающих, то можно и 50 метров на адрес поиметь "незаказанного" трафика в месяц.
Умножте на количество хостов в сети с 22 портом.
А если создать эмитатор подключения к sshd и редиректить на этот порт атакующего.
Можно повесилиться обоим сторонам. :))