Введение
Любая служба, видимая в сети, является потенциальной целью для злоумышленников. Будь то сервер доступный по ssh или сервер телефонии asterisk, или любое другое приложение имеющее выход в публичный интернет. Если вы внимательно читаете журналы приложений этих служб, вы можете увидеть повторяющиеся систематические попытки входа в систему, которые представляют собой попытки bruteforce-атак пользователей или ботов.
Служба Fail2ban может помочь в решении этой проблемы, создавая правила, автоматически изменяющие конфигурацию брандмауэра iptables. Это позволит серверу реагировать на попытки несанкционированного доступа без вашего вмешательства. В терминах Fail2ban такая комбинация фильтрации и действий называется “тюрьмой” (jail). Названо так, потому, что ip адрес блокируется на определенное время, как бы сажается в тюрьму.
В данном руководстве мы рассмотрим установку и использование Fail2ban на примере сервера с CentOS 7. В примере настроим блокировку попыток взлома сервера по ssh
Как работает Fail2ban
Работает утилита следующим образом, при настройке вы указываете путь к файлу логов. Fail2ban отслеживает изменения в лог-файлах служб и при обнаружении в логах определенного количества неудачных попыток входа в систему блокирует ip адрес злоумышленника. Например при неправильном вводе пароля для ssh на сервере Centos 7, в фале логов /var/log/secure регистрируется попытка неудачного входа и появляется строка
Jan 31 22:38:18 localhost sshd[5649]: Failed password for root from 34.56.21.11 port 49302 ssh2
Утилита сравнивает эту строку с регулярным выражением в своих фильтрах. Например эта строка попадает под регулярное выражение в файле /etc/fail2ban/filter.d/sshd.conf
"Failed \S+ for .*? from <HOST>..."
И поэтому эта попытка будет считаться взломом, и если число попыток превышает указанное количество, то ip адрес блокируется через iptables.
Установка Fail2ban в CentOS
Пакета Fail2ban нет в официальном репозитории CentOS, но он есть в репозитории проекта EPEL, что означает Extra Packages for Enterprise Linux (дополнительные пакеты для корпоративных систем Linux). Этот репозиторий можно установить при помощи специального пакета релиза, доступного в CentOS:
yum install epel-release
Теперь у нас должно получиться установить пакет Fail2ban:
yum install fail2ban
После завершения установки включите службу Fail2ban командой systemctl:
systemctl enable fail2ban
Конфигурация локальных параметров
Файлы конфигурации службы Fail2ban хранятся в директории /etc/fail2ban. В ней есть файл с параметрами по умолчанию под названием jail.conf. Этот файл может быть перезаписан при обновлении пакета, поэтому мы не будем его редактировать, а создадим новый под названием jail.local.
Если в jail.local и jail.conf определены одни и те же параметры, будут использоваться значения из файла .local
Параметры конфигурации также могут быть прописаны в файлах, расположенных в директории /etc/fail2ban/jail.d/. Приоритет файлов конфигурации будет следующим (в порядке повышения):
1./etc/fail2ban/jail.conf
2./etc/fail2ban/jail.d/*.conf, в алфавитном порядке
3./etc/fail2ban/jail.local
4./etc/fail2ban/jail.d/*.local, в алфавитном порядке
Файлы конфигурации могут содержать раздел [DEFAULT] с общими настройками и отдельные разделы для “тюрем”. Значения параметров, установленные в отдельных разделах, имеют приоритет. Для начала можно создать простейшую версию jail.local. Откройте новый файл любым текстовым редактором:
vi /etc/fail2ban/jail.local
Вставьте следующий текст:
[DEFAULT] ignoreip = 127.0.0.1/8 192.168.0.0/24 [ssh-iptables] enabled = true port = ssh filter = sshd action = iptables[name=sshd, port=ssh, protocol=tcp] logpath = /var/log/secure
ignoreip — указывает адреса источников, которые Fail2ban будет игнорировать (так называемый белый список). В данном примере она настроена не запрещать трафик с локальной машины и из сети 192.168.0.0/24. Можно указать дополнительные адреса через пробел.
enabled — принимает значение true/false включение отключение тюрьмы
port — В данном случае ssh — предустановленное значение стандартного порта SSH (22). Если у вас ssh работает не на 22-м порту, то в этом параметре пропишите номер своего порта.
filter — фактически представляет собой ссылку на файл в директории /etc/fail2ban/filter.d без указания расширения .conf. Он содержит регулярные выражения, определяющие условия выявления неудачной аутентификации по строке лога. То есть, в данном примере неудачные попытки входа в систему будут определяться по логу sshd с использованием условий, прописанных в /etc/fail2ban/filter.d/sshd.conf. Обычно достаточно значений, заданных по умолчанию. При необходимости вы можете посмотреть файлы в этой директории и открыть при помощи текстового редактора те, которые связаны с используемыми вами службами. В большинстве таких файлов достаточно развернутые комментарии, и вы легко разберетесь, какие условия скрипт считает признаком неправомерного доступа.
logpath — путь к лог файлу, предполагает использование лога sshd
action — выполняемое действие из каталога /etc/fail2ban/action.d.
В нашем примере это настроить iptables заблокировав порт ssh по протоколу tcp. Если нужно заблокировать все порты от адреса взломщика, то можно использовать действие iptables-allports.
Настройка общих параметров
В созданной нами версии файла jail.local мы определили основные параметры для конкретной тюрьмы. Давайте теперь настроем общие параметры для всех. Откроем jail.conf и рассмотрим некоторые из них. Если вам потребуется изменить какие-либо значения, для определенной «тюрмы» их нужно скопировать в соответствующий раздел jail.local.
bantime = 600
Параметр bantime указывает временной интервал, в течение которого взломщику будет запрещено подключение, если он не сможет корректно выполнить аутентификацию. Время указывается в секундах, по умолчанию 600, то есть 10 минут.
findtime = 600 maxretry = 3
Два следующих параметра, на которые стоит обратить внимание — findtime и maxretry. Они используются совместно для определения условий отказа клиенту в доступе.
Переменная maxretry устанавливает разрешенное клиенту количество попыток аутентификации во временном окне findtime, прежде чем ему будет отказано в доступе. По умолчанию это выполняется для клиента, который сделал 3 неудачных попытки входа в систему за 10 минут.
destemail = admin@example.com sendername = Fail2Ban mta = sendmail
Настройки уведомлений по электронной почте. Параметр destemail указывает адрес электронной почты, на который будут отправляться сообщения об отказе в доступе. Опция sendername указывает, что будет написано в поле отправителя. Параметр mta определяет действие(action), которое нужно выполнить, sendmail-отправить письмо. Все доступные скрипты действий находятся в каталоге /etc/fail2ban/action.d
. Если этих действий недостаточно, вы можете написать свои.
action = $(action_)s
В данном параметре настраивается действие Fail2ban при осуществлении отказа в доступе. Значение action_ определяется в файле перед этим параметром. По умолчанию это настройка брандмауэра для отклонения трафика от узла нарушителя до истечения времени отказа в доступе.
Если нужно настроить уведомления по электронной почте, можно заменить action_ на action_mw. Чтобы в сообщении содержались соответствующие записи журнала, укажите action_mwl. Эти значения также заданы по умолчанию, но для использования уведомлений необходимо правильно настроить электронную почту.
После завершения редактирования файла конфигурации его нужно сохранить и перезапустить Fail2ban:
systemctl restart fail2ban
Для проверки работы службы можно воспользоваться программой fail2ban-client:
fail2ban-client status
Вы также можете получить более подробную информацию о конкретной “тюрьме”. Например информация о нашем примере будет следующий.
fail2ban-client status ssh-iptables
Просмотр логов Fail2ban и конфигурации брандмауэра
Для таких служб, как Fail2ban, особенно важно обеспечить правильную работу. Сначала воспользуйтесь systemctl для проверки состояния службы:
systemctl status fail2ban
Если что-то кажется ненормальным, можно попробовать устранить неполадки и проверить логи Fail2ban с момента последней загрузки:
journalctl -b -u fail2ban
Затем воспользуйтесь fail2ban-client для запроса общего состояния fail2ban-server или состояния отдельных “тюрем”.
fail2ban-client status fail2ban-client status имя_тюрьмы
Просмотр записей о недавних действиях в логе Fail2ban (для выхода нажмите Ctrl-C):
tail -F /var/log/fail2ban.log
Вывод правил, настроенных в iptables:
iptables -L
Показать правила iptables в формате, отражающем необходимые для задействования каждого правила команды:
iptables -S
Заключение
Мы рассмотрели базовую настройку политики отказа в доступе для различных служб на примере SSH. Fail2ban очень легко настроить, это эффективный способ защиты любой службы, использующей аутентификацию.