Установка 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 расположен /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:
# 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:
- DenyHosts.
- Stockade.
- OSSEC.
Попозже сделаю описание и выясню что лучше, но данная программа очень хорошая и ее можно использовать. На этом я завершаю свою тему «Установка Fail2ban».