Установка Fail2ban

Установка 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 и другие дебиано-подобные ОС:

# apt-get install fail2ban

Чтобы произвести установку на CentOS/RedHat/Fedora:

# yum install fail2ban

Настройка Fail2ban

Fail2ban имеет следующую структуру файлов:

структура файлов fail2ban

структура файлов 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
[...]

Рассмотрю следующие параметры:

  1. ignoreip — эта переменная отвечает за IP-адрес который не будет блокироваться в любом случае. Можно указать IP, CIDR-маску, домен или же имя DNS-хоста;
  2. bantime — это переменная отвечает за время (секунды) -это время на которое будет производится блокировка доступа;
  3. maxretry — эта переменная отвечает за количество неудачных авторизаций (их количество), если привысит заданное количество,то хост заблокируеться на bantime секунд;
  4. destemail — эта переменная отвечающая за email-адрес, на который будут пересылаться все сообщение о блокировании хостов.
  5. Banaction — описывает шаги, которые fail2ban будет запрещать. Запрет по умолчанию описывается в «iptables-multiport» и его можно найти в /etc/fail2ban/action.d/iptables-multiport.conf;
  6. MTA относится к почтовой программе и указывает fail2ban что будет использовать для отправки электронных писем;
  7. 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:

# fail2ban-client -d

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, выполнив:

# sudo iptables -L

Чтобы удалить забаненный IP с IPtables, необходимо прочитать статью:

Удалить из fail2ban заблокированный ip

ЗАМЕЧАНИЕ! Данные правила могут не работать на вашей ОС, т.к логи используют другую структуру и для этого нужно видоизменять регулярные выражения в фильтре fail2ban-а.  Но об этом, немного позже, я обязательно напишу и расскажу как это делается.

Существуют еще и другие утилиты похожие на Fail2Ban:

  1. DenyHosts.
  2. Stockade.
  3. OSSEC.

Попозже сделаю описание и выясню что лучше, но данная программа очень хорошая и ее можно использовать. На этом я завершаю свою тему «Установка Fail2ban».

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.