Системный метод защиты от перебора паролей в Drupal

Главные вкладки

Аватар пользователя axel axel 30 июня 2009 в 9:54

Друпал не предоставляет встроенной защиты от перебора паролей, а именно перебор один из традиционных способов получения несанкционированного доступа к сайту. Особенно с учётом того, какие простые пароли очень часто используют пользователи. Простейший способ избежать перебора - после нескольких неудачных попыток ввода пароля блокировать дальнейший ввод на некоторое время. Для удалённых систем логично блокировать IP пользователя. Достаточно паузы в несколько минут, чтобы серьёзно затруднить работу программ перебора или вообще сделать перебор нецелесообразным. Для использования такого метода в Drupal несложно написать модуль использующий hook_user() с проверкой количества введённых паролей и в случае их превышения для определённого имени - блокировкой IP или блокировкой ввода пароля на некоторое время. Может быть такой модуль кто-то уже делал? Но оставляю написание этого кода тем кто хочет потренироваться в работе с механизмом регистрации друпала, а в этой статье хочу рассмотреть другой метод, основанный на внешнем п/о.

В юниксе есть такое средство для блокировок перебора паролей - fail2ban. Он работает как демон и анализирует логи различных программ (ssh, ftp, вебсервера и др. определённые в настройках), при обнаружении многократных неудачных попыток входа - принимает меры (опять же как определено в настройках - блокирует ip и/или высылает уведомления админу на почту). Такое системное средство удобно тем, что проверки осуществляются централизованно для всех сервисов хоста и настройки собраны в одном месте. Есть и другие подобные программы, но fail2ban хорошо справляется со своей задачей и имеется в наличии в разных дистрибутивах Linux (Debian, CentOS, Gentoo), во FreeBSD, поэтому я использую всегда его, настраивая как минимум на проверку логов ssh и ftp. Для этого в fail2ban есть готовые конфиги. Но как известно, Drupal c версии 6 умеет писать свои логи не только в базу, но и в системный лог (для этого нужно включить модуль syslog), что даёт возможность анализа такими утилитами как fail2ban. Нужно только объяснить fail2ban какой лог нужно брать и что в нём искать. Это делается несложным указанием конфигурации:

Во-первых создаём в /etc/fail2ban/filter.d/ файл drupal-auth.conf (путь к файлам с фильтрами в сборке fail2ban для вашей ОС может быть другим):

# cat > /etc/fail2ban/filter.d/drupal-auth.conf

со следующим содержимым (копируйте один к одному):

# Fail2Ban configuration file
#
# Author: Axel <axel@drupal.ru>
#
# $Revision: 1 $
#

[Definition]

# Option:  failregex
# Notes.:  regex to match the password failures messages in the logfile. The
#          host must be matched by a group named "host". The tag "<HOST>" can
#          be used for standard IP/hostname matching and is only an alias for
#          (?:::f{4,6}:)?(?P<host>\S+)
# Values:  TEXT
#
failregex = \|user\|<HOST>\|.*\|Login attempt failed (.+)\.$

# Option:  ignoreregex
# Notes.:  regex to ignore. If this regex matches, the line is ignored.
# Values:  TEXT
#
ignoreregex =

(и не забудьте для выхода из cat нажать Ctrl+D после копирования в файл текста)

Те кто понимает язык регвыров быстро поймёт, что значит эта запись - мы просто ищем в логе соответствия строкам содержащим Login attempt failed username. - именно это друпал сообщает в лог при ошибочных попытках ввода пароля для username.

Далее в /etc/fail2ban/jail.conf дописываем:

[drupal-auth]
enabled = true
filter = drupal-auth
action = iptables[name=Drupal, port="http", protocol=tcp]
logpath = /var/log/messages
bantime  = 180

Дополнение: для Debian конфиг в jail.conf будет такой:

[drupal-auth]
enabled = true
filter = drupal-auth
port = http
protocol = tcp
logpath = /var/log/messages
bantime = 180

