Защищаем 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. О том как запустить службу и добавить ее в автозагрузку расскажу чуть позже, а сейчас переходим к настройке.
У программы два основных файла конфигурации:
/etc/fail2ban/fail2ban.conf
— настройка запуска процесса Fail2ban.-
/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. Например, вы можете настроить отправку уведомлений на эл. почту.