ИБ (Информационная Безопасность)
August 26

Защищаем ssh с помощью Fail2Ban

Большинство хакерских атак не являются целенаправленными. Существуют специальные хакерские боты, которые автоматически ищут в интернете уязвимые сервера и пытаются получить к ним доступ. Именно поэтому, даже если вы используете сервер исключительно для себя (например, в качестве собственного VPN), то его все равно необходимо защищать должным образом.

В этой статье не будет идти речь про конфигурацию ssh. Я думаю, что если вы читаете данную статью, то уже настроили службу на сервере должным образом: ограничили количество одновременных подключений, сменили стандартный 22 порт, запретили вход от имени root и в конце концов, настроили аутентификацию по ключу. Далее вы можете установить и настроить Fail2Ban для повышения уровня защиты.

Fail2Ban - это локальный сервис, который сканирует лог-файлы и банит IP-адреса, вызывающие множество ошибок аутентификации. Таким образом, Fail2Ban защищает сервер от попыток брутфорса. Он может защищать не только ssh, но и другие службы - Apache, Nginx, ProFTPD и т.д., но мы сегодня акцентируем внимание именно на защите ssh.

Показывать буду на примере своего ubuntu-сервера. Для начала подключаемся к нему и обновляем пакеты:
ssh user@IP -p PORT
sudo apt update
sudo apt upgrade

Далее устанавливаем пакет Fail2Ban:
sudo apt install fail2ban

Чтобы убедиться что он установлен, мы можем вывести справку:
fail2ban-client -h

Проверить версию можно с помощью команды fail2ban-client version, однако у вас может возникнуть ошибка при выполнении данной команды, если вы еще не запустили службу Fail2Ban. О том как запустить службу и добавить ее в автозагрузку расскажу чуть позже, а сейчас переходим к настройке.

У программы два основных файла конфигурации:

  1. /etc/fail2ban/fail2ban.conf — настройка запуска процесса Fail2ban.
  2. /etc/fail2ban/jail.conf — настройка защиты конкретных сервисов, в том числе sshd.

Это системные файлы, которые обновляются вместе с пакетом Fail2Ban, поэтому использовать их не рекомендуется. Вместо этого мы создадим собственные конфигурационные файлы .local. Система приоритетов в Fail2ban настроена таким образом, что в качестве основных применяются правила, указанные в fail2ban.local и jail.local.

При необходимости вы можете создать копию файла fail2ban.conf и отредактировать ее, например если хотите изменить путь к лог-файлам или указать срок хранения забаненных IP-адресов в базе данных:
sudo cp /etc/fail2ban/fail2ban.conf /etc/fail2ban/fail2ban.local
sudo vim /etc/fail2ban/fail2ban.local

По умолчанию забаненные IP хранятся в базе данных в течении 1 дня:

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

Создадим конфиг для защиты сервисов:
sudo vim /etc/fail2ban/jail.local

В созданном файле настраиваем защиту sshd. В квадратных скобках указываем службу:

[sshd]

Чтобы защита была активна, необходимо установить параметр enabled = true:

enabled = true

Далее мы указываем, что любой IP-адрес будет заблокирован на 1 день (bantime = 1d), если в течение 1 часа (findtime = 1h) интервала будет обнаружено 5 (maxretry = 5) неудачных попыток подключения с данного IP:

bantime   = 1d
findtime  = 1h
maxretry  = 5

Крайне рекомендую добавить свой домашний IP-адрес в ignoreip. Например:

ignoreip = 170.232.43.92

Таким образом Fail2Ban не будет банить ваш IP-адрес и вы всегда сможете с него подключиться.

В итоге мы получаем вот такой конфиг:

[sshd]
enabled   = true
bantime   = 1d
findtime  = 1h
maxretry  = 5
ignoreip = 127.0.0.1 170.232.43.92

Кстати, вместо [sshd] вы можете использовать [DEFAULT]. Таким образом вы можете указать настройки по умолчанию для всех jail'ов:

[DEFAULT]
bantime   = 1d
findtime  = 1h
maxretry  = 5
ignoreip = 127.0.0.1 170.232.43.92

[sshd]
enabled   = true

Дополнительно мы можем указать порт, на котором работает служба. Например, на моем сервере вместо стандартного 22 порта используется порт 2448:

[sshd]
enabled   = true
port      = 2448
bantime   = 1d
findtime  = 1h
maxretry  = 5
ignoreip = 127.0.0.1 170.232.43.92

С помощью [recidive] можно еще больше повысить безопасность. Дело в том, что забаненный IP-адрес удаляется из базы данных через заданное кол-во времени (в нашем случае через 1 день) и после этого атакующий может снова продолжить попытки атаки. Если мы настроим [recidive], то сможем отправлять IP-адреса в более длительный бан, если с них снова были неудачные попытки входа:

[recidive]
enabled   = true
bantime   = 7d
findtime  = 3d

Как только вы завершили настройку, можете включить службу fail2ban и добавить ее в автозапуск:
sudo systemctl enable fail2ban.service --now

Кстати, теперь мы можем прооверить версию:
sudo fail2ban-client version

Чтобы вывести информацию о jail'е sshd:
sudo fail2ban-client status sshd

Просмотреть логи попыток аутентификаций можно следующим образом:
less /var/log/auth.log

Скорее всего вы там увидите множество попыток входа с разных адресов. Это связано с тем, что боты периодически пытаются взломать найденные сервера. В том числе и ваш сервер.


Несколько рекомендаций:
Не забудьте после редактирования конфигурационных файлов перезапустить службу Fail2Ban, чтобы изменения применились:
sudo systemctl restart fail2ban

Если ваш сервер многопользовательский, то не стоит оставлять адрес 127.0.0.1 в параметре ignoreip. Это может создать угрозу, если злоумышленник получит доступ к чьему-либо пользовательскому шеллу.

В статье затронуты только базовые возможности Fail2Ban, которые можно применить для защиты ssh. Рекомендую более подробно ознакомиться с Fail2Ban с помощью официальной Wiki. Например, вы можете настроить отправку уведомлений на эл. почту.


Мой Telegram

Мой GitHub

Поддержать автора донатом