Тут нужно только точно знать, куда в вашей системе попадают логи друпала. Обычно это /var/log/messages или /var/log/syslog, но вообще зависит от настроек системного лога и установленного для этого п/о. У меня например на машине, где сейчас это тестирую стоит metalog и логи по-умолчанию попадают в /var/log/everything/current. Лог указывается в параметре logpath, а в параметре action мы указываем реакцию на него. В данном случае это блокирование IP с помощью файрвола iptables для указанного порта 80 (www) и протокола tcp. Адрес атакующего будет забанен на 180 секунд - достаточно чтобы избежать DOS или блокировать перебор.

После перезапуска fail2ban (скорей всего командой /etc/init.d/fail2ban restart) можно смотреть статистику.

# fail2ban-client status drupal-auth
Status for the jail: drupal-auth
|- filter
|  |- File list:        /var/log/everything/current
|  |- Currently failed: 1
|  `- Total failed:     38
`- action
   |- Currently banned: 1
   |  `- IP list:       127.0.0.14
   `- Total banned:     1

Я это пробовал на локальной системе, отсюда такой адрес - 127.0.0.14. Фиксируется каждая неудачная попытка ввода пароля, и если их число превышает 6 (это число задаётся в конфиге fail2ban) - адрес атакующего временно блокируется.

В тему: метод выбора запоминающихся паролей.

Комментарии

Аватар пользователя Dan Dan 30 июня 2009 в 10:21

Отличная статья. Спасибо, Аксель!

PS: для создания файла можно в консоли вместо
# cat > /etc/fail2ban/filter.d/drupal-auth.conf
писать
# > /etc/fail2ban/filter.d/drupal-auth.conf
Так короче Smile

Аватар пользователя axel axel 30 июня 2009 в 12:06

Dan wrote:
для создания файла можно в консоли вместо
# cat > /etc/fail2ban/filter.d/drupal-auth.conf
писать
# > /etc/fail2ban/filter.d/drupal-auth.conf
Так короче :)

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

# cat > filename
тут по shift-ins херачим текст из клипбоарда
жмём ^D для выхода

Щаз допишу туда про ^D, будет понятней.

Аватар пользователя Azerot Azerot 30 июня 2009 в 12:53

Хм. А чем плохо поставить Captcha на login, если уж такая проблема как перебор паролей сильно беспокоит? Робот в таком случае перебирать пароли не сможет, а пользователю через десяток-другой вводов картинок с Captcha это надоест.

Аватар пользователя axel axel 30 июня 2009 в 16:16

Azerot wrote:
Хм. А чем плохо поставить Captcha на login, если уж такая проблема как перебор паролей сильно беспокоит? Робот в таком случае перебирать пароли не сможет, а пользователю через десяток-другой вводов картинок с Captcha это надоест.

Я исхожу из принципа, что если где-то можно обойтись без капчи, то лучше обойтись. Все эти лишние манипуляции с цифрами и картинками - только утомляют пользователя. В некоторых случаях придумать действенную альтернативу сложно, но в данном случае - проверка числа попыток более прозрачный метод, т.к. пользователь корректно вводящий свои данные с ним никак не столкнётся.
К тому же отсекание роботов извне друпала - это снижение нагрузки, т.к. не задействуется каждый раз вебсервер+php+друпал для проверки, робот убедившись что порт ему стал недоступен быстро отваливается по таймауту.

А перебор паролей - проблема на любом публичном сервере. На серверах которые я админю fail2ban практически каждый день сообщает о попытках перебора разных сервисов - в основном ftp и ssh, сервер drupal.ru не исключение.

Аватар пользователя Azerot Azerot 30 июня 2009 в 16:40

Всё так, но есть одно большое НО. Это всё справедливо как минимум для VDS, как максимум для DS.
На виртуальном хостинге никто простому пользователю доступа к fail2ban не даст, а captcha - вот она.
Если большую проблему вызывает именно связка drupal+php и картинки, то не проще ли средствами drupal формировать в .htaccess правила для deny.

В общем ни в коем случае не хочу сказать о бесполезности данного решения, но просто его преимущества применимы увы не везде.

