Хотя подключение к вашему серверу через SSH может быть очень безопасным, сам демон SSH является службой, которая должна быть открыта для Интернета, чтобы функционировать должным образом. Это сопряжено с определенным риском и открывает вектор атаки для потенциальных злоумышленников.
Любая служба, открытая для доступа в сеть, является потенциальной целью. Если вы обратите внимание на журналы приложений этих служб, вы часто увидите повторяющиеся, систематические попытки входа в систему, которые представляют собой атаки "грубой силы" как со стороны пользователей, так и со стороны ботов.
Служба под названием Fail2ban может смягчить эту проблему путем создания правил, которые автоматически изменяют конфигурацию брандмауэра iptables на основе заранее определенного количества неудачных попыток входа. Это позволит вашему серверу реагировать на незаконные попытки доступа без вашего вмешательства.
В этом руководстве мы рассмотрим, как установить и использовать Fail2ban на сервере CentOS.
Установка Fail2ban в CentOS
Хотя Fail2ban не доступен в официальном репозитории пакетов CentOS, он упакован для проекта EPEL. EPEL, расшифровывается как Extra Packages for Enterprise Linux, может быть установлен с помощью релиз-пакета, который доступен в CentOS:
1 | sudo yum install epel-release |
Вам будет предложено продолжить - нажмите y, затем Enter:
Теперь мы должны иметь возможность установить пакет fail2ban:
1 | sudo yum install fail2ban |
Снова нажмите y и Enter, когда появится запрос на продолжение.
После завершения установки используйте systemctl, чтобы включить службу fail2ban:
1 | sudo systemctl enable fail2ban --now |
Настройка локальных параметров
Служба Fail2ban хранит свои конфигурационные файлы в каталоге /etc/fail2ban. Там вы можете найти файл со значениями по умолчанию под названием jail.conf. Поскольку этот файл может быть перезаписан при обновлении пакета, мы не должны редактировать его на месте. Вместо этого мы напишем новый файл jail.local. Любые значения, определенные в jail.local, отменяют значения в jail.conf.
jail.conf содержит раздел [DEFAULT], за которым следуют разделы для отдельных служб. jail.local может переопределять любые из этих значений. Кроме того, файлы в /etc/fail2ban/jail.d/ могут быть использованы для переопределения настроек в обоих этих файлах. Файлы применяются в следующем порядке:
- /etc/fail2ban/jail.conf
- /etc/fail2ban/jail.d/*.conf, по алфавиту
- /etc/fail2ban/jail.local
- /etc/fail2ban/jail.d/*.local, по алфавиту
Любой файл может содержать раздел [DEFAULT], выполняемый первым, а также может содержать разделы для отдельных тюрем. Последнее значение vavalue, установленное для данного параметра, имеет приоритет.
Давайте начнем с написания очень простой версии jail.local. Откройте новый файл с помощью nano (или выбранного вами редактора):
1 | sudo nano /etc/fail2ban/jail.local |
Вставьте следующее:
1 2 3 4 5 6 7 | [DEFAULT] # Ban hosts for one hour: bantime = 3600 banaction = iptables-multiport [sshd] enabled = true |
Это отменяет три настройки: Он устанавливает новое время запрета по умолчанию для всех служб, убеждается, что мы используем iptables для конфигурации брандмауэра, и включает sshd jail.
Выйдите и сохраните новый файл (в nano нажмите Ctrl-X для выхода, y для сохранения и Enter для подтверждения имени файла). Теперь мы можем перезапустить службу fail2ban с помощью systemctl:
1 | sudo systemctl restart fail2ban |
Команда systemctl должна завершиться без каких-либо результатов. Чтобы проверить, запущена ли служба, мы можем использовать fail2ban-client:
1 | sudo fail2ban-client status |
Вы также можете получить более подробную информацию о конкретной ловушке:
1 | sudo fail2ban-client status sshd |
Изучите доступные настройки
Версия jail.local, которую мы определили выше, является хорошим началом, но вы можете захотеть изменить ряд других настроек. Откройте файл jail.conf, и мы рассмотрим некоторые значения по умолчанию. Если вы решите изменить какие-либо из этих значений, помните, что они должны быть скопированы в соответствующий раздел jail.local и скорректированы там, а не изменены на месте.
1 | sudo nano /etc/fail2ban/jail.conf |
Настройки по умолчанию для всех ловушек
Сначала пролистайте раздел [DEFAULT].
1 | ignoreip = 127.0.0.1/8 |
Вы можете настроить адреса источников, которые игнорирует Fail2ban, добавив значение к параметру ignoreip. В настоящее время настроено не запрещать любой трафик, исходящий с локальной машины. Вы можете включить дополнительные адреса для игнорирования, добавив их в конец параметра через пробел.
1 | bantime = 600 |
Параметр bantime задает время, в течение которого клиент будет заблокирован, если он не смог правильно пройти аутентификацию. Это время измеряется в секундах. По умолчанию установлено значение 600 секунд, или 10 минут.
1 2 | findtime = 600 maxretry = 3 |
Следующие два параметра, на которые следует обратить внимание, это findtime и maxretry. Они работают вместе, чтобы установить условия, при которых клиент должен быть запрещен.
Переменная maxretry устанавливает количество попыток аутентификации клиента в течение времени, определенного параметром findtime, до того, как он будет забанен. При настройках по умолчанию Fail2ban запретит клиента, который безуспешно пытается войти в систему 3 раза в течение 10 минут.
1 2 3 | destemail = root@localhost sendername = Fail2Ban mta = sendmail |
Если вы хотите настроить оповещения по электронной почте, вам может понадобиться переопределить параметры destemail, sendername и mta. Параметр destemail задает адрес электронной почты, на который должны приходить сообщения о запрете. Имя отправителя задает значение поля "От" в сообщении электронной почты. Параметр mta задает, какой почтовый сервис будет использоваться для отправки почты.
1 | action = $(action_)s |
Этот параметр задает действие, которое Fail2ban предпринимает, когда хочет ввести запрет. Значение action_ определяется в файле непосредственно перед этим параметром. Действие по умолчанию заключается в том, чтобы просто настроить брандмауэр на отклонение трафика от хоста-нарушителя до тех пор, пока не истечет время запрета.
Если вы хотите настроить оповещения по электронной почте, вы можете переопределить это значение с action_ на action_mw. Если вы хотите, чтобы электронное письмо включало соответствующие строки журнала, вы можете изменить значение на action_mwl. Вы должны убедиться, что у вас настроены соответствующие параметры почты, если вы решите использовать почтовые оповещения.
Настройки для отдельных ловушек
После [DEFAULT] мы встретим разделы, в которых настраиваются отдельные тюрьмы для различных служб. Они обычно включают запрещенный порт и путь журнала для отслеживания попыток злонамеренного доступа. Например, SSH-тюрьма, которую мы уже включили в jail.local, имеет следующие настройки:
1 | nano /etc/fail2ban/jail.local |
1 2 3 | [sshd] port = ssh logpath = %(sshd_log)s |
В этом случае ssh - это предопределенная переменная для стандартного порта SSH, а %(sshd_log)s использует значение, определенное в другом месте стандартной конфигурации Fail2ban (это помогает сохранить переносимость jail.conf между различными операционными системами).
Еще одна настройка, с которой вы можете столкнуться, - это фильтр, который будет использоваться для решения вопроса о том, указывает ли строка в журнале на неудачную аутентификацию.
Значение фильтра на самом деле является ссылкой на файл, расположенный в каталоге /etc/fail2ban/filter.d, с удаленным расширением .conf. Этот файл содержит регулярные выражения, которые определяют, является ли строка в журнале неудачной. Мы не будем подробно рассматривать этот файл в данном руководстве, поскольку он довольно сложный, и предопределенные настройки хорошо подходят для соответствующих строк.
Однако вы можете увидеть, какие фильтры доступны, заглянув в этот каталог:
1 | ls /etc/fail2ban/filter.d |
Если вы увидите файл, который, похоже, связан с используемой вами службой, откройте его с помощью текстового редактора. Большинство файлов достаточно хорошо прокомментированы, и вы сможете определить, от какого типа условий был разработан скрипт. Большинство этих фильтров имеют соответствующие (отключенные) секции в jail.conf, которые мы можем включить в jail.local, если захотим.
Например, представьте, что мы обслуживаем веб-сайт с помощью Nginx и понимаем, что защищенная паролем часть нашего сайта заваливается попытками входа. Мы можем сказать Fail2ban использовать файл nginx-http-auth.conf для проверки этого условия в файле /var/log/nginx/error.log.
На самом деле это уже настроено в секции под названием [nginx-http-auth] в нашем файле /etc/fail2ban/jail.conf. Нам просто нужно добавить параметр enabled для nginx-http-auth jail в jail.local:
1 | nano /etc/fail2ban/jail.local |
1 2 3 4 5 6 7 8 9 10 11 12 | [DEFAULT] # Ban hosts for one hour: bantime = 3600 # Override /etc/fail2ban/jail.d/00-firewalld.conf: banaction = iptables-multiport [sshd] enabled = true [nginx-http-auth] enabled = true |
И перезапустите службу fail2ban:
1 | sudo systemctl restart fail2ban |
Мониторинг журналов Fail2ban и конфигурации брандмауэра
Важно знать, что такая служба, как Fail2ban, работает по назначению. Начните с использования systemctl для проверки состояния службы:
1 | sudo systemctl status fail2ban |
Если что-то кажется неправильным, вы можете устранить неполадки, проверив журналы для блока fail2ban с момента последней загрузки:
1 | sudo journalctl -b -u fail2ban |
Затем используйте fail2ban-client для запроса общего состояния fail2ban-сервера или любого отдельного джейла:
1 2 | sudo fail2ban-client status sudo fail2ban-client status jail_name |
Просмотрите журнал Fail2ban для записи последних действий (нажмите Ctrl-C для выхода):
1 | sudo tail -F /var/log/fail2ban.log |
Перечислите текущие правила, настроенные для iptables:
1 | sudo iptables -L |
Показать правила iptables в формате, отражающем команды, необходимые для включения каждого правила:
1 | sudo iptables -S |
Заключение
Теперь вы должны быть в состоянии настроить некоторые основные политики запрета для ваших служб. Fail2ban очень прост в настройке и является отличным способом защиты любых сервисов, использующих аутентификацию.