Site icon 8HOST.COM

Защита SSH при помощи Fail2Ban в CentOS 7

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

Конечно, любой доступный в интернете сервис является потенциальной мишенью. Чтобы убедиться в этом, внимательно просмотрите логи этих сервисов; в них можно найти систематически повторяющиеся попытки входа – это атаки brute force (атаки методом подбора пароля).

Сервис Fail2ban может смягчить эту угрозу при помощи правил, автоматически меняющих настройки брандмауэра iptables; эти правила срабатывают в случае поступления определённого количества неудачных попыток входа. Этот инструмент позволяет защитить сервер от несанкционированного доступа без вмешательства системного администратора.

Данное руководство поможет установить и настроить Fail2ban на сервере CentOS 7.

Установка Fail2ban

Инструмент Fail2ban не доступен в официальном репозитории CentOS, но его можно получить в EPEL. Пакет самого репозитория EPEL (Extra Packages for Enterprise Linux) можно добавить из официального репозитория CentOS.

sudo yum install epel-release

Чтобы продолжить, нажмите y и Enter. На экране появится следующий вывод:

Transaction Summary
============================================================================
Install  1 Package
Total download size: 14 k
Installed size: 24 k
Is this ok [y/d/N]: y

Теперь можно установить пакет fail2ban:

sudo yum install fail2ban

Чтобы продолжить, нажмите y и Enter.

После завершения установки используйте инструмент systemctl, чтобы включить fail2ban:

sudo systemctl enable fail2ban

Локальные настройки

Сервис Fail2ban хранит настройки в каталоге /etc/fail2ban. В нём можно найти файл jail.conf, содержащий стандартные настройки.

Этот файл перезаписывается при обновлении пакета Fail2ban, потому его редактировать нельзя. Вместо этого нужно создать новый файл по имени jail.local. Значения в файле jail.local будут переопределять jail.conf.

Файл jail.conf содержит раздел [DEFAULT], после которого следует раздел для индивидуальных сервисов. Файл jail.local может переопределить любое из этих значений. Файлы применяются в алфавитном порядке:

  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. откройте файл в текстовом редакторе:

sudo nano /etc/fail2ban/jail.local

Вставьте в файл следующий код:

[DEFAULT] # Ban hosts for one hour:
bantime = 3600
# Override /etc/fail2ban/jail.d/00-firewalld.conf:
banaction = iptables-multiport
[sshd] enabled = true

Этот файл переопределяет три параметра: устанавливает новое значение для bantime, настраивает поддержку iptables и включает sshd.

Сохраните и закройте файл. Перезапустите fail2ban при помощи systemctl:

sudo systemctl restart fail2ban

Команда systemctl не вернёт никакого вывода; чтобы убедиться, что сервис работает, используйте fail2ban-client:

