Друпал не предоставляет встроенной защиты от перебора паролей, а именно перебор один из традиционных способов получения несанкционированного доступа к сайту. Особенно с учётом того, какие простые пароли очень часто используют пользователи. Простейший способ избежать перебора - после нескольких неудачных попыток ввода пароля блокировать дальнейший ввод на некоторое время. Для удалённых систем логично блокировать 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 для вашей ОС может быть другим):
со следующим содержимым (копируйте один к одному):
#
# 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 дописываем:
enabled = true
filter = drupal-auth
action = iptables[name=Drupal, port="http", protocol=tcp]
logpath = /var/log/messages
bantime = 180
Дополнение: для Debian конфиг в jail.conf будет такой:
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) можно смотреть статистику.
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) - адрес атакующего временно блокируется.
В тему: метод выбора запоминающихся паролей.
Комментарии
Отличная статья. Спасибо, Аксель!
PS: для создания файла можно в консоли вместо
# cat > /etc/fail2ban/filter.d/drupal-auth.conf
писать
# > /etc/fail2ban/filter.d/drupal-auth.conf
Так короче
Прикольно, не знал такого синтаксиса, хоть с юниксом уже больше десяти лет ) Но то что ты показал, это аналог touch, а я в статье немного другое имел ввиду - хотел показать способ ввода текста сразу в файл. Т.е.:
# cat > filename
тут по shift-ins херачим текст из клипбоарда
жмём ^D для выхода
Щаз допишу туда про ^D, будет понятней.
Хм. А чем плохо поставить Captcha на login, если уж такая проблема как перебор паролей сильно беспокоит? Робот в таком случае перебирать пароли не сможет, а пользователю через десяток-другой вводов картинок с Captcha это надоест.
Я исхожу из принципа, что если где-то можно обойтись без капчи, то лучше обойтись. Все эти лишние манипуляции с цифрами и картинками - только утомляют пользователя. В некоторых случаях придумать действенную альтернативу сложно, но в данном случае - проверка числа попыток более прозрачный метод, т.к. пользователь корректно вводящий свои данные с ним никак не столкнётся.
К тому же отсекание роботов извне друпала - это снижение нагрузки, т.к. не задействуется каждый раз вебсервер+php+друпал для проверки, робот убедившись что порт ему стал недоступен быстро отваливается по таймауту.
А перебор паролей - проблема на любом публичном сервере. На серверах которые я админю fail2ban практически каждый день сообщает о попытках перебора разных сервисов - в основном ftp и ssh, сервер drupal.ru не исключение.
Всё так, но есть одно большое НО. Это всё справедливо как минимум для VDS, как максимум для DS.
На виртуальном хостинге никто простому пользователю доступа к fail2ban не даст, а captcha - вот она.
Если большую проблему вызывает именно связка drupal+php и картинки, то не проще ли средствами drupal формировать в .htaccess правила для deny.
В общем ни в коем случае не хочу сказать о бесполезности данного решения, но просто его преимущества применимы увы не везде.
Да разумеется это решение для выделенного сервера или vds. О шаредхостинге речи не идёт, т.к. там защита от dos и перебора паролей - забота провайдера. Собственно если провайдер следит за системой, подобной проблемой можно вообще не озадачиваться, даже в виде капчи.
От dos - да, от перебора паролей - нет, ибо это уже территория сайта, а не хостинга.
Не будет хостер следить за тем, как работает софт, который поставил клиент на хостинг, если данный софт не создаёт проблем другим. Но это так, о птичках
Бан по ip при изобилии локальных сетей не гуд как тор.
Может правильнее организовывать принудительный таймаут увеличивающийся после каждой неудачной попытке входе. Хотя на вскидку не соображу как такое можно организовать.
Есть еще вот такая штучка:
http://drupal.org/project/login_security
Имхо, для данного метода надо в обязательном порядке после каждой неудачной попытки писать юзеру сколько у него попыток осталось и что произойдёт после того, как он их исчерпает.
капча обходится ocr, либо сидит куча китайцев и набирает все капчи для твоего брудфорса
Ну-ну, обойдите нормально настроенную captcha ocr - я на вас помотрю
Для качественной работы OCR систем необходимо гораздо лучшее разрешение картинки, чем даёт Captcha.
Если бы OCR было так легко обойти Captcha, мы были бы завалены спамом, чего не наблюдается.
А куча китайцев лего банится тем же nginx'ом или mod_evasive. Ставится не более n-го количества одновременных коннектов к одному URL сайта и всё.
еще один все !понял. нунукать лучше потом- для начала узнайте более подробную инфу про обходы.
Аха, ещё один начал говорить, что captcha обходится, хотя никаких реальных примеров обхода не привёл. Трендеть все горазды, попробуйте обойти, тогда поговорим.
для нюню это так сходу, а на самом деле все намного серьезнее. Есть сайт который описывает все проблемные капчи- точнее методы (алгоритмы) их обхода и стойкость (обзор идет популярных сайтов и систем, яндекс и гугля тоже описываются). Так что то, что рассказал Александр - мне лично на заметку (я не знал про это).
Ключевое слово "проблемные". Когда у меня image captcha стала пропускать мусор, я просто её донастроил, повысил сложность, добавил мусора и всё. А если ставить смысловую captcha, то я бы очень хотел бы посмотреть на метод обхода вопросов такого типа как:
"Укажите какой из этих предметов не является круглым?"
1. Шар
2. Круг
3. Книга
4. Колесо