Защита SSH при помощи Fail2Ban в CentOS 7
Centos, SSH | Комментировать запись
Подключения к серверу через 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 может переопределить любое из этих значений. Файлы применяются в алфавитном порядке:
- /etc/fail2ban/jail.conf
- /etc/fail2ban/jail.d/*.conf,
- /etc/fail2ban/jail.local
- /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 можно найти в специальном разделе нашего Информатория.
Tags: CentOS 7, fail2ban, SSH