sudo fail2ban-client status
Status
|- Number of jail:      1
`- Jail list:   sshd

Чтобы получить более подробный вывод, введите:

sudo fail2ban-client status sshd

Доступные параметры

Только что была создана базовая версия jail.local, которую можно расширить при помощи других параметров настройки. Откройте jail.conf и изучите его параметры. Чтобы изменить значение любого из стандартных параметров, скопируйте его в jail.local и установите новое значение.

sudo nano /etc/fail2ban/jail.conf

Стандартные настройки

Просмотрите раздел [DEFAULT] .

ignoreip = 127.0.0.1/8

Параметр ignoreip задаёт белый список адресов. На данный момент он не блокирует исходящий трафик локальной машины. Можно добавить дополнительные ip-адреса через пробел.

bantime = 600

Параметр bantime устанавливает интервал времени, в течение которого клиент будет заблокирован, если он не смог пройти аутентификацию. Значение параметра измеряется в секундах; по умолчанию установлено 600 секунд, или 10 минут.

findtime = 600
maxretry = 3

Эти параметры задают условия, при которых клиент должен быть заблокирован. Параметр findtime задаёт длительность интервала, в течение которого событие должно повториться определённое количество раз, после чего клиент будет заблокирован; maxretry устанавливает количество неудавшихся попыток входа. Согласно текущим настройкам, Fail2ban заблокирует клиента после трех неудачных попыток логина, случившихся в течение 10 минут.

destemail = root@localhost
sendername = Fail2Ban
mta = sendmail

Чтобы настроить уведомления по электронной почте, нужно переопределить параметры destemail, sendername и mta. Параметр destemail устанавливает адрес электронной почты, на который нужно отправить сообщения. sendername  устанавливает имя отправителя сообщения. Параметр mta задаёт почтовый сервис.

action = $(action_)s

Этот параметр задаёт действие, которое выполнит Fail2ban в случае блокировки пользователя. Стандартное значение параметра просто отклонит трафик, поступающий от вредоносного хоста, на интервал времени, установленный в параметре bantime.

Если вы хотите настроить уведомления по электронной почте, нужно переопределить action_  значением action_mw. Чтобы извещение содержало соответствующие строки лог-файла, установите значение action_mwl.

Примечание: Не забудьте настроить почту.

Индивидуальные параметры

После раздела [DEFAULT] можно внести индивидуальные настройки сервисов. Как правило, в них входят параметры port (который нужно закрыть) и logpath (для отслеживания  вредоносных попыток доступа). Например, настройки SSH, уже включенные в jail.local, имеет следующие параметры:

[sshd] port    = ssh
logpath = %(sshd_log)s

В данном случае ssh – это предопределенная переменная для стандартного порта SSH, а %(sshd_log)s использует значение, определённое в стандартных настройках Fail2ban (таким образом jail.conf остаётся переносимым между различными операционными системами).

Следующий параметр – filter – указывает, является ли строка в логе неудачной попыткой аутентификации.

Значение filter – это ссылка на файл, который находится в каталоге /etc/fail2ban/filter.d. Регулярные выражения данного файла позволяют определить, является ли строка в логе вредоносной.

Примечание: К сожалению, данное руководство не охватывает глубокого анализа этого файла, поскольку он достаточно сложный и требует отдельной статьи.

Доступные фильтры можно просмотреть в каталоге:

ls /etc/fail2ban/filter.d

Найдите файл, который выглядит, связанный с необходимым сервисом, и откройте его с помощью текстового редактора.

Большинство файлов достаточно хорошо прокомментированы, потому вы сможете самостоятельно определить, от какого поведения защищает данный скрипт. Большинство из этих фильтров имеют соответствующие разделы в jail.conf (по умолчанию они отключены), которые можно перенести в jail.local.

Для примера предположим, что вы обслуживаете сайт при помощи Nginx; в какой-то момент вы обнаруживаете, что на защищенные паролем страницы сайта постоянно поступают неудачные запросы на аутентификацию. В таком случае Fail2ban может использовать файл nginx-http-auth.conf, чтобы проверить состояние /var/log/nginx/error.log.

На самом деле, такое поведение уже настроено в разделе [nginx-http-auth] в файле our/etc/fail2ban/jail.conf. Чтобы включить эти настройки, просто добавьте параметр enabled для раздела nginx-http-auth в файле jail.local.

[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:

sudo systemctl restart fail2ban

Мониторинг логов Fail2ban и настроек брандмауэра

Работу сервиса Fail2ban очень важно отслеживать. Чтобы проверить состояние сервиса, используйте systemctl.

sudo systemctl status fail2ban

Если на данном этапе что-то не работает, можно устранить неполадку путем проверки записей логов fail2ban (до последней перезагрузки):

sudo journalctl -b -u fail2ban

После этого используйте fail2ban-client, чтобы запросить общее состояние сервера fail2ban-server или любого индивидуального сервиса:

sudo fail2ban-client status
sudo fail2ban-client status jail_name

Последние действия Fail2ban можно просмотреть в следующем логе:

sudo tail -F /var/log/fail2ban.log

Чтобы просмотреть текущие правила iptables:

sudo iptables -L

Чтобы вывести правила Iptables вместе с командами, необходимыми для запуска правила:

sudo iptables -S

Заключение

Теперь у вас есть базовые навыки работы с Fail2ban. Инструмент Fail2ban очень прост в настройке и позволяет защитить любой сервис аутентификации.

Больше руководств по работе с Fail2ban можно найти в специальном разделе нашего Информатория.