Введение
В интернете постоянно пасутся стада ботов, проверяющие доступ к тем или иным сервисам. Чаще всего это боты очень простые, они просто подбирают по словарю доступ к ресурсам. Иногда они используют известные уязвимости. Так как wordpress самый популярный движок для сайта, пробовать его на прочность будут регулярно. Если у вас постоянно обновляется версия и уникальный пароль, которого нет в словарях, то вам скорее всего беспокоиться не о чем. Fail2ban какой-то уникальной защиты не предоставляет.
Лично я предпочитаю обезопасить себя на всякий случай и закрыть доступ к админке wordpress от слишком назойливых глаз. Будем анализировать лог web сервера и банить всех тех, кто более 3-х раз ввел неверный пароль на доступ к внутренностям сайта.
Я буду показывать настройку fail2ban на примере CentOS 7, но версия ОС тут не имеет принципиального значения. Все настройки самого сервиса подойдут и для других систем.
Получаем сертификат от Let’s Encrypt
Итак, я считаю, что вы настроили почтовый сервер по предложенной выше ссылке. Значит, у вас установлен веб сервер Apache, а так же все в порядке с dns записями. Сертификатов мы получим сразу два. Для доменных имен:
- mail.site.ru — имя почтового сервера, этот сертификат будут использовать postfix и apache
- webmail.site.ru — домен для web интерфейса почты, будет использовать веб сервер
Для настройки получения сертификатов let’s encrypt и настройки apache, нам нужно будет установить несколько пакетов. Напоминаю, что речь идет про Centos 8. В других системах настройка будет аналогичной, только имена пакетов могут отличаться.
# dnf install certbot python3-certbot-apache mod_ssl
Пакеты эти живут в репозитории epel, так что если он еще не подключен, подключите.
# dnf install epel-release
Дальше нам нужно добавить 2 виртуальных домена в настройки apache. Для этого создаем 2 конфига в директории /etc/httpd/conf.d/.
1. mail.site.ru.conf
<VirtualHost *:443> ServerName mail.site.ru DocumentRoot /var/www/mail.site.ru/ <Directory /var/www/mail.site.ru/> Options -Indexes +FollowSymLinks AllowOverride All </Directory> ErrorLog /var/log/httpd/mail.site.ru-error.log CustomLog /var/log/httpd/mail.site.ru-access.log combined </VirtualHost> <VirtualHost *:80> ServerName mail.site.ru DocumentRoot /var/www/mail.site.ru/ <Directory /var/www/mail.site.ru/> Options -Indexes +FollowSymLinks AllowOverride All </Directory> ErrorLog /var/log/httpd/mail.site.ru-error.log CustomLog /var/log/httpd/mail.site.ru-access.log combined </VirtualHost>
2. webmail.site.ru.conf
<VirtualHost *:443> ServerName webmail.site.ru DocumentRoot /var/www/webmail.site.ru/ <Directory /var/www/webmail.site.ru/> Options -Indexes +FollowSymLinks AllowOverride All </Directory> ErrorLog /var/log/httpd/webmail.site.ru-error.log CustomLog /var/log/httpd/webmail.site.ru-access.log combined </VirtualHost> <VirtualHost *:80> ServerName webmail.site.ru DocumentRoot /var/www/webmail.site.ru/ <Directory /var/www/webmail.site.ru/> Options -Indexes +FollowSymLinks AllowOverride All </Directory> ErrorLog /var/log/httpd/webmail.site.ru-error.log CustomLog /var/log/httpd/webmail.site.ru-access.log combined </VirtualHost>
По сути конфиги идентичные, только названия доменов разные. Теперь можно проверить конфигурацию apache и перезапустить его.
# apachectl -t # apachectl reload
Если увидите ошибку:
AH00526: Syntax error on line 85 of /etc/httpd/conf.d/ssl.conf: SSLCertificateFile: file '/etc/pki/tls/certs/localhost.crt' does not exist or is empty
Просто удалите конфиг /etc/httpd/conf.d/ssl.conf. Он нам не нужен.
Если нет ошибок, то можно запускать certbot и получать сертификаты. Делается это очень просто.
# certbot --apache
Если все прошло без ошибок, то вы увидите в директории /etc/letsencrypt/live две папки с сертификатами для каждого из доменов.
Так же certbot автоматически добавит в конфигурации виртуальных хостов apache несколько дополнительных параметров.
<VirtualHost *:443> ServerName webmail.site.ru DocumentRoot /var/www/webmail.site.ru/ <Directory /var/www/webmail.site.ru/> Options -Indexes +FollowSymLinks AllowOverride All </Directory> ErrorLog /var/log/httpd/webmail.site.ru-error.log CustomLog /var/log/httpd/webmail.site.ru-access.log combined SSLCertificateFile /etc/letsencrypt/live/mail.site.ru/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/mail.site.ru/privkey.pem Include /etc/letsencrypt/options-ssl-apache.conf </VirtualHost> <VirtualHost *:80> ServerName webmail.site.ru DocumentRoot /var/www/webmail.site.ru/ <Directory /var/www/webmail.site.ru/> Options -Indexes +FollowSymLinks AllowOverride All </Directory> ErrorLog /var/log/httpd/webmail.site.ru-error.log CustomLog /var/log/httpd/webmail.site.ru-access.log combined RewriteEngine on RewriteCond %{SERVER_NAME} =mail.site.ru RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} </VirtualHost>
В этот виртуальный хост установите веб почту, если вам она нужна.
Управление fail2ban
Программа Fail2Ban состоит из fail2ban-server и fail2ban-client. Серверная часть работает в фоновом режиме и отвечает за отработку всех активированных правил. Клиент — ваши непосредственные правила, которые взаимодействуют с сервисом.
Основные команды:
Перезапуск и проверка состояния Fail2ban:
root@host:~$ systemctl restart fail2ban root@host:~$ systemctl status fail2ban
Полный список правил:
root@host:~$ sudo iptables –L
Проверка срабатывания правила:
root@host:~$ fail2ban-regex <путь_к_лог_файлу> /etc/fail2ban/filter.d/<JAIL_NAME>.conf
Проверить работу служб:
root@host:~$ fail2ban-client status
Показать состояние указанного jail:
root@host:~$ fail2ban-client status sshd
Допустим, произошла ошибка, и ip адрес 123.123.12.13 не является нарушителем и нам его необходимо разблокировать:
root@host:~$ fail2ban-client set <JAIL_NAME> unbanip 123.123.12.13
Если необходимо добавить разрешение для данного ip адреса выполните:
root@host:~$ fail2ban-client set <JAIL_NAME> addignoreip 123.123.12.13
Удалить ip адрес из доверенных:
root@host:~$ fail2ban-client set <JAIL_NAME> delignoreip 123.123.12.13
Для просмотра списка всех доверенных адресов:
root@host:~$ fail2ban-client get <JAIL_NAME> ignoreip
Однако, все разрешения которые вы внесете используя команду addignoreip — временные и после перезапуска службы Fail2ban этот список будет автоматически очищен. Если вам необходимо внести ip адрес на постоянной основе и внести его в конфигурационный файл /etc/fail2ban/jail.d/<JAIL_NAME>.conf добавив с новой строки ещё один параметр:
ignoreip = 123.123.12.13>
В эту строку вы можете через пробел добавить как несколько IP адресов, так и целые подсети, например 172.16.1.0/24
Рекомендации по настройке Fail2ban
Не рекомендуется оставлять параметр ignoreip со значением по умолчанию , это создаёт очевидную угрозу в многопользовательских системах — если злоумышленник получил доступ хотя–бы к одному shell–аккаунту, то он имеет возможность беспрепятственно запустить bruteforce–программу для атаки на root или других пользователей прямо с этого–же сервера.
Новая опция findtime — определяет длительность интервала в секундах, за которое событие должно повториться определённое количество раз, после чего санкции вступят в силу. Если специально не определить этот параметр, то будет установлено значение по умолчанию равное 600 (10 минут). Проблема в том, что ботнеты, участвующие в «медленном брутфорсе», умеют обманывать стандартное значение. Иначе говоря, при maxretry равным 6, атакующий может проверить 5 паролей, затем выждать 10 минут, проверить ещё 5 паролей, повторять это снова и снова, и его IP забанен не будет. В целом, это не угроза, но всё же лучше банить таких ботов.
Прежде чем вносить изменения следуя рекомендациям, отметим, что не стоит редактировать основной файл настроек , для этого предусмотрены файлы с расширением , которые автоматически подключаются и имеют высший приоритет.
nano /etc/fail2ban/jail.local
## Постоянный IP-адрес. ## Если не переопределить ignoreip здесь, ## то стоит закомментировать этот параметр в jail.conf. ignoreip = 57.66.158.131 ## если в течении 1 часа: findtime = 3600 ## произведено 6 неудачных попыток логина: maxretry = 6 ## то банить IP на 24 часа: bantime = 86400
Осталось перезапустить Fail2ban:
service fail2ban restart
* Restarting authentication failure monitor fail2ban
tail /var/log/fail2ban.log
2013-01-20 22:00:35,911 fail2ban.jail : INFO Jail 'ssh' stopped 2013-01-20 22:00:35,916 fail2ban.server : INFO Exiting Fail2ban 2013-01-20 22:00:36,257 fail2ban.server : INFO Changed logging target to /var/log/fail2ban.log for Fail2ban v0.8.6 2013-01-20 22:00:36,258 fail2ban.jail : INFO Creating new jail 'ssh' 2013-01-20 22:00:36,259 fail2ban.jail : INFO Jail 'ssh' uses poller 2013-01-20 22:00:36,271 fail2ban.filter : INFO Added logfile = /var/log/auth.log 2013-01-20 22:00:36,271 fail2ban.filter : INFO Set maxRetry = 6 2013-01-20 22:00:36,272 fail2ban.filter : INFO Set findtime = 3600 2013-01-20 22:00:36,272 fail2ban.actions: INFO Set banTime = 86400 2013-01-20 22:00:36,298 fail2ban.jail : INFO Jail 'ssh' started
Работа со списком заблокированных адресов
Просмотр
Получить статистику заблокированных адресов можно следующей командой:
fail2ban-client status <имя правила>
Получить список правил можно командой:
fail2ban-client status
При наличие заблокированных IP-адресов мы увидим, примерно, следующее:
`- action
|- Currently banned: 2
| `- IP list: 31.207.47.55 10.212.245.29
С помощью iptables:
iptables -L -n —line
С помощью firewall-cmd:
firewall-cmd —direct —get-all-rules
Удаление
Средствами fail2ban:
Для удаление адреса из списка вводим:
fail2ban-client set <имя правила> unbanip <IP-адрес>
например:
fail2ban-client set ssh unbanip 31.207.47.55
С помощью iptables:
iptables -D <цепочка правил> -s IP-адрес
например:
iptables -D fail2ban-ssh -s 10.212.245.29
С помощью firewall-cmd:
firewall-cmd —direct —permanent —remove-rule <правило>
например:
firewall-cmd —direct —permanent —remove-rule ipv4 filter f2b-sshd 0 -s 188.134.7.221
После необходимо перечитать правила:
firewall-cmd —reload
Исключения
Для гарантии, что fail2ban не заблокирут компьютер администратора или другой важный узел, предусмотрена настройка исключений с помощью опции ignoreip. Опция может быть применена как на глобальном уровне (default), так и для конкретного правила.
Для того, чтобы задать общую настроку, откроем наш файл default:
vi /etc/fail2ban/jail.d/default.conf
… и добавим:
…
ignoreip = 192.168.0.0/24 95.95.95.95
* в данном примере под фильтры не будут попадать адреса с 192.168.0.1 по 192.168.0.255 и адрес 95.95.95.95.
Для конкретного правили настройки будут, примерно, следующие:
vi /etc/fail2ban/jail.d/ssh.conf
…
ignoreip = 192.168.1.22
* в данном примере мы добавили в белый список один адрес 192.168.1.22, который не будет блокироваться.
Обязательно перезагружаемся, чтобы настройки применились:
systemctl restart fail2ban
* добавление адреса в белый список не удаляет его из блокировки. Поэтому, если IP попал в блок, нужно будет его .
Делаем JAIL (файл, в котором укажем лог и необходимые действия)
указываем название фильтра и лога, к которому он применяется.
Тюрьму (“JAIL”) будем делать нестандартную. Обычно используется вариант вида “пять одинаковых адресов IP за период” – и в бан на 15 мин.
Можно сделать расширенный вариант – если в логе есть три раза один и тот же IP – то это точно “вредитель”.
Баним его сразу на 30 дней (и время обнаружения тоже 30 дней). Не забываем установить время хранения IP в базе хотя бы 31 день. Период хранения IP адреса в базе находится в файле fail2ban.conf. Необходимо создать и использовать файл fail2ban.local, в котором мы изменим время хранения.
# 31 days dbpurgeage = 2678400
Т.к. файл логов периодически начинает вестись с нуля – какие-то IP будут из бана возвращаться через месяц. При наборе очередных 3 попыток – опять бан. Это будет работать и для любителей делать 10 запросов в секунду. Тоже будут заблокированы на 30 дней.
enabled = true filter = testfilter logpath = /var/www/user/data/www/_mylog/test.log # 30 days bantime = 2592000 findtime = 2592000 maxretry = 3
Перезапускаем fail2ban
смотрим в логах /var/log/fail2ban.log
вот всё и заработало:
- Jail ‘test’ создан
- лог-файл добавлен
- наши параметры добавлены
- jail ‘test’ запущен
- три обнаружения и бан
ВАЖНО
fail2ban начинает парсить лог по умолчанию с момента своего запуска! Более ранняя часть лога не анализируется. Т.е
если у Вас, например, время обнаружения 1 час, а Вы перезапустили сервис полчаса назад = лог будет просмотрен только на полчаса назад.
Это не особо критично для коротких времен обнаружения findtime, но нужно учитывать при больших периодах (т.е. время обнаружения сильно больше, чем время с момента перезапуска fail2ban)
Посмотрим, что у нас там в “клетке” набралось
sudo iptables -L -n
да, через серверную утилиту iptables
Да, всё хорошо – вот они “вредители” с блоком на 30 дней.
А потом начинается “дискотека” в логе fail2ban – забаненные пытаются еще раз что-то сделать нехорошее.
За 20 секунд – 19 попыток… В среднем 1 раз в секунду.
И все они закончились на входе на сервер (на уровне netfilter), ни до Apache, ни до WordPress запросы уже не дошли.
Защита NGINX
a) Фильтр аутентификации
Допустим, на ваших сайтах есть разделы требующие аутентификации. Выполнить базовую защиту этих разделов от подбора паролей так же поможет Fail2ban. По умолчанию, защита NGINX доступна из коробки, однако её необходимо активировать. Для этого, в конфигурационном файле /etc/fail2ban/jail.conf находим блок , где изначально указан только logpath. Добавляем в него значения:
root@host:~$ vim /etc/fail2ban/jail.local
на выходе у нас должно получиться следующее:
enabled = true filter = nginx-http-auth port = http,https bantime = 600 maxretry = 6 logpath = %(nginx_error_log)s
Обратите внимание на то, как указаны пути к логам. Начиная с версии Fail2ban 0.9.х, писать полные пути не обязательно
Если расположение логов защищаемого сервиса стандартное, то пути к ним предусмотрены разработчиками. Значение %(nginx_error_log)s будет равнозначно пути /var/log/nginx/error. log. Вы можете использовать оба варианта.
Теперь создадим файл nginx-http-auth.conf
root@host:~$ vim /etc/fail2ban/filter.d/nginx-http-auth.conf
В который вносим следующие значения, которые являются фильтрами для корректной работы правила:
failregex = ^ \ \d+#\d+: \*\d+ user "\S+":? (password mismatch|was not found in ".*"), client: , server: \S+, request: "\S+ \S+ HTTP/\d+\.\d+", host: "\S+"\s*$ ^ \ \d+#\d+: \*\d+ no user/password was provided for basic authentication, client: , server: \S+, request: "\S+ \S+ HTTP/\d+\.\d+", host: "\S+"\s*$ ignoreregex =
б) Фильтр доступа к скриптам
Fail2ban является довольно гибки и функциональным инструментом. Если необходимого инструмента в jail.conf нет, опытный администратор может его написать сам. Например, мы хотим заблокировать ip адрес, который обращается к файлам с расширениями php, asp, exe, pl, cgi, scgi. Это очень полезный фильтр для обнаружения всякого рода эксплойтов.
Внимание! Будьте внимательны при использовании этого фильтра. Оно имеет смысл если у вас статический сайт, или вы четко уверены, к выполнению каких скриптов необходимо применить фильтрацию
Если сайт разрабатывали не вы, обратитесь за консультацией к разработчику
Для начала отредактируем главный конфигурационный файл:
root@host:~$ vim /etc/fail2ban/jail.local
В него необходимо добавить секцию , которая по умолчанию не существует:
enabled = true port = http,https filter = nginx-noscript logpath = %(nginx_access_log)s bantime = 600 maxretry = 6
Теперь создадим файл фильтра, к которому будет отсылаться наше правило при анализе access.log web-сервера:
root@host:~$ vim /etc/fail2ban/filter.d/nginx-noscript.conf
Вносим в него следующее:
failregex = ^ -.*GET.*(\.php|\.asp|\.exe|\.pl|\.cgi|\.scgi) ignoreregex =
Изменения вступят в силу после перезагрузки сервиса Fail2ban
root@host:~$ systemctl restart fail2ban
в) Фильтр сканеров
Сами по себе сканеры не несут какой либо угрозы сайту, однако сканирование вашего сайта может быть тем самым звоночком, что злоумышленник ищет его уязвимые места. Определить сканеры легко по всплеску ошибок 403 и 404 в /var/log/nginx/access.log. Итак, приступим:
root@host:~$ vim /etc/fail2ban/jail.local
Добавляем следующие блоки:
enabled = true filter = nginx-404 port = http,https logpath = %(nginx_access_log)s bantime = 86400 findtime = 600 maxretry = 30 enabled = true filter = nginx-403 port = http,https logpath = %(nginx_access_log)s bantime = 86400 findtime = 600 maxretry = 30
Создаем правило фильтрации для ошибок 403:
root@host:~$ vim /etc/fail2ban/filter.d/nginx-403.conf failregex = ^ .* "(GET|POST) +" 403 ignoreregex = .*(robots.txt|favicon.ico|jpg|png)
Создаем правило фильтрации для ошибок 404:
root@host:~$ vim /etc/fail2ban/filter.d/nginx-404.conf failregex = ^ .* "(GET|POST) +" 404 ignoreregex = .*(robots.txt|favicon.ico|jpg|png)
Перезапускаем сервис:
root@host:~$ systemctl restart fail2ban
Рассмотренный фильтр так же очень полезен при настройке фильтрации для web-сервера Apache. Он служит своего рода защитой от DDoS аттак и существенно может улучшить производительность web-сервера. Логика данного фильтра следующая: 404 — это код состояния HTTP, который указывает, что запрошенная веб-страница не может быть найдена на сервере. Другими словами, запрошенная веб-страница не существует или не работает.
И хакеры используют это как инструмент DDoS. Они генерируют тысячи запросов в минуту к несуществующим веб-страницам, что приводит к снижению производительности web-сервера или его полной неработоспособности.
Разблокировка ip бана
Общий вид команды для разблокировки ip забаненого Fail2Ban выглядит следующим образом:
fail2ban-client set <jail> unbanip <ip>
Например, для разблокирования ip для sshd jail нужно набрать в терминале ниже следующую команду, где вместо xxx.xxx.xx.x нужно указать заблокированный ip:
sudo fail2ban-client set sshd unbanip xxx.xxx.xx.x
Так же разблокировку ip можно выполнить и через iptables утилиту.
# смотрим наличие правил в iptables: iptables -L # ищем номер правила в iptables с заблокированным ip: iptables -L fail2ban-SSH -v -n --line-numbers # удаляем найденный ip из заблокированных iptables -D fail2ban-SSH
Файлы журналов
Для информации привожу здесь пути к файлам журналов распространенных программ Ubuntu:
- /var/log/auth.log — это основной системный лог авторизации, содержит все подключения и попытки входа в систему, в том числе и для SSH;
- /var/log/apache2/error.log — лог по умолчанию для apache2 куда пишутся и попытки HTTP авторизации;
- /var/log/mysql/error.log — лог MySQL, в него также пишутся попытки авторизации.
Принцип работы
Fail2ban отслеживает файлы журналов (например, /var/log/auth.log, /var/log/apache/access.log), временно или постоянно запрещая подозрительную активность IP-адреса путем обновления существующих правил брандмауэра. Fail2ban позволяет автоматически выполнить различные действия, такие как заблокировать IP, используя правила iptables, или просто отправить уведомление по электронной почте администратору сервера. По умолчанию Fail2ban поставляется с правилами фильтра под различные сервисы (sshd, apache, mysql proftpd, и т. д.), но конфигурация может быть легко расширена для мониторинга любой другой службы. Все фильтры и действия настраиваются в файлах конфигурации, таким образом Fail2ban является отличным гибким инструментом для предотвращения взлома вашего сервера.
Конфигурация локальных параметров
Файлы конфигурации службы Fail2ban хранятся в директории /etc/fail2ban. В ней есть файл с параметрами по умолчанию под названием jail.conf. Этот файл может быть перезаписан при обновлении пакета, поэтому мы не будем его редактировать, а создадим новый под названием jail.local.
Если в jail.local и jail.conf определены одни и те же параметры, будут использоваться значения из файла .local
Параметры конфигурации также могут быть прописаны в файлах, расположенных в директории /etc/fail2ban/jail.d/. Приоритет файлов конфигурации будет следующим (в порядке повышения):
1./etc/fail2ban/jail.conf
2./etc/fail2ban/jail.d/*.conf, в алфавитном порядке
3./etc/fail2ban/jail.local
4./etc/fail2ban/jail.d/*.local, в алфавитном порядке
Файлы конфигурации могут содержать раздел с общими настройками и отдельные разделы для “тюрем”. Значения параметров, установленные в отдельных разделах, имеют приоритет. Для начала можно создать простейшую версию jail.local. Откройте новый файл любым текстовым редактором:
vi /etc/fail2ban/jail.local
Вставьте следующий текст:
ignoreip = 127.0.0.1/8 192.168.0.0/24 enabled = true port = ssh filter = sshd action = iptables logpath = /var/log/secure
ignoreip — указывает адреса источников, которые Fail2ban будет игнорировать (так называемый белый список). В данном примере она настроена не запрещать трафик с локальной машины и из сети 192.168.0.0/24. Можно указать дополнительные адреса через пробел.
enabled — принимает значение true/false включение отключение тюрьмы
port — В данном случае ssh — предустановленное значение стандартного порта SSH (22). Если у вас ssh работает не на 22-м порту, то в этом параметре пропишите номер своего порта.
filter — фактически представляет собой ссылку на файл в директории /etc/fail2ban/filter.d без указания расширения .conf. Он содержит регулярные выражения, определяющие условия выявления неудачной аутентификации по строке лога. То есть, в данном примере неудачные попытки входа в систему будут определяться по логу sshd с использованием условий, прописанных в /etc/fail2ban/filter.d/sshd.conf. Обычно достаточно значений, заданных по умолчанию. При необходимости вы можете посмотреть файлы в этой директории и открыть при помощи текстового редактора те, которые связаны с используемыми вами службами. В большинстве таких файлов достаточно развернутые комментарии, и вы легко разберетесь, какие условия скрипт считает признаком неправомерного доступа.
logpath — путь к лог файлу, предполагает использование лога sshd
action — выполняемое действие из каталога В нашем примере это настроить iptables заблокировав порт ssh по протоколу tcp. Если нужно заблокировать все порты от адреса взломщика, то можно использовать действие iptables-allports.
Как работает Fail2ban
Работает утилита следующим образом, при настройке вы указываете путь к файлу логов. Fail2ban отслеживает изменения в лог-файлах служб и при обнаружении в логах определенного количества неудачных попыток входа в систему блокирует ip адрес злоумышленника. Например при неправильном вводе пароля для ssh на сервере Centos 7, в фале логов /var/log/secure регистрируется попытка неудачного входа и появляется строка
Jan 31 22:38:18 localhost sshd: Failed password for root from 34.56.21.11 port 49302 ssh2
Утилита сравнивает эту строку с регулярным выражением в своих фильтрах. Например эта строка попадает под регулярное выражение в файле /etc/fail2ban/filter.d/sshd.conf
"Failed \S+ for .*? from <HOST>..."
И поэтому эта попытка будет считаться взломом, и если число попыток превышает указанное количество, то ip адрес блокируется через iptables.
Настройка правил
Для нового правила необходимо создать конфигурационный файл в каталоге /etc/fail2ban/jail.d, например:
vi /etc/fail2ban/jail.d/service.conf
enabled = true
port = ssh
filter = sshd
action = iptables
logpath = /var/log/auth.log
maxretry = 10
findtime = 600
* где:
- ssh — название для правила;
- enabled позволяет быстро включать (true) или отключать (false) правило;
- port — порт целевого сервиса. Принимается буквенное или цифирное обозначение;
- filter — фильтр (критерий поиска), который будет использоваться для поиска подозрительных действий. По сути, это имя файла из каталога /etc/fail2ban/filter.d без .conf на конце;
- action — действие, совершаемое в случае срабатывания правила. В квадратных скобках указаны название для правила, сетевой порт и протокол для блокирования;
- logpath — расположение лог-файла, в котором фильтр будет искать подозрительную активность на основе описанных критериев.
* обратите внимание, что мы переопределили параметры по умолчанию maxretry, findtime и action. Чтобы изменения вступили в силу, перезапускаем сервис:
Чтобы изменения вступили в силу, перезапускаем сервис:
systemctl restart fail2ban
* в старых версиях service fail2ban restart.
Конфигурация Fail2ban
На данном этапе Fail2ban уже готов к работе, базовая защита SSH сервера от перебора паролей будет включена по умолчанию. Но лучше всё-же внести некоторые изменения следуя рекомендациям ниже.
У программы два основных файла конфигурации:
- — отвечает за настройки запуска процесса Fail2ban.
- — содержит настройки защиты конкретных сервисов, в том числе sshd.
Файл поделён на секции, так называемые «изоляторы» (jails), каждая секция отвечает за определённый сервис и тип атаки:
ignoreip = 127.0.0.1/8 bantime = 600 maxretry = 3 banaction = iptables-multiport enabled = true port = ssh filter = sshd logpath = /var/log/auth.log maxretry = 6
Параметры из секции применяются ко всем остальным секциям, если не будут переопределены.
Секция отвечает за защиту SSH от повторяющихся неудачных попыток авторизации на SSH–сервере, проще говоря, «brute–force».
Подробнее по каждому из основных параметров файла jail.conf:
-
ignoreip — IP–адреса, которые не должны быть заблокированы. Можно задать список IP-адресов разделённых пробелами, маску подсети, или имя DNS–сервера.
-
bantime — время бана в секундах, по истечении которого IP–адрес удаляется из списка заблокированных.
-
maxretry — количество подозрительных совпадений, после которых применяется правило. В контексте — это число неудавшихся попыток логина, после которых происходит блокировка.
-
enabled — значение указывает что данный jail активен, выключает действие изолятора.
-
port — указывает на каком порту или портах запущен целевой сервис. Стандартный порт SSH–сервера — , или его буквенное наименование — .
-
filter — имя фильтра с регулярными выражениями, по которым идёт поиск «подозрительных совпадений» в журналах сервиса. Фильтру соответствует файл .
-
logpath — путь к файлу журнала, который программа Fail2ban будет обрабатывать с помощью заданного ранее фильтра. Вся история удачных и неудачных входов в систему, в том числе и по SSH, по умолчанию записывается в log–файл .
Шаг 4. Защита SSH
Файл конфигурации fail2ban имеет по умолчанию подготовленные секции для различных сервисов, поэтому защита какого-либо из них требует минимальных усилий и знаний. Итак, откроем снова файл конфигурации /etc/fail2ban/jail.local и найдём в нём секцию (в вашей системе это может быть или , если это так, то используйте ту секцию, которая у вас есть). Пробежимся по параметрам (в большинстве своём они не являются обязательными, и если не будут указаны, то применяются настройки по умолчанию):
- enabled — состояние (true/false) фильтра, показывающее, включен он или выключен.
- filter — какой фильтр применяется (со списком фильтров можно ознакомиться в /etc/fail2ban/filter.d/).
- action — действия, выполняемые при бане IP-адреса.
- logfile — файл с логами, которые будет отслеживать fail2ban.
Исходя из этого, конфиг, банящий IP на 12 часов, если с него в течение 10 минут было произведено 3 неудачных попытки авторизоваться, выглядит так:
enabled = truefilter = sshdaction = iptableslogpath = /var/log/auth.logfindtime = 600maxretry = 3bantime = 43200
Сохраните изменения (в nano это Ctrl+O) и перезапустите fail2ban для применения настроек:
sudo service fail2ban restart