Аватар пользователя axel axel 30 июня 2009 в 16:51

Azerot wrote:
Всё так, но есть одно большое НО. Это всё справедливо как минимум для VDS, как максимум для DS.
На виртуальном хостинге никто простому пользователю доступа к fail2ban не даст, а captcha - вот она.

Да разумеется это решение для выделенного сервера или vds. О шаредхостинге речи не идёт, т.к. там защита от dos и перебора паролей - забота провайдера. Собственно если провайдер следит за системой, подобной проблемой можно вообще не озадачиваться, даже в виде капчи.

Аватар пользователя Azerot Azerot 30 июня 2009 в 18:43

От dos - да, от перебора паролей - нет, ибо это уже территория сайта, а не хостинга.
Не будет хостер следить за тем, как работает софт, который поставил клиент на хостинг, если данный софт не создаёт проблем другим. Но это так, о птичках Smile

Аватар пользователя v1adimir v1adimir 30 июня 2009 в 18:54

Бан по ip при изобилии локальных сетей не гуд как тор.
Может правильнее организовывать принудительный таймаут увеличивающийся после каждой неудачной попытке входе. Хотя на вскидку не соображу как такое можно организовать.

Аватар пользователя Dan Dan 2 июля 2009 в 1:23

Имхо, для данного метода надо в обязательном порядке после каждой неудачной попытки писать юзеру сколько у него попыток осталось и что произойдёт после того, как он их исчерпает.

Аватар пользователя axel axel 2 июля 2009 в 4:32

Dan wrote:
Имхо, для данного метода надо в обязательном порядке после каждой неудачной попытки писать юзеру сколько у него попыток осталось и что произойдёт после того, как он их исчерпает.
Но тогда это точно реализоваывать на уровне скрипта сайта - в друпале в данном случае. А можно просто попыток побольше поставить - ну скажем 20-30. Для перебора этого всё одно не достаточно, а нормальный юзер больше 5-6 раз поймёт, что пароль он забыл и пойдёт его восстанавливать.

Аватар пользователя alexandr.poddubsky alexandr.poddubsky 8 июля 2009 в 10:02

"Azerot" wrote:
десяток-другой вводов картинок с Captcha это надоест.

капча обходится ocr, либо сидит куча китайцев и набирает все капчи для твоего брудфорса

Аватар пользователя Azerot Azerot 8 июля 2009 в 11:41

Ну-ну, обойдите нормально настроенную captcha ocr - я на вас помотрю Smile
Для качественной работы OCR систем необходимо гораздо лучшее разрешение картинки, чем даёт Captcha.
Если бы OCR было так легко обойти Captcha, мы были бы завалены спамом, чего не наблюдается.
А куча китайцев лего банится тем же nginx'ом или mod_evasive. Ставится не более n-го количества одновременных коннектов к одному URL сайта и всё.

Аватар пользователя Azerot Azerot 8 июля 2009 в 14:23

Аха, ещё один начал говорить, что captcha обходится, хотя никаких реальных примеров обхода не привёл. Трендеть все горазды, попробуйте обойти, тогда поговорим.

Аватар пользователя alexandr.poddubsky alexandr.poddubsky 27 июля 2009 в 0:06

"Azerot" wrote:
рендеть все горазды, попробуйте обойти, тогда поговорим.

для нюню это так сходу, а на самом деле все намного серьезнее. Есть сайт который описывает все проблемные капчи- точнее методы (алгоритмы) их обхода и стойкость (обзор идет популярных сайтов и систем, яндекс и гугля тоже описываются). Так что то, что рассказал Александр - мне лично на заметку (я не знал про это).

Аватар пользователя Azerot Azerot 27 июля 2009 в 8:40

Ключевое слово "проблемные". Когда у меня image captcha стала пропускать мусор, я просто её донастроил, повысил сложность, добавил мусора и всё. А если ставить смысловую captcha, то я бы очень хотел бы посмотреть на метод обхода вопросов такого типа как:
"Укажите какой из этих предметов не является круглым?"
1. Шар
2. Круг
3. Книга
4. Колесо