Как защитить SSH-сервер от перебора с помощью fail2ban
Одной из распространенных атак на службу SSH являются атаки грубой силы, когда удаленный злоумышленник бесконечно пытается войти в систему с разными паролями. Конечно, есть аргументы против аутентификации по паролю для SSH, и существуют альтернативные механизмы аутентификации, такие как аутентификация с открытым ключом или двухфакторная аутентификация, чтобы предотвратить такие атаки. Отбросив плюсы и минусы различных методов аутентификации, давайте рассмотрим ситуацию, когда требуется аутентификация по паролю. Как бы вы защитили свой SSH-сервер от атак грубой силы?
fail2ban
— это хорошо известная платформа предотвращения вторжений с открытым исходным кодом в Linux, которая отслеживает различные файлы системного журнала (например, /var/log/auth.log
или / var/log/secure
) и автоматически запускает различные защитные действия при обнаружении любых подозрительных действий. На самом деле, fail2ban
может быть весьма полезен для защиты от атак методом подбора пароля на SSH-сервере.
В этом руководстве я покажу, как установить и настроить fail2ban
для защиты SSH-сервера от атак грубой силы с удаленного IP-адреса.
Установите fail2ban
в Linux
Чтобы установить fail2ban
в CentOS или RHEL, сначала настройте репозиторий EPEL, а затем выполните следующую команду.
$ sudo yum install fail2ban
Чтобы установить fail2ban
в Fedora, просто запустите:
$ sudo yum install fail2ban
Чтобы установить fail2ban
в Ubuntu, Debian или Linux Mint:
$ sudo apt-get install fail2ban
Настройте fail2ban
для SSH-сервера.
Теперь вы готовы настроить fail2ban
для защиты вашего SSH-сервера. Вам нужно отредактировать файл конфигурации в /etc/fail2ban/jail.conf
. Файл конфигурации содержит раздел DEFAULT
, в котором вы определяете параметры по умолчанию для всех отслеживаемых служб, и разделы для конкретных служб, в которых вы определяете любые тюрьмы для конкретных служб (например, SSH, Apache и т. д.) для перезаписи параметров по умолчанию.
В разделах тюрьмы для конкретных служб (где-то после раздела [DEFAULT]
) вам необходимо определить раздел [ssh-iptables]
, где вы определяете конфигурации тюрьмы для SSH. Фактическая блокировка IP-адресов осуществляется с помощью iptables
.
Ниже приведен пример файла /etc/fail2ban/jail.conf
, который содержит конфигурацию тюрьмы ssh-iptables
. Конечно, в зависимости от ваших потребностей могут быть и другие тюрьмы для конкретных приложений.
$ sudo vi /etc/fail2ban/jail.local
[DEFAULT]
# a space delimited list of IP addresses, CIDR prefixes, or DNS hostnames
# to bypass fail2ban protection
ignoreip = 127.0.0.1 172.31.0.0/24 10.10.0.0/24 192.168.0.0/24
# number of seconds during which a client host is blocked
bantime = 86400
# number of failures before a client host is blocked
maxretry = 5
# number of seconds within which "maxentry" failures result in banning
findtime = 600
mta = sendmail
[ssh-iptables]
enabled = true
filter = sshd
action = iptables[name=SSH, port=ssh, protocol=tcp]
sendmail-whois[name=SSH, [email , [email ]
# for Debian-based distros
logpath = /var/log/auth.log
# for Red Hat-based distros
logpath = /var/log/secure
# ssh-specific max-retry threshold
maxretry = 3
В соответствии с приведенной выше конфигурацией fail2ban
автоматически блокирует любой удаленный IP-адрес, с которого за последние 10 минут было не менее 3 неудачных попыток входа. После блокировки IP-адрес нарушителя останется заблокированным на 24 часа. О таком событии будет отправлено уведомление sendemail
на адрес электронной почты получателя. При желании fail2ban
можно настроить с помощью logwatch
для создания пользовательского отчета.
Когда файл конфигурации будет готов, перезапустите службу fail2ban
следующим образом.
В Debian, Ubuntu или CentOS/RHEL 6:
$ sudo service fail2ban restart
В Fedora или CentOS/RHEL 7:
$ sudo systemctl restart fail2ban
Чтобы убедиться, что fail2ban
работает успешно, запустите команду fail2ban-client
с аргументом ping
. Если служба fail2ban
работает нормально, вы должны увидеть ответ pong
.
$ sudo fail2ban-client ping
Server replied: pong
Протестируйте защиту от атак грубой силы SSH с помощью fail2ban
Чтобы проверить, работает ли fail2ban
, попробуйте подключиться к серверу по SSH, используя неправильные пароли, чтобы имитировать атаку грубой силы. Тем временем следите за файлом /var/log/fail2ban.log, в котором регистрируются все интересные события, происходящие в fail2ban
.
$ sudo tail -f /var/log/fail2ban.log

Согласно приведенному выше файлу журнала, fail2ban
заблокировал IP-адрес 192.168.1.8 после обнаружения нескольких неудачных попыток входа в SSH с этого IP-адреса.
Проверьте статус fail2ban
и разблокируйте заблокированные IP-адреса
Поскольку тюрьма fail2ban
ssh-iptables
использует iptables
для блокировки нарушающих IP-адресов, вы можете легко проверить блокировку, проверив текущие iptables
действует следующим образом.
$ sudo iptables --list -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
fail2ban-SSH tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain fail2ban-SSH (1 references)
target prot opt source destination
DROP all -- 192.168.1.8 0.0.0.0/0
RETURN all -- 0.0.0.0/0 0.0.0.0/0
Если вы хотите разблокировать IP-адрес от fail2ban
, вы также можете использовать команду iptables
:
$ sudo iptables -D fail2ban-SSH -s 192.168.1.8 -j DROP
Хотя вы можете вручную проверять черный список IP-адресов fail2ban
и управлять им с помощью команды iptables
, как указано выше, на самом деле правильным способом является использование fail2ban-client
. инструмент командной строки. Этот инструмент позволяет вам управлять не только джейлами ssh-iptables
, но и любыми другими типами джейлов fail2ban
в едином интерфейсе командной строки.
Чтобы проверить статус fail2ban
(который покажет список активных в данный момент джейлов):
$ sudo fail2ban-client status
Чтобы проверить статус определенного джейла (например, ssh-iptables
):
$ sudo fail2ban-client status ssh-iptables
Приведенная выше команда покажет список запрещенных IP-адресов.

Чтобы разблокировать определенный IP-адрес:
$ sudo fail2ban-client set ssh-iptables unbanip 192.168.1.8

Обратите внимание: если вы остановите fail2ban
, все заблокированные IP-адреса будут разблокированы. Когда вы перезапустите fail2ban
, он найдет список IP-адресов с нарушениями из /var/log/secure
(или /var/log/auth.log
), и повторно заблокируйте эти IP-адреса, если истекшее время правонарушений все еще находится в пределах времени блокировки.
Установите для fail2ban
автоматический запуск при загрузке.
После того, как вы успешно протестировали fail2ban
, последним шагом будет включение автоматического запуска fail2ban
при включении сервера. В дистрибутивах на основе Debian автозапуск fail2ban
включен по умолчанию. В дистрибутивах на основе Red Hat включите автозапуск следующим образом.
В CentOS/RHEL 6:
$ sudo chkconfig fail2ban on
В Fedora или CentOS/RHEL 7:
$ sudo systemctl enable fail2ban
Краткое содержание
В этом руководстве я продемонстрировал, как установить и настроить fail2ban
для защиты SSH-сервера. Хотя fail2ban
может смягчить атаки с подбором пароля, обратите внимание, что он не может защитить SSH-серверы от изощренных распределенных кампаний с подбором пароля, когда злоумышленник обходит fail2ban
, используя многие тысячи IP-адресов, контролируемых ботами.