Fail2Ban позволяет обезопасить сервер от взлома путём подбора пароля. Уже писал про принцип действия в статье «Защита от подбора пароля к SSH«, но решил описать процесс настройки более подробно. Всё будем делать для популярной системы Centos6. Для других систем команды установки могут отличаться.
Устанавливаем Fail2Ban
yum install fail2ban-server
Настраиваем
Заходим в папку /etc/fail2ban/ и находим там файл jail.conf. Это файл настроек программы. Он содержит настройки «по умолчанию» и перезаписывается при каждом обновлении fail2ban, поэтому не стоит в нём ничего менять. Необходимо скопировать этот файл в jail.local, в ту же папку:
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
В jail.local будут хранится наши настройки. Файл можно изменять и он не будет затираться при обновлении. Если в jail.local укажем не все настройки, то недостающие будут браться из jail.conf.
Fail2Ban работает через файлы логов. К примеру, если хотим обезопасить вход по ssh, то fail2ban откроет логи входа на сервер и выяснит всё о неудачных попытках входа через ssh. А именно: периодичность неудачных входов и количество попыток. Эти данные будут использоваться для блокировки нарушителей.
Ставим защиту на ssh
Открываем jail.local и видим довольно подробные инструкции. Сначала выставим пороговые значения неудачных попыток и время, на которое нарушитель будет попадать в блокировку. Для этого находим строку (примерно 50-ая в файле):
# «bantime» is the number of seconds that a host is banned.
bantime = 3600
После нескольких неудачных попыток входа ip адрес входящего будет попадать в бан лист на час. И все подключения от этого ip будут сбрасываться. Я редко ошибаюсь при вводе пароля, поэтому установил это bantime = 360000 (блокировка на 4 дня)
Чуть ниже идут два параметра:
# A host is banned if it has generated «maxretry» during the last «findtime» seconds.
findtime = 3600
# «maxretry» is the number of failures before a host get banned.
maxretry = 3
Нарушителем будет считаться тот, кто попытается сделать maxretry неудачных попыток входа в течении findtime. Т.е. если в течении 3600 секунд сделаешь 3 неудачные попытки входа, то неминуемо отправляешься в бан. Мои настройки установлены на maxretry = 2 и findtime = 36000 (2 неудачные попытки за 10 часов).
С определением наказания для нарушителей и критерием их отлова закончили. Теперь необходимо применить это наказание. Но тут нас ждёт обилие выбора (файл jail.local ниже 200-ой строки). Мы можем установить защиту на ssh, ftp, roundcube, groupoffice, drupal, sendmail, mysqld и даже counter-strike. Механизм везде одинаковый, поэтому рассмотрим на примере ssh. Находим строку [sshd] и вставляем после неё enabled = true, чтобы получилось:
[sshd]
enabled = true
Сохраняем файл jail.local. И перезапускаем fail2ban:
sudo service fail2ban restart
Скорость запуска программы зависит от размера лог файла. Ведь при каждом запуске происходит сканирование на предмет нарушений. Если вы несколько дней назад делали неудачные попытки входа и они есть в логах, то тоже попадёте в бан. Поэтому рекомендую проверить логи, чтобы не заблокировать себя любимого.
Если fail2ban настроен верно, то можно дать команду серверу fail2ban-client status. Появится список активированных «тюрем» (jail):
Чтобы посмотреть содержание тюрьмы «sshd» можно ввести:
fail2ban-client status sshd
Теперь проверим действительно ли работает Fail2Ban и запросим список заблокированных адресов через команду iptables -L
Конечно, необходимо чтобы в файле логов (по умолчанию /var/log/secure) были не успешные попытки входа. Иначе список заблокированных в iptables будет пуст.
Напоследок не забудем прописать Fail2Ban в автозагрузку командой:
chkconfig fail2ban on
Разблокировать IP
Чтобы удалить ip из бан листа ssh, необходимо ввести следующую команду в консоли:
fail2ban-client set sshd unbanip 123.123.123.123
Вместо sshd поставьте название jail, в которую попал ip адрес.
Итог
Fail2Ban обезопасит сервер от взлома путём подбора пароля. Программа довольно эффективна и не требует постоянного присмотра. Категорически рекомендую.