
Установка Fail2ban
Fail2ban — это утилита , которая отслеживает в log-гах(например, /var/log/apache/error_log) все попытки обратится к серверам , таким, как SMTP, SSH, FTP, HTTP и другим, и если находит постоянно повторяющиеся неудачные попытки авторизации с одного и того же IP-адреса или хоста, fail2ban блокирует дальнейшие попытки с этого IP-адреса/хоста, с помощью правила iptables(ipfw) или host.deny.
Fail2ban защитит компьютер от атак грубой силы, который написанный на языке Python. Данная программа способна работать в системах POSIX, которые имеют интерфейс к системе или установленный брандмауэр локально, например, Iptables или TCP Wrapper.
Установка Fail2ban на разные ОС
Из коробки fail2ban поставляется с фильтрами для различных сервисов ( Apache, Lighttpd, sshd, vsftpd, qmail и другие).
Чтобы произвести установку на Debian/Ubuntu/Mint и другие дебиано-подобные ОС:
Чтобы произвести установку на CentOS/RedHat/Fedora:
Настройка Fail2ban
Fail2ban имеет следующую структуру файлов:
<img aria-describedby= >структура файлов fail2ban
Как только установили программу, нужно ее немного настроить, нужно будет выставить правила блокировки для всех сервисах (все шаблоны уже имеются в установленном пакете). По умолчанию файл конфигурации fail2ban расположен /etc/fail2ban/jail.conf, но желательно не править в нем ничего (можно повредить что то), по этому, скопируем данный файл и в нем уже будем работать:
#·sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
# vim /etc/fail2ban/jail.local
Находим раздел [DEFAULT], в нем содержатся все настройки для блокировки по-умолчанию.
[DEFAULT]
ignoreip = 104.28.21.6 #можно даже маску, домен...
bantime = 1800 #30 минут
maxretry = 4 #4 попытки
backend = auto
destemail = vitaliy.natarov@yahoo.com #мой email-адресс
[...]
[...]
# ACTIONS
banaction = iptables-multiport
mta = sendmail
protocol = tcp
[...]
Рассмотрю следующие параметры:
-
ignoreip — эта переменная отвечает за IP-адрес который не будет блокироваться в любом случае. Можно указать IP, CIDR-маску, домен или же имя DNS-хоста;
-
bantime — это переменная отвечает за время (секунды) -это время на которое будет производится блокировка доступа;
-
maxretry — эта переменная отвечает за количество неудачных авторизаций (их количество), если привысит заданное количество,то хост заблокируеться на bantime секунд;
-
destemail — эта переменная отвечающая за email-адрес, на который будут пересылаться все сообщение о блокировании хостов.
-
Banaction — описывает шаги, которые fail2ban будет запрещать. Запрет по умолчанию описывается в «iptables-multiport» и его можно найти в /etc/fail2ban/action.d/iptables-multiport.conf;
-
MTA относится к почтовой программе и указывает fail2ban что будет использовать для отправки электронных писем;
-
protocol — Вы можете изменить протокол с TCP на UDP в этой линии, а, в зависимости от которого что вы хотите контролировать в fail2ban.
В этом файле конфигурируются настройки для многих сервисов, Вы их можете настроить под свои нужды.
Блокировка доступа к SSH
За блокировку доступа к SSH отвечает секция [ssh], находим ее и вносим изменения:
[SSH]
enabled = true·# активируем данное правило ( включаем его).
port = ssh·# указываем·порт, он·будет заблокирован для хоста
filter = sshd·# файл-фильтр с правилами для блокировки·который используется·для этого·правила
logpath = /var/log/auth.log·# путь где будет лежать наш log-файл
maxretry = 4 # задаем количество попыток ввода пароля, после чего·хост будет заблокирован на bantime секунд (по-умолчанию берется·из переменной bantime в·секции·[DEFAULT]).
Все параметры которые указаны по-умолчанию в указанных в секциях в [DEFAULT] мы можем переопределять для каждой службы.
Fail2ban с Dovecot
Создаем фильтр-файл:
# vim /etc/fail2ban/filter.d/dovecot-pop3imap.conf
[Definition]
failregex = (?: pop3-login|imap-login): (?:Authentication failure|Aborted login (auth failed|Aborted login (tried to use disabled|Disconnected (auth failed).*rip=(?P<host>S*),.*
ignoreregex =
И розрещаем в основном конфиге:
# vim /etc/fail2ban/jail.local
[dovecot-pop3imap]
enabled = true
filter = dovecot-pop3imap
action = iptables-multiport[name=dovecot-pop3imap, port="pop3,imap", protocol=tcp]
logpath = /var/log/maillog
maxretry =·30
findtime = 1300
bantime =·1800
Еще кое что для почты
[dovecot-iptables]
enabled = true
filter = dovecot
action = iptables-multiport[name=DCOT, port="pop3,pop3s,imap,imaps", protocol=tcp]
logpath = /var/log/maillog
findtime = 600
maxretry =·4
bantime = 3600
[postfix-iptables]
enabled = true
filter = postfix
action = iptables-multiport[name=PFIX, port="smtp,smtps", protocol=tcp]
logpath = /var/log/maillog
maxretry =·4
bantime = 3600
[sasl-iptables]
enabled = true
filter = sasl
action = iptables-multiport[name=SASL, port="smtp,smtps", protocol=tcp]
logpath = /var/log/maillog
findtime = 600
maxretry =·4
bantime = 3600
Fail2ban с использованием сервера на apache.
В этой главе я приведу примеры использования fail2ban с apache.
PHPMyAdmin.
Во-первых, давайте создадим в тюрьму (jail). Добавить текст в конец вашего Fail2ban файла jail. Как правило, это находится в /etc/fail2ban/jail.local:
# vim·/etc/fail2ban/jail.local
И вставляем:
[phpmyadmin]
enabled = true
port = http,https
filter = phpmyadmin
logpath = /var/log/apache*/*error.log
maxretry = 3
bantime = 3600
Во-вторых, давайте создадим фильтр. Создаем файл /etc/fail2ban/filter.d/phpmyadmin.conf и вставляем следующий текст:
# vim··/etc/fail2ban/filter.d/phpmyadmin.conf
[Definition]
failregex = [[]client <HOST>[]] (File does not exist|script ').*(phpMyAdmin|phpmyadmin|dbadmin|mysql|myadmin|w00t|muieblackcat|mysqladmin).*
ignoreregex =
Как то так.
Защита от DDos.
попозже.
Fail2ban с использованием сервера на nginx.
В этой главе я приведу примеры использования fail2ban с nginx.
PHPMyAdmin.
Для веб сервера nginx.
Создаем фильтр:
# vim /etc/fail2ban/filter.d/phpmyadmin.conf
[Definition]
failregex = ^<HOST> -.*"(POST /index.php).*HTTP.*"$
ignoreregex =
Добавляем данное правило в клетку:
# vim /etc/fail2ban/jail.local
#phpMyAdmin
[phpmyadmin]
enabled = true
port = http,https
filter = phpmyadmin
logpath = /var/log/nginx/pma.*.log
maxretry = 3
bantime = 3600
Ограничиваем количество запросов на IP-адреса для Nginx.
Открываем файл и вносим изменения:
# vim /etc/fail2ban/filter.d/nginx-req-limit.conf
[Definition]
failregex = limiting requests, excess:.* by zone.*client: <HOST>
ignoreregex =
Теперь открываем конфиг самого fail2ban и находим секцию [nginx-http-auth] и перед или после нее вставляем код:
# vim /etc/fail2ban/jail.local
[...]
[nginx-req-limit]
enabled = true
filter = nginx-req-limit
action = iptables-multiport[name=ReqLimit, port="http,https", protocol=tcp]
logpath = /var/log/nginx/error-*.log
findtime = 300
bantime = 2400
maxretry = 1001
[...]
Можно посмотреть лог-файл:
# tail -f /var/log/fail2ban.log
Если есть записи вида:
2015-01-10 18:35:12,575 fail2ban.actions: WARNING [nginx-req-limit] Ban 151.134.78.54
2015-02-15 20:56:55,136 fail2ban.actions: WARNING [nginx-req-limit] Ban 40.56.66.15
Вы также можете использовать fail2ban-client, чтобы выяснить, состояние конкретного джейла, используя следующую команду:
┌(captain-notes)─(✓)─(07:52 AM Fri Mar 13)
└─(/etc/fail2ban)─(12 files, 88Kb)─> fail2ban-client status nginx-req-limit
Status for the jail: nginx-req-limit
|- Filter
|· |- Currently failed: 0
|· |- Total failed: 0
|· `- File list: /var/log/nginx/error.log
`- Actions
·· |- Currently banned: 0
·· |- Total banned: 0
·· `- Banned IP list:
Отладка.
Если что-то не работает, как ожидалось, вы можете отлаживать Fail2ban и его конфигурацию.
Проверить отладку.
Запустите следующую команду для конфигурации используемой для fail2ban-server:
Debug фильтр.
Выполните следующую команду, чтобы увидеть fail2ban фильтр и узнать, работает ли он для конкретного лог-файла:
# fail2ban-regex /var/log/nginx/error.log ·/etc/fail2ban/filter.d/nginx-req-limit.conf
Результат будет содержать что-то вроде следующего (в конце):
Success, the total number of match is 861
Если есть нулевой матч, то может быть проблема с регулярными выражениями для фильтра.
Защита от DDos с fail2ban.
Создаем фильтр:
# vim·/etc/fail2ban/filter.d/nginx-dos.conf
[Definition]
# Option: failregex
# Notes.: Regexp to catch a generic call from an IP address.
# Values: TEXT
failregex = ^<HOST> -.*"(GET|POST).*HTTP.*"$
ignoreregex =
Добавляем данное правило в клетку:
# vim /etc/fail2ban/jail.local
[nginx-dos]
# Based on apache-badbots but a simple IP check (any IP requesting more than
# 240 pages in 60 seconds, or 4p/s average, is suspicious)
# Block for two full days.
enabled = true
port = http,https,8080
filter = nginx-dos
logpath = /var/log/nginx/access-*.log
findtime = 60
bantime = 172800
maxretry = 240
Вот и все =)
Еще, кое-что. Например, человек начинает нагружать сервак, то выход следующий:
# vim /etc/nginx/nginx.conf
[..]
http {
[......]
limit_conn_zone $binary_remote_addr zone=arbeit:10m;
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
[........]
}
В самом виртуальном хосте прописываем (если у Вас он тоже тут, ЧТО НЕ ЕСТЬ ХОРОШО, то добавляем его сюда):
server {
[....]
limit_req zone=one burst=3 nodelay;
limit_conn arbeit 5;
[....]
После этого сохраняемся и приступаем к созданию двух фильтров:
# vim /etc/fail2ban/filter.d/nginx-conn-limit.conf
# supports: http_limit_zone module
[Definition]
failregex = limiting connections by zone.*client: <HOST>
ignoreregex =
и создаем еще один. У меня он создан, т.к я добавил его. А вы если не добавили, то прочитайте пункт:
Ограничиваем количество запросов на IP-адреса для Nginx (что немного выше).
Включим эти фильтры в конфиг (клетку):
# vim /etc/fail2ban/jail.local
[nginx-conn-limit]
enabled = true
filter = nginx-conn-limit
action = iptables-multiport[name=ConnLimit, port="http,https", protocol=tcp]
logpath = /var/log/nginx/error-*.log
findtime = 300
bantime = 2400
maxretry = 100
Сделано! Теперь не будут наглеть некоторые люди 
PS: Необходимо по IP, исключить поисковые системы. А то будут забанены поисковые боты. 
[...]
limit_conn_zone $binary_remote_addr zone=arbeit:10m;
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
if ($http_user_agent ~ Googlebot|YandexBot|bingbot|Baiduspider) {
· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · #return 410;· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·return 200;· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·· · · }
Попозже постараюсь исправить это, нужно найти решения.
Настройка SSH
открываем:
# vim ··vim /etc/fail2ban/jail.local
[...]
[ssh-auth]
enabled = true
port = ssh
filter = ssh-auth
logpath = /var/log/auth.log
maxretry = 1
findtime = 86400
bantime = -1
[...]
Прописываем путь у лог файлу, по дефолту — это /var/log/auth.log или /var/log/secure , но на centOS7 я так и не нашел где хранит он это все дело, попозже найду и постараюсь не забыть поправить статью.
И создаем набор фильтер-правил в файле:
#·vim /etc/fail2ban/filter.d/ssh-auth.conf
Добавляем:
[Definition]
failregex = sshd.* Did not receive identification string from <HOST>$
sshd.* [<HOST>] failed - POSSIBLE BREAK-IN ATTEMPT!$
sshd.* Invalid user .* from <HOST>$
sshd.* Did not receive identification string from <HOST>$
sshd.* Failed password for .* from <HOST> port .* ssh2$
# Option: ignoreregex
# Notes : Regex to ignore. If this regex matches, the line is ignored.
# Values: TEXT
ignoreregex =
Создадим nginx-noscript.
Открываем:
# vim /etc/fail2ban/jail.local
и добавляем следующее правила:
[nginx-noscript]
enabled = true
port = http,https
filter = nginx-noscript
logpath = /var/log/nginx/error-*.log
maxretry = 1
findtime = 86400
bantime = 2592000
И создаем набор фильтер-правил в файле:
#·vim /etc/fail2ban/filter.d/nginx-noscript.conf
добавляем следующие стоки:
[Definition]
# Option: failregex
# Notes : Detection of calls to non-existing files.
# Values: TEXT
failregex = Unable to open primary script: .+, client: <HOST>
# Option: ignoreregex
# Notes : Regex to ignore. If this regex matches, the line is ignored.
# Values: TEXT
ignoreregex =
Создаем nginx-badrequests
Открываем:
# vim /etc/fail2ban/jail.local
и добавляем следующее правила:
[nginx-badrequests]
enabled = true
filter = nginx-badrequests
port = http,https
logpath = /var/log/nginx/access-*.log
maxretry = 1
findtime = 86400
bantime = 2592000
И создаем набор фильтер-правил в файле:
#·vim /etc/fail2ban/filter.d/nginx-badrequests.conf
Вставляем:
[Definition]
# Option: failregex
# Notes : Detection of 400, 403 and 444 requests.
# Values: TEXT
#
failregex = ^<HOST> - .* "(GET|POST|HEAD).*HTTP.*" 444 0 ".+" ".+"$
^<HOST> - .* "POST /wp-comments-post.php HTTP.*" 403 [0-9]{1,} ".+" ".+"$
# Option: ignoreregex
# Notes : Regex to ignore. If this regex matches, the line is ignored.
# Values: TEXT
ignoreregex =
Создаем nginx-badbots
Открываем:
# vim /etc/fail2ban/jail.local
и добавляем следующее правила:
[nginx-badbots]
enabled = true
filter = nginx-badbots
port = http,https
logpath = /var/log/nginx/access-*.log
maxretry = 2
findtime = 3600
bantime = 2592000
И создаем набор фильтер-правил в файле:
#·vim /etc/fail2ban/filter.d/nginx-badbots.conf
Вставляем:
[Definition]
# Option: failregex
# Notes : Regex to catch known spambots and software alike.
# Values: TEXT
#
failregex = ^<HOST> - .* "-" ".*(?:Sogou web spider|Baiduspider|Abonti|Pixray|CPython|Spinn3r|libwww-perl).*"$
# Option: ignoreregex
# Notes : Regex to ignore. If this regex matches, the line is ignored.
# Values: TEXT
ignoreregex =
Это означает что все хорошо настроено и работает должным образом и злоумышленники попадают прямиком в бан.
Блокировка несуществующей папки или файла с fail2ban
Добавляем в клетку действие:
# vim /etc/fail2ban/jail.local
[...]
[block-nonexistent-data]
enabled = true
port = http,https
filter = block-nonexistent-data
logpath = /var/log/nginx/error.log
maxretry = 3
bantime = 3600
[...]
Создаю набор фильтр-правил в файле:
# vim /etc/fail2ban/filter.d/block-nonexistent-data.conf
[Definition]
failregex = .*[error].*"/usr/share/nginx/html.*".*failed.*client: <HOST>.*
ignoreregex =
И это защитит вас от таких переборов:
2015/11/18 06:03:33 [error] 249361#0: *31061 open() "/usr/share/nginx/html/manager/html" failed (2: No such file or directory), client: 54.77.108.139, server: localhost, request: "HEAD /manager/html HTTP/1.1", host: "31.187.70.238:80"
2015/11/18 13:38:39 [error] 249364#0: *44895 open() "/usr/share/nginx/html/wp/wp-login.php" failed (2: No such file or directory), client: 104.130.239.193, server: localhost, request: "GET /wp//wp-login.php HTTP/1.1", host: "31.187.70.238"
Вот и все 
Защита от SQL иньекций
Добавляем в клетку действие:
# vim /etc/fail2ban/jail.local
[...]
[block-sql-injections]
enabled = true
port = http,https
filter = block-sql-injections
logpath = /var/log/nginx/error-*.log
maxretry = 3
bantime = 3600
[...]
Создаю набор фильтр-правил в файле:
# vim /etc/fail2ban/filter.d/block-sql-injections.conf
[Definition]
failregex = .*[error].*FastCGI sent in stderr.*error in your SQL syntax;.*client: <HOST>.*
ignoreregex =
И это защитит вас от такого рода sql иньекций:
2015/11/19 08:35:19 [error] 10926#0: *28119 FastCGI sent in stderr: "PHP message: База данных WordPress возвратила ошибку You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 's##%' or es_note_cat LIKE '%##FreeBSD##%' or es_note_cat LIKE '%##RHEL's##%' or ' at line 1 в ответ на запрос SELECT * FROM `wp3_es_notificat· · ion` where (es_note_status = 'Enable' or es_note_status = 'Cron')· and ( es_note_cat LIKE '%##Apache##%' or es_note_cat LIKE '%##Apache##%' or es_note_cat LIKE '%##Debian's##%' or es_note_cat LIKE '%#· · #FreeBSD##%' or es_note_cat LIKE '%##RHEL's##%' or es_note_cat LIKE '%##Панели управления в CentOS/Red Hat/Fedora##%' or es_note_cat LIKE '%##Панели управления в Ubuntu/Debian/Mint##%' or es_note_cat · · LIKE '%##Установка Web сервисов##%' or es_note_cat LIKE '%##Установка Web сервисов в CentOS##%' or es_note_cat LIKE '%##Установка Web сервисов на Ubuntu##%'), в" while reading response header from ups· · tream, client: 109.86.212.179, server: linux-notes.org, request: "POST /wp-admin/post.php HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "linux-notes.org", referrer: "http://linux-notes.org/wp-admin/post.php?post=8948&action=edit"
Это спасет от SQL-иньекций.
Защита от Brute Force (брутфорс) атак для WordPress
Добавляем в клетку действие:
# vim /etc/fail2ban/jail.local
[...]
[wp-auth]
enabled = true
filter = wp-auth
#action = iptables-multiport[name=NoAuthFailures, port="http,https"]
port=http,https
logpath = /var/log/nginx/access-*.log
bantime = 3600
maxretry = 3
[...]
Создаю набор фильтр-правил в файле:
# vim /etc/fail2ban/filter.d/wp-auth.conf
[Definition]
#failregex = ^<HOST> .*(wp-login.php|xmlrpc.php)
#failregex = ^<HOST> .* "POST /wp-login.php
failregex = <HOST> - - .* "POST /wp-login.php HTTP/.*" 200
ignoreregex =
Собственно вот и все
Чуваков забанит на 3600 секунд или 1ч за 3 неверные попытки к админ панели вордпреса
Наводим СЕКУРИТИ на файл xmlrpc.php
Добавляем в клетку действие:
# vim /etc/fail2ban/jail.local
[wp-xmlrpc]
enabled = true
filter = wp-xmlrpc·
#action = iptables-multiport[name=NoAuthFailures, port="http,https"]
port=http,https
logpath = /var/log/nginx/access-*.log
bantime = 1200
maxretry = 3
Создаю набор фильтр-правил в файле:
# vim /etc/fail2ban/filter.d/wp-xmlrpc.conf
[Definition]
failregex = ^<HOST> .*(xmlrpc.php)
ignoreregex =
Собственно вот и все
Чуваков забанит на 3600 секунд или 1ч за использование файла xmlrpc.php более 3-х раз (проверял работу, но можно поставить и 1).
Полный список настроек можно найти на официальном сайте fail2ban в разделе вики
После чего перезапускаем службу fail2ban:
Debian/Ubuntu/Mint:
# sudo service fail2ban restart
CentOS/RedHat/Fedora:
# service·fail2ban restart
Можно посмотреть все правела которые создал fail2ban, выполнив:
Чтобы удалить забаненный IP с IPtables, необходимо прочитать статью:
Удалить из fail2ban заблокированный ip
ЗАМЕЧАНИЕ! Данные правила могут не работать на вашей ОС, т.к логи используют другую структуру и для этого нужно видоизменять регулярные выражения в фильтре fail2ban-а. Но об этом, немного позже, я обязательно напишу и расскажу как это делается.
Существуют еще и другие утилиты похожие на Fail2Ban:
- DenyHosts.
- Stockade.
- OSSEC.
Попозже сделаю описание и выясню что лучше, но данная программа очень хорошая и ее можно использовать. На этом я завершаю свою тему «Установка Fail2ban».