Апр 08 2009

Блокируем подбор паролей(bruteforce ssh) c помощью bruteblock(IPFW)

За последнее время черви подбирающие пароли по ssh, расплодились в невероятном количестве. Я до сих пор не понимаю политику большинства разработчиков Linux дистрибутивов, которые оставляют открытым доступ rootа по ssh. Что бы его отключить достаточно в sshd_config поставить:

PermitRootLogin no


а если быть совсем точным, то убрать строку:

PermitRootLogin yes

Ведь пока sshd явно не укажешь, что rootа надо пускать, он ни за что не согласиться этого делать. Впрочем не одним рутом живут ssh черви. Применив нормальный, хороший пароль мы избавим себя от головной боли связанной с червями, но почему то многие этого не делают и в /var/log/auth.log, миллионами появляются записи:

Apr  8 12:33:55 office sshd[52421]: error: PAM: authentication error for illegal user admin from mailserver.proscenio.it
Apr  8 12:33:55 office sshd[52421]: Failed keyboard-interactive/pam for invalid user admin from 62.48.34.204 port 37057 ssh2
Apr  8 12:34:21 office sshd[52425]: Invalid user admin from 213.155.3.16
Apr  8 12:34:21 office sshd[52425]: error: PAM: authentication error for illegal user admin from 213.155.3.16
Apr  8 12:34:21 office sshd[52425]: Failed keyboard-interactive/pam for invalid user admin from 213.155.3.16 port 48258 ssh2
Apr  8 12:35:11 office sshd[52443]: Invalid user admin from 189.17.110.2

Соответственно, используя нормальные пароли за такой подбор можно не переживать. Но как же он все таки раздражает.
Для борьбы с брутефорсом существует много утилит, в основном все они работают с разными файерволами, препятствуя доступу на уровне соединения. Есть утилиты которые работают через hosts_allow. Там где используется pf, я применяю bruteforceblocker, я писал о нем в статье Подбор паролей ssh
Когда ядро собрано с IPFW, я применяю bruteblock. Он несколько попроще, не так универсален, у меня потребовал доработки регекспов. А принцип в общем у него такой же как и у bruteforceblockerа, находим в логе запрос на авторизацию, засекаем, если часто(определяется в файле настроек) повторяются неудачные попытки с этого адреса, вносим в таблицу файерволла, тем самым блокируя доступ к серверу.
Установим его из портов:

cd /usr/ports/security/bruteblock/
make install clean

После установки, в первую очередь отредактируем файл настроек /usr/local/etc/bruteblock/ssh.conf, у меня получился такой вариант:

#regexp - тут задаются строки на которые будет реагировать 
#bruteblock, как на попытку подбора пароля
regexp          = sshd.*Illegal user \S+ from (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})
regexp1         = sshd.*Failed keyboard-interactive\/pam for (?:invalid user )?\S+ from (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})
#количество неудачных попыток
max_count       = 4
#Неудачные попытки считаются за промежуток времени
#определенный в переменной within_time, в нашем случае это 10
#минут
within_time     = 600
#Блокируем адрес на час
reset_ip       = 3600
#Номер таблицы файерволла в которую будут заносится #блокированные адреса
ipfw2_table_no = 50

Теперь изменим файервол так, что бы он блокировал доступ к 22 порту с адресов занесенных в таблицу 50. Для этого нужно добавить такое правило:

ipfw add 50 deny tcp from table(50) to me dst-port 22 in recv em0

em0 внешний интерфейс, тот на который и ломятся подбиральщики паролей.
Теперь остается только запустить два процесса, один независимый, он занимается очисткой таблицы, а второй, его запускает syslogd, он вносит в таблицу адреса.
В syslog.conf, внесем такие изменения, было:

auth.info;authpriv.info                         /var/log/auth.log

сделаем:

auth.info;authpriv.info                         |exec /usr/local/sbin/bruteblock -f /usr/local/etc/bruteblock/ssh.conf
auth.info;authpriv.info                         /var/log/auth.log

и перезапустим syslogd:

/etc/rc.d/syslogd restart

