У меня есть несколько серверов, в том числе и в домашнем офисе, которые доступны по SSH. Несмотря на то, что я уже настроил их использовать нестандартный порт для SSH, довольно часто в логах я замечаю неудавшиеся попытки залогиниться под стандартными пользователями. Я решил улучшить защиту и активировал fail2ban.
Что такое fail2ban?
fail2ban это софт для Linux и Unix систем, который мониторит стандартные логи операционной системы и её сервисов, находит неудачные попытки доступа с удалённых серверов и, если их было достаточно много, блокирует доступ к IP адресам этих серверов посредством IPtables.
Идея в том, что если какой-то IP адрес неудачно подключался больше 3 раз за 10 минут – то скорее всего это попытка взлома, и лучше такой адрес на какое-то время заблокировать. Это минимизирует риски, потому что доступ с подозрительных IP адресов блокируется на уровне firewall, так что дальнейшие попытки перебора пользователей и паролей больше не проводятся.
ИНТЕРЕСНО: fail2ban может защищать множество сервисов, не только SSH – в комплекте есть растущая библиотека лог файлов и правил их мониторинга.
Установка fail2ban в Ubuntu
Даже на моей системе Raspberry Pi было очень просто установить fail2ban:
$sudo apt install fail2ban
ВАЖНО: перепроверьте, что у вас установлен iptables.
После установки сервис уже готов к запуску с помощью команд systemctl или service.
Настройка fail2ban
Перед запуском сервиса, пожалуй стоит его настроить.
Основные настройки для меня:
Порт SSH – по умолчанию fail2ban будет блокировать стандартный SSH порт 22, но если у нас SSH сервер испоьзует другой порт, то это следует отразить в настройках fail2ban
Настройки почты – fail2ban сможет слать вам емейлы по поводу банов и окончания банов
Так что редактируем /etc/fail2ban/jail.conf файл из-под пользователя root. Я сделал следующее:
Настройки электронной почты в fail2ban
Указываем нестандартный порт 202 для сервиса SSH
Как Использовать fail2ban
Запускаем сервис:
$sudo systemctl start fail2ban
и смотрим в лог файл /var/log/fail2ban.log:
2020-01-09 22:32:55,710 fail2ban.server [6038]: INFO --------------------------------------------------
2020-01-09 22:32:55,712 fail2ban.server [6038]: INFO Starting Fail2ban v0.10.2
2020-01-09 22:32:55,727 fail2ban.database [6038]: INFO Connected to fail2ban persistent database '/var/lib/fail2ban/fail2ban.sqlite3'
2020-01-09 22:32:55,731 fail2ban.jail [6038]: INFO Creating new jail 'sshd'
2020-01-09 22:32:55,779 fail2ban.jail [6038]: INFO Jail 'sshd' uses pyinotify {}
2020-01-09 22:32:55,798 fail2ban.jail [6038]: INFO Initiated 'pyinotify' backend
2020-01-09 22:32:55,801 fail2ban.filter [6038]: INFO maxLines: 1
2020-01-09 22:32:55,934 fail2ban.server [6038]: INFO Jail sshd is not a JournalFilter instance
2020-01-09 22:32:55,936 fail2ban.filter [6038]: INFO Added logfile: '/var/log/auth.log' (pos = 385669, hash = 9d2089e21756515d4394ead79bad08c298835101)
2020-01-09 22:32:55,939 fail2ban.filter [6038]: INFO encoding: UTF-8
2020-01-09 22:32:55,940 fail2ban.filter [6038]: INFO maxRetry: 3
2020-01-09 22:32:55,942 fail2ban.filter [6038]: INFO findtime: 600
2020-01-09 22:32:55,943 fail2ban.actions [6038]: INFO banTime: 1800
2020-01-09 22:32:55,974 fail2ban.jail [6038]: INFO Jail 'sshd' started
2020-01-10 02:46:49,790 fail2ban.filter [6038]: INFO [sshd] Found 218.93.239.44 - 2020-01-10 02:46:49
2020-01-10 02:46:49,825 fail2ban.filter [6038]: INFO [sshd] Found 218.93.239.44 - 2020-01-10 02:46:49
2020-01-10 02:46:51,811 fail2ban.filter [6038]: INFO [sshd] Found 218.93.239.44 - 2020-01-10 02:46:51
2020-01-10 02:46:52,382 fail2ban.actions [6038]: NOTICE [sshd] Ban 218.93.239.44
Как Читать Логи fail2ban
Как видно из примера лога выше, сервис fail2ban запустил “клетку” (“jail”) для контроля сервиса SSH. Я запустил fail2ban в 22:32 вчера вечером, и уже в 2:46am заблокировал первый подозрительный IP адрес 218.93.239.44.
Можно также проверить iptables, там уже могли оказаться заблокированные IP адреса:
root@srv:/#iptables -nvL Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
266 17432 f2b-sshd tcp -- * * 0.0.0.0/0 0.0.0.0/0 multiport dports 202
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain f2b-sshd (1 references)
pkts bytes target prot opt in out source destination
0 0 REJECT all -- * * 218.93.239.44 0.0.0.0/0 reject-with icmp-port-unreachable
266 17432 RETURN all -- * * 0.0.0.0/0 0.0.0.0/0
Как-то так! Надеюсь, вы узнали для себя что-то новое!
Заходите на страницу Facebook или присоединяйтесь к чату в Telegram:
Я использую браузер Brave
Попробуйте сами:
IT Консалтинг
У меня есть консалтинговая компания: Tech Stack Solutions. Я помогаю планировать и создавать облачные решения на базе AWS и помогаю с развёртыванием и поддержкой сервисов на Unix/Linux. Свяжитесь со мной тут.