Введение
Я заметил подозрительную активность на сайте. Заходили какие-то боты, немного скролили и тыкали по ссылкам. Кто и зачем направил их на мой сайт мне было не понятно. Ничего плохого, по сути, они не делали, просто нарушали подсчет статистики, искажая реальную картину. Я быстро прикинул по статистике сайта, с каких стран в основном ко мне заходят люди. В моем случае это страны СНГ и немного заграницы. Боты же лезли со всего мира. Было принято решение временно закрыть доступ к сайту для всех стран, кроме самых популярных, с которых приходит около 95-98% пользователей. Забегаю вперед скажу, что это дало очень хороший результат, отсеяв почти всех нежелательных посетителей.
Есть разные способы решить данную задачу. Наиболее простой и популярный — воспользоваться модулем для nginx — http_geoip_module. Не стал его реализовывать по 2-м причинам:
- По-умолчанию, этот модуль не включен в сборку, необходимо собирать веб сервер заново.
- Nginx быстрый сервер, успешно справляется с высокими нагрузками, но все же мне казалось более правильно отсечь все лишнее еще на подходах к серверу.
В итоге решил блокировать ботов с помощью iptables. Если у вас он не настроен, можете воспользоваться моей статьей — настройка iptables. Первое, что пришло в голову, это вручную добавить полный список ip адресов конкретной страны. Эта информация без проблем ищется в интернете, например вот тут — http://ipdeny.com/ipblocks/. Я взял список адресов одной страны и загнал его в свой скрипт для iptables, о котором рассказано в моей статье.
Запуск скрипта с добавленным списком огромного количество ip адресов и диапазонов длился секунд 10. Сейчас уже точно не помню, какую страну взял, если не ошибаюсь, то список был на несколько тысяч строк. Я понял, что так дело не пойдет, но все же решил попробовать добавить еще одну страну. После запуска скрипта сервер просто завис. Перестал отвечать на запросы, по ssh меня отключило. Пошел в консоль и перезагрузил сервер.
Я понял, что просто в лоб нельзя в iptables загнать большие списки. Стал искать другой способ, как реализовать ограничение доступа к серверу на основе большого списка правил. Решение было найдено — ipset. Официальная страница проекта — http://ipset.netfilter.org/. Ipset представляет из себя модуль ядра и утилиту для настройки, поэтому работает все быстро и переваривает огромные списки правил. В iptables при этом добавляется только одно правило.
Дальше я расскажу, как установить и настроить ipset. Работать будем на сервере CentOS 7. В других дистрибутивах никаких отличий не будет, за исключением установки и запуска модуля ядра.
Делаем 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
ВАЖНО: fail2ban при запуске проверяет наличие лог-файлов. Если у Вас лог отсутствует на момент старта или некорректно обновляется — fail2ban не запустится и завершится с ошибкой!. Поэтому нам нужен пустой файл empty.log (можно его создать прямо в папке fail2ban) — и укажем его в списке логов
Поэтому нам нужен пустой файл empty.log (можно его создать прямо в папке fail2ban) — и укажем его в списке логов.
enabled = true filter = testfilter logpath = /etc/fail2ban/empty.log /var/www/user/data/www/_mylog/test.log # 30 days bantime = 2592000 findtime = 2592000 maxretry = 3
и тогда запуск будет нормальным — даже при отсутствии на момент запуска нужного файла лога.
Т.е. если у Вас есть 10 правил jail и в одном некорректный лог-файл = fail2ban запустится и 9 остальные правил других jail будут работать
ВАЖНО: — но если лог test.log появится потом = то его уже fail2ban не будет обрабатывать. смотрим в логах /var/log/fail2ban.log
смотрим в логах /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 запросы уже не дошли.
Структура конфигурационных файлов
Файлы настроек находятся в каталоге /etc/fail2ban/. Для понимания работы утилиты, рассмотрим их более детально:
action.d/*.* — конфигурация выполняемых действий;
fail2ban.conf — дефолтный конфигурационный файл;
fail2ban.d/*.* — пользовательские настройки администратора для Fail2ban;
filter.d/*.* — шаблоны для анализа логов и настройки шаблонов;
jail.conf — дефолтные настройки сервисов;
jail.d/*.* — пользовательские настройки администратора для сервисов.
Файлы paths-arch.conf, paths-common.conf, paths-debian.conf и paths-opensuse.conf хранят в себе настройки путей для различных операционных систем семейства Linux.
Отладка работы fail2ban
После добавления правил блокировки ip адресов с помощью fail2ban, я некоторое время наблюдаю за сервером, чтобы проверить правильность работы. Для этого делаю вот такое окно в отдельном мониторе и наблюдаю некоторое время.
Здесь открыт лог postfix, dovecot и fail2ban. Если вижу, что правила отрабатываются корректно, завершаю настройку. На этом этапе могут быть заблокированы валидные ip адреса пользователей, у которых одна из учеток указана с неверным паролем. В итоге он банится по ip и у него вообще перестает работать вся почта. Если это локальные пользователи, то можно всю их подсеть добавить в доверенные, но я бы не рекомендовал так делать. В этом случае вы не узнаете, что кто-то вас перебирает из локальной сети. А это случается не редко.
Делаем свой лог
Например в корневой папке web-server (в папках выше политика безопасности сервера не даст доступа нашему php-скрипту)
<?php $root_webserver = '/var/www/user/data/www/'; // это корневая папка web server, а не DOCUMENT_ROOT сайта $my_dir = $root_webserver.'_mylog'; if (! file_exists ($my_dir)){ mkdir ($my_dir, 0777); } $file_var = $my_dir.'/test.log'; $size_log = filesize ($file_var); //при отсутствии файла будет false $bot_info = date("Y-m-d H:i:s").' '.'192.168.1.1 и другая информация'.PHP_EOL; // перевод строки if ( $size_log === FALSE || $size_log > 300000 ) { // файла нет или он больше 300 000 байт - делаем новый file_put_contents($file_var, $bot_info, LOCK_EX); }else{ // в остальных случаях дописываем в старый file_put_contents($file_var, $bot_info, FILE_APPEND | LOCK_EX); } ?>
Дата и время должны записываться в лог в определенном формате, что бы фильтр fail2ban можно было настроить корректно (там потом будет анализ периода заходов бота). Основной стандартный формат ниже (но fail2ban понимает и другие варианты)
год-месяц-день часы:минуты:секунды
поэтому используем php — date(«Y-m-d H:i:s»)
ВАЖНО: внутри WordPress функция date() работает некорректно
Это такая фича, а не баг — читаем статью
В результате этого колдунства у нас получилось:
- в папке /var/www/user/data/www/ (на Вашем сервере может быть другой путь) появилась новая папка «_mylog«
- в этой папке файл «test.log» (общий лог для всех Ваших сайтов на VPS)
- при превышении размера ~300kb — файл создается заново (или можно сделать ротацию логов)
- переменную $bot_info можно собрать как удобнее — главное дата/время и IP
Итого мы имеет лог-файл с адресом вида (в который пишутся строки с IP-адресами ботов)
/var/www/user/data/www/_mylog/test.log
который мы и будет «скармливать» fail2ban
Настройка общих параметров
В созданной нами версии файла jail.local мы определили основные параметры для конкретной тюрьмы. Давайте теперь настроем общие параметры для всех. Откроем jail.conf и рассмотрим некоторые из них. Если вам потребуется изменить какие-либо значения, для определенной «тюрмы» их нужно скопировать в соответствующий раздел jail.local.
bantime = 600
Параметр bantime указывает временной интервал, в течение которого взломщику будет запрещено подключение, если он не сможет корректно выполнить аутентификацию. Время указывается в секундах, по умолчанию 600, то есть 10 минут.
findtime = 600 maxretry = 3
Два следующих параметра, на которые стоит обратить внимание — findtime и maxretry. Они используются совместно для определения условий отказа клиенту в доступе
Переменная maxretry устанавливает разрешенное клиенту количество попыток аутентификации во временном окне findtime, прежде чем ему будет отказано в доступе. По умолчанию это выполняется для клиента, который сделал 3 неудачных попытки входа в систему за 10 минут.
destemail = admin@example.com sendername = Fail2Ban mta = sendmail
action = $(action_)s
В данном параметре настраивается действие Fail2ban при осуществлении отказа в доступе. Значение action_ определяется в файле перед этим параметром. По умолчанию это настройка брандмауэра для отклонения трафика от узла нарушителя до истечения времени отказа в доступе.
Если нужно настроить уведомления по электронной почте, можно заменить action_ на action_mw. Чтобы в сообщении содержались соответствующие записи журнала, укажите action_mwl. Эти значения также заданы по умолчанию, но для использования уведомлений необходимо правильно настроить электронную почту.
После завершения редактирования файла конфигурации его нужно сохранить и перезапустить Fail2ban:
systemctl restart fail2ban
Для проверки работы службы можно воспользоваться программой fail2ban-client:
fail2ban-client status
Вы также можете получить более подробную информацию о конкретной “тюрьме”. Например информация о нашем примере будет следующий.
fail2ban-client status ssh-iptables
Управление правилами fail2ban
Временное отключение блокировки IP адреса
Для этого Вам необходимо воспользоваться услугой iptables. Сначала мы выведем список правил на консоль, а затем выбрав нужные IP, удалим их из бана.
Для просмотра списка правил введите команду:
Вы увидите сообщение следующего вида:
Нас интересует удалить из бана IP адрес 1.2.3.4, который (как мы видим) находится в цепочке правил (chain) под названием fail2ban-ASTERISK. Набираем команду:
В случае успешного выполнения команды никаких сообщений не появится, и если мы теперь снова запустим команду
то увидим, что IP адрес исчез из блокировки iptables (хотя и остался в блокировке fail2ban!). При этом мы снова можем подключаться к серверу asterisk
Постоянное отключение блокировки IP адреса
Для того, чтобы fail2ban не блокировал определенный IP адрес (или несколько IP адресов) независимо от того, сколько неудачных попыток подбора пароля (и прочих “неправомерных” действий) они совершили, необходимо произвести дополнительную настройку jails в файле /etc/fail2ban/jail.conf
В каждом правиле файла jail.conf может присутствовать параметр ignoreip, который задает список IP адресов, попадающих в “белый список” для этого правила
Поскольку правил у нас может быть два, обратите внимание, что Ваш IP необходимо прописывать в обоих правилах!. Параметр имеет следующий вид:
Параметр имеет следующий вид:
То есть Вы можете прописывать как подсети, так и отдельные IP адреса (в данном случае в “белый список” попадают IP 127.0.0.1-127.0.0.255, 192.168.0.1-192.168.255.255 и 1.2.3.4).
Разблокировка IP адреса, с которого производилось тестирование
Во время проверки правильности настройки fail2ban Вы неоднократно запускали SIP клиента для тестирования работы по блокировке будущих атак из интернета. И в процессе последующей работы Вам, возможно, также понадобится время от времени производить действия, последствиями которых может быть блокировка со стороны fail2ban / iptables. Хотелось бы не дожидаться, когда fail2ban “соизволит” разблокировать IP сам (а это может быть довольно долго – поскольку параметр bantime можно выставить хоть на час, хоть на день, хоть на год).
Существуют 2 пути решения подобной проблемы:
- Внести IP адрес в правилах fail2ban в список ignoreip. Но иногда это может быть нежелательно (чтобы, например, производить периодическое тестирование работы fail2ban)
- Обычно время findtime (это длительность интервала в секундах, за которое событие должно повториться maxretry раз, после чего бан вступит в силу) намного меньше, чем bantime (это время бана в секундах, по истечении которого IP адрес удаляется из списка заблокированных). Например, findtime выставляется в 10 минут, а bantime – час. Либо findtime – час, а bantime – день или даже больше. И так далее. Поэтому имеет смысл сделать паузу длительностью не менее, чем findtime с момента последнего тестирования (и забанивания Вашего IP адреса), после чего перезагрузить сервис fail2ban. При перезагрузке сервиса fail2ban все блокировки аннулируются. Однако при последующей загрузке fail2ban логи анализируются снова, и если в логах в течение findtime было maxretry неудачных попыток подключения с одного IP, этот IP будет снова забанен сразу после запуска fail2ban.
Тестирование конфигурации fail2ban
Вы можете проверить, как будет применяться фильтр fail2ban к тому или иному логу. Для этого можно запустить команду:
Где /var/log/asterisk/messages – это пример пути к файлу с логами, который будет фильтроваться, а /etc/fail2ban/filter.d/asterisk.conf – сам фильтр, который содержит те фрагменты , которые должны быть в логе .
И напоследок: вместо перезагрузки fail2ban с помощью можно выполнить следующую команду
How to unban an IP in Fail2ban?
When a valid user IP is blocked, the server owner may get a Connection timed out message for mail, web, SSH, etc.
For example, a blocked customer will see the below message, when he try to access the server via SSH.
But, we easily identify and unban the IP address from Fail2ban in 4 simple steps.
1) Check if IP address is blocked
Fail2ban uses iptables to block the traffic.
So, our Server Support Engineers first login to the server via SSH, and check for IP block with the following command.
If the IP is blocked by Fail2ban, then it will be listed in the Fail2ban chain like fail2ban-ssh.
2) Check the Fail2ban log
Fail2ban log on the server is at /var/log/fail2ban.log and this logs the details like IP addresses that are banned, the jail, and time they are blocked.
For example, a Fail2ban log looks like this:
Our Support Engineers check these logs to confirm if the IP is blocked by Fail2ban.
3) Get Jail name of blocked IP address
Next step is to confirm the jail name for this IP address is in.
For that, we use the command fail2ban-client status.
Here, the Jail list in the output shows the Jail names set in Fail2ban.
4) Unban the IP address
Once we get the jail name, next step is to unban this IP address.
There is a slight difference in the unban commands depending on the Fail2ban version.
In Fail2ban version(before v0.8.8)
We use the below command to unban the IP address in Fail2ban versions before 0.8.8.
Replace yourjailname with the corresponding jail name and youripaddress with the blocked IP address.
For example, to remove an IP address jailed within ssh, use the below command.
In Fail2ban version v0.8.8 or later
We use the below command to unban the IP address in Fail2ban version 0.8.8 and later.
Replace yourjailname with the corresponding jail name and youripaddress with blocked IP address.
For example, to remove an IP address jailed within ssh, use the below command.
Alternatively, our Server Support Engineers use another method to unban the IP address instead of fail2ban-client.
For that, we first check for the blocked IP address, chain name and its corresponding line number with the following command.
Next, we use the below command to unban that IP address using the line-number and chain name.
In plesk servers, they have integrated the Fail2ban feature aka IP Address Banning with the control panel.
So, server owners can easily unban the IP address in a single click.
Fail2ban in Plesk
Sometimes, we receive requests from server owners to unban multiple IP addresses from their servers.
During such situations, our Support Engineers create custom scripts to unban multiple IP addresses and make it a pain free process.
Проверка работы
На всякий случай проверьте в /etc/fail2ban/fail2ban.conf куда будут складываться логи сервиса. За них отвечает параметр:
logtarget = /var/log/fail2ban.log
Убедитесь, что у вас настроена ротация этого файла. В CentOS 7 для этого нужно проверить, что в папке /etc/logrotate.d есть файл fail2ban примерно следующего содержания:
/var/log/fail2ban.log { rotate 7 missingok compress postrotate /usr/bin/fail2ban-client flushlogs 1>/dev/null || true endscript }
Во время работы автобана в лог файле будут появляться примерно такие строки:
2015-12-15 16:57:27,878 fail2ban.filter : INFO Found 188.138.220.43 2015-12-15 17:00:29,738 fail2ban.filter : INFO Found 188.138.220.43 2015-12-15 17:03:03,292 fail2ban.filter : INFO Found 185.93.187.31 2015-12-15 17:03:29,419 fail2ban.filter : INFO Found 188.138.220.43 2015-12-15 17:03:30,184 fail2ban.actions : NOTICE Ban 188.138.220.43 2015-12-15 17:13:31,082 fail2ban.actions : NOTICE Unban 188.138.220.43
Проверить, забанены ли реально эти адреса можно посмотрев текущие правила iptables:
# iptables -L -v -n
Либо можно проверить статус командой:
# fail2ban-client status wp-login
Если вам нужно будет вручную кого-нибудь забанить, то можно воспользоваться командой:
# fail2ban-client set banip
Это в общем случае, в нашем случае команда будет выглядеть вот так:
# fail2ban-client set wp-login banip 188.138.220.43
Чтобы разбанить какой-нибудь адрес, поступаем следующим образом:
# fail2ban-client set wp-login unbanip 188.138.220.43
Установка Fail2ban на Debian 7
1. Установка программы на VPS выполняется следующим набором команд:
apt-get update && apt-get upgrade sudo apt-get install fail2ban
2. Повторите п. 2 из двух предыдущих разделов для создания локальной копии конфигурационного файла jail.conf:
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local sudo nano /etc/fail2ban/jail.local
3. Настройка алгоритма работы Fail2ban задается точно таким же образом, как и для операционных систем Ubuntu и CentOS. Вам необходимо активировать нужные секции jail.local (, и прочие, в зависимости от портов, защиту которых вы хотите активировать) и сохранить результаты редактирования конфигурационного файла. Более подробное описание этой процедуры представлено ниже в разделе «Настройка Fail2ban».
4. После правки конфигурационного файла выполните перезапуск Fail2ban командой
sudo service fail2ban restart
Исключения
Для гарантии, что 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 попал в блок, нужно будет его .
Что такое fail2ban и зачем он нужен для asterisk?
О том, что такое fail2ban, Вы можете прочитать в разделе безопасность Linux. Рассмотрим, зачем fail2ban нужен для защиты asterisk.
Как Вам известно, asterisk является приложением (сервером) для IP-телефонии. То есть позволяет подключившимся к нему клиентам звонить друг другу и во внешний мир, используя (помимо всего прочего) линии телефонной связи. При этом возникают следующие риски:
- клиенты идентифицируются по логину/паролю, а также (как правило) по IP адресу. При этом существует возможность подобрать пароль (раньше или позже, в зависимости от его сложности, но в любом случае это возможно), причем крайне часто ограничения по IP адресам далеко не такие жесткие, как хотелось бы (в идеале для каждого клиента должен быть свой уникальный IP адрес)
- входящие звонки из интернета (например, с других серверов asterisk). С этими подключениями все сложнее, поскольку asterisk (в базовой конфигурации) не предусматривает отображение IP адресов, с которых производится подключение.
Программа fail2ban в связке с брандмауэром (например, iptables) и правильно настроенным asterisk (отображающим в логах полную информацию, в том числе IP адреса клиентов и других серверов) позволяет эффективно заблокировать попытки подключения и подбора пароля.
Перед началом настройки Вам необходимо установить iptables и fail2ban. Кроме того, iptables должен быть уже настроен (и разрешать подключения к asterisk) до начала настройки fail2ban! Прочитать, как настроить iptables можно здесь: настройка iptables для работы asterisk. Вы также можете установить fail2ban до установки самого asterisk, и в этом случае (по крайней мере, теоретически) в процессе установки последние версии asterisk обнаруживают установленный fail2ban и настраивают его автоматически. Однако:
- Не всегда вопрос безопасности IP-телефонии рассматривается до установки asterisk. То есть скорее всего, Вы захотите установить fail2ban на систему с уже установленным (и настроенным) астериском.
- Не во всех случаях автоматическое конфигурирование срабатывает вообще, не говоря уже о том, чтобы оно сработало правильно (и начало блокировать все атаки на asterisk).
Настройкаизоляторовдля
Теперьнамнеобходимосоздатьописаниятакназываемых»изоляторов»дляте»привязать»нашифильтрыкобъяснитьвкакихфайлахэтистрокиискатьичтопотомделать
Дляэтогооткройтефайл
- УбедитесьчтонетилиневключенодругихправилсвязанныхсДляэтогодостаточносделатьпоискпофайлупоимени»»безкавычекиубедитьсячтоеслитакиеправилаестьдлякаждогоизнихсвойствоустановленов
- ВслучаеесливерсияменьшейлибоВынехотитеиспользоватьлогииспользованиелоговкрайнерекомендуетсятоВамдостаточнобудетсоздатьтолькоодноправилоВпротивномслучаеВампонадобитсясоздатьправила
Правило№
ЭтоправилонеобходимосоздатьдлявсехверсийВыможетесоздатьновоеправилоилимодифицироватьлюбоеизужеимеющихсяноотключенныхНовоеправилопосколькувнашемпримереиспользуетсявсвязкесбудетназыватьсяибудетприменятьсякфайлувкоторомсохраняютсявсеосновныевидысобытийастериска ПоумолчаниювастерискеэтотосновнойфайллоговназываетсянонапримервэтобудетфайлподназваниемкакназываетсяфайлуВассмнастройкиастерискавфайлеИтаксамоправило
настраиваемизоляторыдляосновныхсобытийправиловключенофильтркоторымбудетпользоватьсяправилоназываетсяназваниефильтраэтоимяфайлавкаталогеккакомуфайлулогамастерискаприменятьфильтрдляпоискапотенциальноопасныхсобытийколичествопотенциальноопасныхсобытийнайденныхфильтромдлясрабатываниядействиянакакойпериодвременивсекундахприменятьдействиезакакойпериодвременивсекундахискатьвпотенциальноопасныесобытиячтоделатьеслифильтробнаружилатакузапериодсекундвлогахобнаруженопотенциальноопасныхдействийсодногоадресаблокируемвсепортыдляэтогоипосылаемписьмодлясписокадресовподсетейдлякоторыхвсепотенциальноопасныесобытияигнорируются
Правило№
ЭтоправилобудетработатьтольковслучаеесливерсияилиновееатакжеесливключеноведениелоговсмвышеВытакжеможетесоздатьновоеправилоилимодифицироватьлюбоеизужеимеющихсяноотключенныхНовоеправилопосколькувнашемпримереиспользуетсявсвязкесбудетназыватьсяиэтоправилобудетиспользоватьдляанализафайлвкаталогелоговастериска
настраиваемизоляторыдлясобытийбезопасностиправиловключенофильтркоторымбудетпользоватьсяправилоназываетсяназваниефильтраэтоимяфайлавкаталогеккакомуфайлулогамастерискаприменятьфильтрдляпоискапотенциальноопасныхсобытийколичествопотенциальноопасныхсобытийнайденныхфильтромдлясрабатываниядействиянакакойпериодвременивсекундахприменятьдействиезакакойпериодвременивсекундахискатьвпотенциальноопасныесобытиячтоделатьеслифильтробнаружилатакузапериодсекундвлогахобнаруженопотенциальноопасныхдействийсодногоадресаблокируемвсепортыдляэтогоипосылаемписьмодлясписокадресовподсетейдлякоторыхвсепотенциальноопасныесобытияигнорируются
Настройка
Процесс настройки fail2ban не зависит от дистрибутива Linux.
Основной конфигурационный файл находится в каталоге . Однако, его не рекомендуется менять и для настройки используют подключаемые файлы из каталога .
Существующие фильтры лежат в директории . Можно изменять существующие фильтры или на их основе делать собственные.
Существующие правила реагирования хранятся в директории .
Как правило, все стандартные файлы содержат подробные комментарии.
Действия
Файлы с настройкой действий находятся в каталоге .
Остановимся на описании самых используемых действий:
- iptables — создание простого правила в netfilter с помощью одноименной утилиты;
- iptables-multiport — использование модуля multiports, позволяющий добавлять диапазоны портов для блокировки;
- iptables-ipset — использование ipset для придания более лаконичного вида правилам;
- iptables-allports — блокирует для адреса все порты.
Фильтры
Фильтры, в основном, представляют набор регулярных выражений для поиска ключевых слов в log-файлах. Они находятся в каталоге .
Для создания и настройки своих фильтров, можно использовать имеющиеся файлы в качестве шаблона.
Файлы с фильтрами должны иметь расширение . В дальнейшем использовать указанный фильтр можно, обратившись к нему в правиле по имени файла без расширения.
Например, чтобы использовать фильтр в правиле надо указать:
filter = my
Указание параметров на примере
Для нового правила необходимо создать конфигурационный файл в каталоге /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 ignoreip = 127.0.0.1/8
Разберем параметры:
- ssh — название для правила.
- enabled позволяет быстро включать (true) или отключать (false) правило;
- port — порт целевого сервиса. Принимается буквенное или цифирное обозначение.
- filter — фильтр (критерий поиска), который будет использоваться для поиска подозрительных действий. По сути, это имя файла из каталога без на конце.
- action — действие, совершаемое в случае срабатывания правила. В квадратных скобках указаны название для правила, сетевой порт и протокол для блокирования.
- logpath — расположение лог-файла, в котором фильтр будет искать подозрительную активность на основе описанных критериев.
- maxretry — количество действий, которые разрешено совершить до блокировки.
- findtime — время в секундах, в течение которого учитывается maxretry.
- bantime — время, на которое будет блокироваться IP-адрес.
- ignoreip — игнорировать защиту, если запросы приходят с перечисленных адресов.
Если какой-то из параметров не указан в конкретном правиле, для него берется значение по умолчанию, описанное в правиле DEFAULT.
Примечание: Для применения новые правил необходимо перезапустить fail2ban одной из следующих команд:
$ systemctl restart fail2ban
или
$ service fail2ban restart
Проверкаработы
ГлавноевпроцессепроверкииметьподрукойдругойкомпьютерилилокальныйдоступксерверучтобывслучаекогдазаблокируетВашадресВысмоглиподключитьсяиудалитьэтублокировку
НеобходимообязательнопроверитьработусвязкипосколькудажееслиВывсенастроилиилископировалиправильновозможномножествокомбинацийсобытийврезультатекоторыхнастренныеВамиблокировкиработатьнебудут
Последовательностьдействийдляпроверкиработысвязки
УбедитесьчтоуВаснастроензапускипристартекомпьютера
ЕслиВынастроилиправиладлянастоятельнорекомендуемпроверитьработукаждогоизнихпоотдельностиДляэтогоотключитеодноизправилнапример
перезагрузитекомпьютерипроверьтечтослужбыизапущены
одноизправилвключеноадругоевыключеноПриэтомдлявыключенногоправилапоявитсясообщениеадлявключенногосообщениевида
ЗапуститеклиентобязательнонессамогосервераасдругогокомпьютераиуказавневерныеданныедляавторизацииадресдляподключениядолженбытьадресомсерверапопробуйтеавторизоватьсяразаилиболееколичествоавторизацийпослекоторыхадресблокируетсязадаетсявпараметредлякаждогоправилаотдельноВкачестветестовогоклиентаможноиспользоватьпрограммукотораяработаетизкоманднойстроки
ЕслиВызапустиликлиентастогожекомпьютераскоторогоподключалиськсерверуиеслибылинастроеныправильнотонаданныймоментВашадресзаблокированиВынеможетеподключитьсяксерверусэтогокомпьютерапроверьтеэтоПодключитеськсдругогокомпьютераилилокальноипродолжайтевыполнениекоманд
Запуститекомандувидадлявключенногоправилаиубедитесьчтоадресскоторогоподключалсяклиентнаходитсявспискезаблокированных
Теперьпоаналогиисдействиямиизпунктаразблокируйтевтороеправилонапримеризаблокируйтепервое
ВыполнитедействияспунктапопункттольковместоперезагрузкикомпьютерачтотожеможносделатьдостаточноперезагрузитьслужбуПослеэтогосразуразблокируетсяадрескомпьютеранакоторомВызапускаликлиентиегоможнобудетинужнокаквпунктезапуститьещераздляпроверкиработывторогоправилаОбратитевниманиечтоможетинеразблокироватьточнееразблокироватьисновазаблокироватьвэтомслучаеВамлучшесделатьпаузусекундпослечегоещеразперезагрузитьсервис
ПослетогокакВыпроверилиработуобоихправилпоотдельностинезабудьтеобязательновключитьихобадляидляпараметрПослеэтогоразумеетсянезабудьтеперезагрузитьсервис
ИпоследнийпунктеслиВывыполнилипредыдущиепунктыдостаточнобыстровтечениенесколькихминуттоможетоказатьсячтопослевключенияобоихправилипоследующейперезагрузкиуВассновазаблокируетсяадресскоторогоВызапускаликлиентаБудьтевнимательны