Теперь брутефорсеры будут блокироваться. Но, это мне кстати довольно сильно не понравилось, у bruteblocker отсутствует whitelist, который бы позволил исключить из блокирования «свои» адреса, как альтернатива этому «белому списку», происходит временный бан, через час, согласно моим настройкам, можно попробовать снова зайти на сервер по ssh. Поскольку я работаю чаще всего с bruteforceblocker, такая модель мне представляется просто неудобной, но скорее всего это дело привычки. Хотя при подключении клиента, я попал на компьютер с пунто свитчером и очень удивлялся, почему меня заблокировало.
Запустим эту вторую компоненту, для этого, разрешим ее запуск и установим соответствующие флаги:

#Разрешаем запускать bruteblockd
bruteblockd_enable="YES"
#Все брутефорсеры в таблице 50
bruteblockd_table="50"
#Между циклами работы пауза 5 секунд
bruteblockd_flags="-s 5"

И запускаем:

/usr/local/etc/rc.d/bruteblockd start

Для нормального срабатывания bruteblock, в /etc/ssh/sshd_config нужно указать опцию:

UseDNS no

И перезапустить sshd.
На этом настройка закончена.

Добавить в закладки:

google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru news2.ru rumarkz.ru memori.ru moemesto.ru
  • By Михаил, 13.04.2009 @ 15:48

    В дополнение к этому помогает еще смена порта на что-либо менее распостраненное, что существенно снижает количество атак.

  • By hilik, 13.04.2009 @ 16:06

    Смена порта, жутко не удобная вещь. Я потом постоянно удивляюсь почему ssh не sshится, а scp не scpается. С другой стороны, считаю, что хорошим вариантом является закрыть доступ ко всем серверам из вне своей сети по ssh и оставить один наименее критичный сервер с открытым доступом. Ну и несомненно регулярная смена паролей тоже приветствуется.

  • By Олег, 16.04.2009 @ 17:11

    В тех линуксах, в которых нельзя руту, обычно в sudoers ALL = NOPASSWD: ALL, что еще хуже, имхо, так как менее заметно. fail2ban спасает, ага. Ну и порт поменять, куда ж без этого )

  • By Олег, 16.04.2009 @ 17:13

    Кстати насчет паролей. Ключи не в моде?

  • By hilik, 19.04.2009 @ 12:30

    Ключи — это хорошо, но что бы разместить его, нужно хоть раз авторизоваться :)
    И как это связано с проблемой брутофорса пароля непонятно.
    Пусть во всех акаунтах стоит звезда, но подборов паролей от этого меньше не станет.

  • By Voet, 30.04.2009 @ 16:56

    Я на всех своих серверах установил ключи. Жить стало легче. И главное, успокоился немного.

  • By hilik, 08.05.2009 @ 10:09

    И звезду в пароль?

  • By AndyJah, 19.08.2009 @ 13:48

    Поможите плизь! Все вродь делаю по мануалу, НО получаю в строке ipfw add 50 deny tcp from table(50) to me dst-port 22 in recv em0 при рестарте фаера /etc/fw.trkpodilya: 35: Syntax error: «(» unexpected
    Что бы это значило?????

  • By hilik, 19.08.2009 @ 14:04

    Скобки заэкранированны слешами?
    table \( 50 \)

  • By AndyJah, 20.08.2009 @ 10:10

    О! Благодарствую! Об этом нюансе я не знал! А как, собственно, в бою проверить работу «брутблока»?

  • By hilik, 20.08.2009 @ 22:50

    С какого нибудь адреса неправильно ввести пароль, несколько раз. Заблочит, значит все настроенно правильно.

  • By AndyJah, 27.08.2009 @ 17:52

    Хе! Работаить! )) Сенкь огроменный! Прекрастый блог — продолжай в том же стиле. зы. Давно уж в закладах…..

  • By dima, 10.04.2010 @ 09:11

    спасибо полезная инфомрация

    эта штука быстро добавляет ip в ipfw таблицу?

  • By andy03, 22.07.2010 @ 13:08

    суперская прога юзал на одной конторе… после выходных таблица на несколько экранов

    правда сам пару раз тупил и блокировал себя :)

Other Links to this Post


Украинская Баннерная Сеть