Введение
Любая служба, видимая в сети, является потенциальной целью для злоумышленников. Будь то сервер доступный по ssh или сервер телефонии asterisk, или любое другое приложение имеющее выход в публичный интернет. Если вы внимательно читаете журналы приложений этих служб, вы можете увидеть повторяющиеся систематические попытки входа в систему, которые представляют собой попытки bruteforce-атак пользователей или ботов.
Служба Fail2ban может помочь в решении этой проблемы, создавая правила, автоматически изменяющие конфигурацию брандмауэра iptables. Это позволит серверу реагировать на попытки несанкционированного доступа без вашего вмешательства. В терминах Fail2ban такая комбинация фильтрации и действий называется “тюрьмой” (jail). Названо так, потому, что ip адрес блокируется на определенное время, как бы сажается в тюрьму.
В данном руководстве мы рассмотрим установку и использование Fail2ban на примере сервера с CentOS 7. В примере настроим блокировку попыток взлома сервера по ssh
Конфигурация 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–файл .
WordPress и Fail2ban
Для того, чтобы fail2ban мог понять, что произошла неудачная попытка авторизации в WordPress, нам необходимо об этом явно сообщить со стороны самого WordPress. Сделать мы это можем с помощью простого плагина:
/** * Plugin Name: Return 403 on Failed Login */ function my_login_failed_403() { status_header( 403 ); } add_action( 'wp_login_failed', 'my_login_failed_403' );
По умолчанию WordPress использует HTTP код 200, даже при неудачных попытках авторизации, поэтому глядя на журнал доступа веб-сервера Apache или nginx, сложно сказать была ли попытка успешной. С помощью нашего простого плагина, мы используем код 403 для указания неуспешных попыток входа в WordPress.
После активации плагина убедитесь в том, что он действительно работает. Сделать это можно посмотрев на логи доступа вашего веб-сервера, например в для nginx, или для веб-сервера Apache.
Фильтр fail2ban для WordPress
Создайте новый фильтр в fail2ban (в директории filter.d) и назовите его wordpress-auth.conf. Данный фильтр будет выполнять поиск на 403 статус при доступе к файлам wp-login.php и xmlrpc.php в WordPress. Текст фильтра будет выглядеть следующим образом:
failregex = <HOST>.*POST.*(wp-login\.php|xmlrpc\.php).* 403
Данные регулярное выражение подойдет для лог-файлов Apache и nginx по умолчанию. Если вы изменили формат журнала вашего веб-сервера, вам придется изменить и регулярное выражение.
Настройка jail.conf
Новый фильтр wordpress-auth.conf легко использовать в файле конфигурации jail.conf. Добавьте следующий код в конец файла:
enabled = true port = http,https filter = wordpress-auth logpath = /var/log/nginx/access.log maxretry = 3 bantime = 3600
Здесь мы указываем путь к лог-файлу нашего веб-сервера, максимальное количество количество неудачных попыток авторизации, и время на которые IP адрес будет заблокирован (действие по умолчанию).
После внесения изменений в конфигурацию, перезапустите сервис fail2ban и смотрите его в действии в /var/log/fail2ban.log:
$ sudo service fail2ban restart $ sudo tail -f /var/log/fail2ban.log 2014-01-22 16:10:44,818 fail2ban.actions: WARNING Ban 115.230.126.74 2014-01-22 17:29:16,103 fail2ban.actions: WARNING Ban 185.24.218.83 2014-01-22 18:53:02,819 fail2ban.actions: WARNING Ban 222.186.62.71 ...
Если вы решили протестировать fail2ban на себе, не забудьте установить низкое значение параметра , например 60 для блокировки доступа на одну минуту.
Учтите, что поскольку утилита fail2ban осуществляет поиск и блокировку по IP адресу, она не поможет в случае направленной атаки с большого количества разных IP-адресов. В таком случае вам необходимы другие меры защиты, например двойная аутентификация с помощью Google Authenticator. Подробности в нашей статье.
Наконец, стоит отметить, что после установки fail2ban вам уже доступны разные фильтры для отслеживания доступа по SSH, FTP и т.д. Их легко включить и настроить в файле jail.conf.
Шаг 5. Проверка настроек
Этот шаг не является обязательным, но всё же имеет смысл проверить, что всё работает как было задумано. Посмотреть полный список правил, которыми руководствуется программа при мониторинге активности можно с помощью команды
sudo iptables –L
Также для выполнения проверки достаточно несколько раз ввести неправильный пароль при авторизации и убедиться, что дальнейшие запросы от вас не обрабатываются
Следует обратить внимание на следующее:
желательно проверку производить не с того же IP, с которого осуществляете настройку (чтобы иметь возможность разбанить себя и отредактировать конфиг).
для проверки время бана лучше выставить поменьше.
необходимо убедиться, что IP, с которого производится проверка, не был указан в ignoreip.
важно знать, как удалить IP-адрес из чёрного списка:
sudo fail2ban-client set SECTION unbanip IP
где SECTION — название секции в конфигурационном файле, в соответствии с правилами которой IP был заблокирован, а IP — адрес, который требуется разблокировать. В нашем случае команда выглядит так:
sudo fail2ban-client set sshd unbanip XXX.XXX.XXX.XXX
Итак, пробуем: для теста я поставил maxretry = 2, bantime = 600, то есть при двух ошибках мой IP-адрес будет заблокирован на 10 минут.
$ ssh [email protected]@95.213.195.80's password: Permission denied, please try [email protected]'s password:
После второй попытки консоль пару минут ожидала ответа от сервера, но в итоге соединение было разорвано. Дальнейшие попытки соединения в течение 10 минут отклонялись на стороне сервера ещё до запроса пароля, как и ожидалось:
$ ssh [email protected]: connect to host 95.213.195.80 port 22: Connection refused
Долговременный бан для тупых ботов
Например, по умолчанию боты, которые пытаются сломать SSH – блокируются на 10 мин (со временем обнаружения 10 мин и 5 попытками).
Потом netfilter выводит их из бана. Результат ниже.
Через 1 минуту после снятия блокировки бот занялся подбором…
Нехорошо. Как с этим бороться?
Можно увеличить сразу время бана для таких ботов. А можно пойти другим путем.
У fail2ban есть же свой лог
tail -f /var/log/fail2ban.log
/var/log/fail2ban.log – вот этот его собственный лог мы еще раз отдадим на анализ в fail2ban:
- три попадания IP в бан
- период – сутки
- бан для такого IP – на месяц
в результате совсем “тупые” боты будут блокированы на 30 дней.
пишем фильтр fail2ban_f.conf:
- первое выражение regex ищет IP-адреса, которые получили Ban
- второе выражение regex исключает из списка баны, полученные уже правилом {fail2ban}
failregex = ^.*?fail2ban\.actions.*?Ban\s+<HOST>$ ignoreregex = ^.*?fail2ban\.actions.*?\\sBan
и джайл fail2ban_d.conf
enabled = true filter = fail2ban_f # block all ports action = iptables-allports logpath = /var/log/fail2ban.log maxretry = 3 # 1 day findtime = 86400 # 30 days bantime = 2592000
Проверяем и запускаем.
ВАЖНО
При ограниченных ресурсах VPS возможно получение ошибок вида “iptables: Memory allocation problem”. Это желающих сломать (например SSH) больше, чем место под правила блокировок в iptables
Т.е. работает такой себе хороший ботнет с большим количеством IP.
Смотрим:
cat /proc/user_beancounters
Параметр numiptent определяет количество правил iptables, которые мы можем создать. Колонка held показывает текущее значение. Колонка maxheld показывает максимальное пиковое значение. Колонки barrier и limit должны совпадать и определяют максимально доступное для нас значение. Колонка failcnt содержит число ошибочных обращений. Если оно содержит не 0, возможно, выделенных нам ресурсов уже не хватает. Когда held=limit и возникает упомянутое выше сообщение. В этом случае можно написать хостеру тикет с просьбой увеличить значение numiptent.
Но результат работы jail того стоит, 30 дней побудут в бане
Структура конфигурационных файлов
Файлы настроек находятся в каталоге /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.
How to Use the Fail2ban Client
Fail2ban gives you a command , and you can utilize this for running Fail2ban from the command line:
-
: For starting the Fail2ban server and jails.
-
: To reload the Fail2ban configuration files.
-
: For switching with a Fail2ban jail’s name; this causes the jail to reload.
-
: To terminate the server.
-
: For displaying the server status and enabling jails.
-
: For displaying the jail status, including IPs that are banned currently.
If you wanted to check that the Fail2Ban is operating and the SSHd jail has been enabled, for example, you would run:
The output would be:
You can find more on commands in the Fail2ban wiki.
What’s ‘fail2ban-client’ and ‘Fail2ban Jail’?
These are the 2 terms that we use frequently in this article.
So, before going into the details, let’s start with these terms.
fail2ban-client
Fail2ban scans server logs and ban IPs that show malicious signs like too many password failures, exploits, etc.
Server owners can run Fail2ban from command line using the command fail2ban-client.
For example, you can enter Fail2ban commands like this:
Fail2ban Jails
A Fail2ban jail is a combination of a filter and actions.
Filter contains mainly regular expressions which are used to detect break-in attempts, password failures, etc.
And, Action define commands that are executed when the filter catches an abusive IP address.
In most of the servers, there are pre-configured jails for hosting services like web server, mail server, FTP, and so on.
Now, let’s see how our Server Support Engineers identify and unban an IP in Fail2ban.
WordPress и Fail2ban
Для того, чтобы fail2ban мог понять, что произошла неудачная попытка авторизации в WordPress, нам необходимо об этом явно сообщить со стороны самого WordPress. Сделать мы это можем с помощью простого плагина:
/** * Plugin Name: Return 403 on Failed Login */ function my_login_failed_403() { status_header( 403 ); } add_action( 'wp_login_failed', 'my_login_failed_403' );
По умолчанию WordPress использует HTTP код 200, даже при неудачных попытках авторизации, поэтому глядя на журнал доступа веб-сервера Apache или nginx, сложно сказать была ли попытка успешной. С помощью нашего простого плагина, мы используем код 403 для указания неуспешных попыток входа в WordPress.
После активации плагина убедитесь в том, что он действительно работает. Сделать это можно посмотрев на логи доступа вашего веб-сервера, например в для nginx, или для веб-сервера Apache.
Фильтр fail2ban для WordPress
Создайте новый фильтр в fail2ban (в директории filter.d) и назовите его wordpress-auth.conf. Данный фильтр будет выполнять поиск на 403 статус при доступе к файлам wp-login.php и xmlrpc.php в WordPress. Текст фильтра будет выглядеть следующим образом:
failregex = <HOST>.*POST.*(wp-login\.php|xmlrpc\.php).* 403
Данные регулярное выражение подойдет для лог-файлов Apache и nginx по умолчанию. Если вы изменили формат журнала вашего веб-сервера, вам придется изменить и регулярное выражение.
Настройка jail.conf
Новый фильтр wordpress-auth.conf легко использовать в файле конфигурации jail.conf. Добавьте следующий код в конец файла:
enabled = true port = http,https filter = wordpress-auth logpath = /var/log/nginx/access.log maxretry = 3 bantime = 3600
Здесь мы указываем путь к лог-файлу нашего веб-сервера, максимальное количество количество неудачных попыток авторизации, и время на которые IP адрес будет заблокирован (действие по умолчанию).
После внесения изменений в конфигурацию, перезапустите сервис fail2ban и смотрите его в действии в /var/log/fail2ban.log:
$ sudo service fail2ban restart $ sudo tail -f /var/log/fail2ban.log 2014-01-22 16:10:44,818 fail2ban.actions: WARNING Ban 115.230.126.74 2014-01-22 17:29:16,103 fail2ban.actions: WARNING Ban 185.24.218.83 2014-01-22 18:53:02,819 fail2ban.actions: WARNING Ban 222.186.62.71 ...
Если вы решили протестировать fail2ban на себе, не забудьте установить низкое значение параметра , например 60 для блокировки доступа на одну минуту.
Учтите, что поскольку утилита fail2ban осуществляет поиск и блокировку по IP адресу, она не поможет в случае направленной атаки с большого количества разных IP-адресов. В таком случае вам необходимы другие меры защиты, например двойная аутентификация с помощью Google Authenticator. Подробности в нашей статье.
Наконец, стоит отметить, что после установки fail2ban вам уже доступны разные фильтры для отслеживания доступа по SSH, FTP и т.д. Их легко включить и настроить в файле jail.conf.
Как работает 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.
Step 2 — Applying the WordPress Filter to Fail2ban
This WordPress plugin includes a new custom Fail2ban filter. In this step, we will install that filter so Fail2ban can correctly parse and use the authentication logs being sent to the syslog.
First, move the filter from the WordPress plugin directory to the appropriate Fail2ban filter location. We will use the “hard” WordPress filter for better protection:
With your new filter in place, you can point Fail2ban to the appropriate authentication log by editing the file . A jail in Fail2ban refers to a series of rules and actions that provide the filters for IP addresses.
Open the file using nano or your favorite text editor.
Once the file is open, scroll to the bottom and append the following lines to the end. These lines enable the plugin, set the filter to the filter we previously copied over to the directory, set the appropriate logging destination for the access attempts, and specify that this traffic will come in on and ports.
Save and close the file.
Next, you can restart Fail2ban to ensure the new filter is now in place by running this command in your terminal:
Скринкаст: Fail2Ban 0.9.x в Ubuntu 16.04
В скринкасте показана установка, настройка Fail2Ban версии 0.9.x, особенности конфигурации новой версии, структура конфигурационных файлов и фильтров, регулярные выражения фильтров и их изменение на примере mysqld-auth фильтра, настройка и включение пользовательских правил-jails sshd и apache-auth, переопределение настроек по умолчанию, bantime, findtime, maxretry, enabled, тестирование работы apache-auth jail, перезапуск Fail2Ban, просмотр включенных jails и детальной информации по ним, блокировка ip клиента при http авторизации, просмотр заблокированных/забаненных ip, разблокировка забаненных ip адресов, тестирование регулярных выражений фильтров Fail2Ban.
Смотреть на YouTube скринкаст: Fail2Ban 0.9.x в Ubuntu 16.04
Содержание скринкаста:
- Назначение программы Fail2Ban 0.9.x — 00:30
- Установка Fail2Ban в Ubuntu server 16.04 — 01:23
- Настройка Fail2Ban и ее особенности в версии 0.9.x — 01:45
- Настройка и активация пользовательских правил-jails для sshd и apache-auth — 10:08
- Настройка HTTP авторизации для Apache в Ubuntu server 16.04 — 12:00
- Тестирование работы apache-auth jail — 14:36
- Перезапуск Fail2Ban и просмотр включенных jails — 15:05
- Просмотр детальной информации по apache-auth jail — 16:26
- Блокирование клиента при ошибках HTTP авторизации — 17:05
- Просмотр информации о блокированных ip для apache-auth jail — 17:35
- Разблокировка забаненных Fail2Ban ip — 18:03
- Тестирование регулярных выражений Fail2Ban фильтров — 19:22
- Ссылка на подробное описание Fail2Ban — 21:03
Changelog
4.3.0.9
- Fix incorrect constant for disabling last messages (h/t @kermina).
- Fix false positive with blocking user enumeration when a Contributor tries to list posts by another user.
- Fix index issue with ancient versions of MySQL.
- Fix harmless warning with a defined but empty (h/t @stevegrunwell).
- Backport new Block event class.
- Update Freemius library.
4.3.0.8
Workaround issue with user enumeration blocking being triggered by Gutenberg pre-loading Author list. (h/t @brrrrrrrt)
4.3.0.7
- Finish refactoring to allow inclusion of constants in (h/t @iCounsellor).
- Fix MaxMind database update.
4.3.0.5
- Fix empty username detection for multisite.
- Fix harmless warning when activating new multisite install.
- Fix esoteric edge-case where is loaded via a script run from the CLI in a directory with a file.
4.3.0.4 “Columbo”
- Add new dashboard widget: last 5 messages.
- Add full multisite support.
- Add username login blocking (force login with email).
- Add separate logging for login attempts with an empty username.
- Improve user enumeration blocking compatibility with the WordPress block editor (Gutenberg).
- Bump the minimum PHP version to 5.6.
4.2.8
- Add link to new support forum.
- Fix user enumeration conflict with Gutenberg (h/t @dinghy).
- Fix notices wrt admin menu (h/t @marioivangf).
- Fix harmless XDebug notice (h/t @dinghy).
- Update Freemius library.
4.2.6
- Add support for Remote Tools add-on.
- Add support for the new ClassicPress security page.
- Improved user enumeration blocking.
4.2.5
- Properly fix PHP 5.3 support; tested on CentOS 6. Does not support any UI or Premium features.
- Fix potential issue with if calling REST API or XMLRPC from admin area.
4.2.4
- Add filter for login failed message.
- Fix logging spam comments from admin area.
- Fix Settings link from Plugins page.
- Update Freemius library
4.2.3
- Workaround for some versions of PHP 7.x that would cause s to be ignored.
- Add config note to settings tabs.
- Fix documentation links.
4.2.1
- Completed support for .
- Add support for 3rd-party plugins; see Developers.
- Add-on for Contact Form 7 (experimental).
- Add-on for Gravity Forms (experimental).
- Change logging for known-user with incorrect password; previously logged as unknown user and matched by filters (due to limitations in older versions of WordPress), now logged as known user and matched by .
- Bugfix for email-as-username – now logged correctly and matched by , not , filters.
- Bugfix for regression in code to prevent Free/Premium conflict.
4.0.1
- Add extra features via Freemius. This is entirely optional. WPf2b works as before, including new features listed here.
- Add settings summary page (Settings -> WP fail2ban).
- Add .
- Add .
- Add – enable logging for attempted comments on posts which are:
- not found,
- closed for commenting,
- in the trash,
- drafts,
- password protected
- Block user enumeration via REST API.
3.6.0
- The filter files are now generated from PHPDoc in the code. There were too many times when the filters were out of sync with the code (programmer error) – this should resolve that by bringing the patterns closer to the code that emits them.
- Added PHPUnit tests. Almost 100% code coverage, with the exception of which is quite hard to test properly.
- Bugfix for .
- Add .
- Add .
- now supports an array of IPs with PHP 7.
- Moved all documentation to https://docs.wp-fail2ban.com/.
2.0.0
- Add experimental support for X-Forwarded-For header; see .
- Add experimental support for regex-based login blocking; see .
Защита 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-сервера или его полной неработоспособности.
Работа со списком заблокированных адресов
Просмотр
Получить статистику заблокированных адресов можно следующей командой:
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
Fail2ban использует концепцию тюрем. Тюрьма описывает службу и включает фильтры и действия. Записи журнала, соответствующие шаблону поиска, подсчитываются, и при выполнении заранее определенного условия выполняются соответствующие действия.
Fail2ban поставляется с несколькими тюрьмами для различных сервисов. Вы также можете создавать свои собственные конфигурации тюрьмы.
По умолчанию включен только ssh jail. Для включения jail вам нужно добавить enabled = true после заголовка jail. В следующем примере показано, как включить jail в proftpd:
/etc/fail2ban/jail.local
port = ftp,ftp-data,ftps,ftps-data logpath = %(proftpd_log)s backend = %(proftpd_backend)s
Параметры, которые мы обсуждали в предыдущем разделе, могут быть установлены для каждой тюрьмы. Вот пример:
/etc/fail2ban/jail.local
enabled = true maxretry = 3 findtime = 1d bantime = 4w ignoreip = 127.0.0.1/8 23.34.45.56
Фильтры расположены в каталоге /etc/fail2ban/filter.d, хранящемся в файле с тем же именем, что и тюрьма. Если у вас есть индивидуальная настройка и опыт работы с регулярными выражениями, вы можете точно настроить фильтры.
Каждый раз, когда вы редактируете файл конфигурации, вам необходимо перезапускать сервис Fail2ban, чтобы изменения вступили в силу:
sudo systemctl restart fail2ban
Разблокировка 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, в него также пишутся попытки авторизации.
Забанить IP-адрес навсегда в fail2ban
Вы также можете навсегда заблокировать исходный IP-адрес в fail2ban. Для этого выполните следующие действия:
1. Если вы уже создали файл jail.local , то можете оставить этот шаг. Создайте файл jail.local с помощью этой команды в Терминале:
$ sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
Теперь файл конфигурации jail.local создан.
2. Теперь, чтобы навсегда заблокировать IP-адреса, вам нужно будет изменить значение параметра bantime на -1. Для этого сначала отредактируйте файл конфигурации jail.local следующим образом:
$ sudo nano /etc/fail2ban/jail.local
3. Теперь, чтобы навсегда заблокировать IP-адреса, измените существующее значение параметра bantime на -1.
Затем сохраните и выйдите из файла jail.local.
4. Перезапустите службу fail2ban следующим образом:
$ sudo systemctl restart fail2ban
После этого IP-адреса, которые сделали определенное количество неудачных попыток подключения, будут навсегда заблокированы.
Это все! В этом посте описывается, как изменить время блокировки или навсегда заблокировать исходный IP-адрес, совершающий неправильные попытки аутентификации с помощью fail2ban.
Главный конфигурационный файл Dovecot
Основные настройки Dovecot хранит в файле конфигурации (или, реже ).
Сразу делаем копию конфигурационного файла:
cp /etc/dovecot/dovecot.conf /etc/dovecot/dovecot.conf.bak
Примечение: путь к файлу может быть /etc/dovecot.conf, проверьте сначала, где у вас в системе этот файл.
Рабочий конфигурационный файл Dovecot 2.0.9 (для 2.3.11 все подходит, может, где-то и есть мелочи, но я не заметил):
# Не использую специализированные файлы из поставки Dovecot из папки /etc/dovecot/conf.d/. # Основная причина: сравнительно небольшой размер всего конфига (все перед глазами, нет необходимости раскидывать по отдельным файлам). #!include conf.d/*.conf # Нет необходимости явно указывать imaps и pop3s - Dovecot 2.* по-умолчанию их включает. protocols = imap pop3 listen = * # Завершать все дочерние процессы, если завершен мастер-процесс shutdown_clients = yes # Владелец почтовых папок (также см. конфиг Postfix): mail_uid = vmail mail_gid = vmail # Только наш пользователь с uid и gid 5000 (vmail) может быть использован. first_valid_uid = 5000 last_valid_uid = 5000 # Лог-файлы. Подробнее: http://wiki2.dovecot.org/Logging log_path = /var/log/dovecot.log # Отладка. Если все настроено, отключаем (no) # http://maint.unona.ru/doc/dovecot2.shtml mail_debug = no auth_verbose = no auth_debug = no auth_debug_passwords = no # SSL # http://wiki2.dovecot.org/SSL/DovecotConfiguration ssl = required ssl_cert = </etc/pki/dovecot/certs/server.crt ssl_key = </etc/pki/dovecot/private/server.key ssl_protocols = TLSv1.1 TLSv1.2 TLSv1.3 !SSLv2 !SSLv3 ssl_cipher_list = ALL:!LOW:!SSLv2:!EXP:!aNULL # Запрет аутентификации открытым текстом. yes - запретить, no - разрешить. disable_plaintext_auth = yes # Список разрешенных символов в имене пользователя. auth_username_chars = abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890.-_@ # Расположение и формат файлов почты (%d - домен, %n - имя пользователя). mail_location = maildir:/var/vmail/%d/%n # Если при аутентификации не указан домен, то добавить этот (в данном примере - пустой) auth_default_realm = # Доступные варианты аутентификации (PLAIN, DIGEST-MD5, CRAM-MD5...). # Для того, чтобы иметь меньше головной боли ставьте PLAIN auth_mechanisms = PLAIN # Приветственное сообщение login_greeting = POP3/IMAP server ready. # Одно из самых важных мест - предоставление сокетов для аутентификации пользователей. # Если настроено неверно - ничего работать не будет! service auth { # http://maint.unona.ru/doc/dovecot2.shtml # Указывает, что данный сокет будет использовать SMTP сервер для аутентификации. # Указывается пользователь, группа и права доступа к сокету. В данном случае это postfix # ("mail_owner = postfix" в файле /etc/postfix/main.cf). unix_listener /var/spool/postfix/private/auth { user = postfix group = postfix mode = 0660 } unix_listener auth-master { user = vmail group = vmail mode = 0660 } unix_listener auth-userdb { user = vmail group = vmail mode = 0660 } } # Запрос параметров виртуальных почтовых пользователей # (логин, пароль, домен, активный/неактивный и др.) userdb { args = /etc/dovecot/dovecot-mysql.conf driver = sql } passdb { args = /etc/dovecot/dovecot-mysql.conf driver = sql } # Plugins protocol imap { imap_client_workarounds = delay-newmail tb-extra-mailbox-sep mail_plugins = autocreate } protocol pop3 { pop3_client_workarounds = outlook-no-nuls oe-ns-eoh pop3_uidl_format = %08Xu%08Xv } protocol lda { # Куда будут перенаправлены недоставленные письма postmaster_address = postmaster@localhost auth_socket_path = /var/run/dovecot/auth-master } plugin { auth_socket_path = /var/run/dovecot/auth-master # Plugin: autocreate. Создаем и подписываемся на папки IMAP. autocreate = INBOX autocreate2 = Sent autocreate3 = Trash autocreate4 = Drafts autocreate5 = Junk autosubscribe = INBOX autosubscribe2 = Sent autosubscribe3 = Trash autosubscribe4 = Drafts autosubscribe5 = Junk # Plugin: квоты. Пока отключим. # http://wiki2.dovecot.org/Quota/Configuration #quota = maildir:User quota #quota_rule = *:storage=1GB #quota_rule2 = Trash:storage=+10%% # 10% of 1GB = 100MB #quota_rule3 = Junk:storage=+10%% # 10% of 1GB = 100MB #quota_rule4 = Drafts:storage=+10%% # 10% of 1GB = 100MB }