Поддержка CloudFlare для Fail2Ban и реальный IP в Apache 2.x

archive view archive save

articles Добавить поддержку CloudFlare для Fail2Ban и определить реальный IP в Apache 2.x. При использовании CDN сервиса CloudFlare, использование Fail2Ban связано с определёнными сложностями, среди которых определение реального IP и собственно выбор способа блокировки.

Когда Fail2Ban определяет наличие некоторых условий (запись в лог. файле), то он может выполнять некоторые действия, среди которых такие шаблоны действий (action) как hostsdeny.conf, iptables.conf, pf.conf и другие.

Почти во всех действиях Fail2Ban главным критерием является IP адрес, который нам нужно заебанить на некоторое время, чтобы не нахлобучивал наш сервер;)

Если сервер находится за CDN сервисом CloudFlare, то все посетители будут приходить с IP диапазона CDN сети CloudFlare. Для определения реального IP адреса посетителя, пришедшего через CDN сеть CloudFlare, на веб-сервере Apache 2.x должен быть установлен mod_cloudflare.

Для ОС Linux доступны готовые бинарные сборки модуля, но в случае использования ОС BSD типа нам нужно будет самостоятельно скомпилировать и установить mod_cloudflare. Страница загрузки модуля: Logging Real Visitor IP Addresses: mod_cloudflare for Apache httpd

Если мы используем BSD, тогда скачиваем исходный код mod_cloudflare.c и компилируем модуль:

 

Теперь...

Когда сервер определяет реальный IP адрес посетителей приходящих с IP диапазона CDN сети CloudFlare мы можем с этим IP что-то сделать, но только не блокировать его в брандмауэре. Fail2Ban может заблокировать IP с помощью iptables.conf или pf.conf, но это не будет работать - заблокированный IP будет продолжать получать доступ к веб-серверу и неважно будет это Apache или Nginx, а всё потому, что брандмауэры не в состоянии определять реальный IP посетителей приходящих с IP диапазона CDN сети CloudFlare!

Для того, чтобы все "пидрулинщики" пидрулинящие к нашему серванту со злыми помыслами были успешно заебанены, то нам нужно заебанивать их на стороне самого CDN сервиса CloudFlare используя API: CloudFlare Client API Documentation

Хотя "Client API Documentation" и допускает использование методов GET/POST, но на практике работает только метод POST, а при использовании GET можем получить что-то типа:

# E_INVLDINPUT
You must include an `a' parameter, with a value of DIUP|wl|chl|nul|ban|comm_news
|devmode|sec_lvl|ipv46|ob|cache_lvl|fpurge_ts|async|mirage2|img.q|pre_purge|mini
fy|stats|direct|zone_check|zone_ips|zone_errors|zone_agg|zone_search|zone_grab|z
one_ss|vote_ss|audit_list|app|rec_set|rec_del|ip_lkup|set|strack_get|sslvemail_g
uess|app_req|app_req_list|app_version|custom_cert_set|custom_cert_purge|custom_c
ert_load_multi|custom_cert_load|errinfo_look|ersubmit|zoneupload|fillforme|sys_s
tatus|user_delve|user_notification_remove|pref_set|zone_file_purge|zone_file_ref
resh|zone_settings
Additionally, email and tkn parameters are required.

Независимо от того, используем мы GET в браузере или мы используем "curl -s ...". Раньше использовался адрес вида "https://www.cloudflare.com/api.html?...", хотя он и сейчас живой, а нынче ему на смену пришёл "https://www.cloudflare.com/api_json.html".

Для того чтобы добавить поддержку cloudflare для Fail2Ban создадим шаблон действия, vi /etc/fail2ban/action.d/cloudflare.conf, с таким вот содержимым:

# Fail2Ban configuration file
#
# Author: Charles Chou
# Modified: Norman Yee 
# fix original cloudflare-blacklist.conf
 
# $Revision$
# https://www.cloudflare.com/docs/client-api.html
# Your API key is: https://www.cloudflare.com/my-account
 
[Definition]
 
# Option: actionstart
# Notes.: command executed once at the start of Fail2Ban.
# Values: CMD
#
actionstart =
 
# Option: actionstop
# Notes.: command executed once at the end of Fail2Ban
# Values: CMD
#
actionstop =
 
# Option: actioncheck
# Notes.: command executed once before each actionban command
# Values: CMD
#
actioncheck =
 
# Option: actionban
# Notes.: command executed when banning an IP. Take care that the
# command is executed with Fail2Ban user rights.
# Tags: <ip> IP address
# <failures> number of failures
# <time> unix timestamp of the ban time
# Values: CMD
#
# Old API URL
#actionban = curl -s "https://www.cloudflare.com/api.html?a=ban&key=<ip>& \
    u=<account>&tkn=<token>"
#
actionban = curl https://www.cloudflare.com/api_json.html -d "tkn=<token>" \
    -d "email=<account>" -d "a=ban" -d "key=<ip>"
 
# Option: actionunban
# Notes.: command executed when unbanning an IP. Take care that the
# command is executed with Fail2Ban user rights.
# Tags: <ip> IP address
# <failures> number of failures
# <time> unix timestamp of the ban time
# Values: CMD
#
# Old API URL
#actionunban = curl -s "https://www.cloudflare.com/api.html?a=nul&key=<ip>& \
    u=<account>&tkn=<token>"
#
actionunban = curl https://www.cloudflare.com/api_json.html -d "tkn=<token>" \
    -d "email=<account>" -d "a=nul" -d "key=<ip>"
 
 
[Init]
 
# Option: account
# Notes.: In the actionban and actionunban sections,
# replace CLOUDFLARE_LOGIN with your CloudFlare login email
# Values: your CloudFlare account
#
account = example@example.com
 
# Option: token
# Notes.: In the actionban and actionunban sections, 
# replace CLOUDFLARE_API_TOKEN with your API key
# Values: Your CloudFlare API key 
#
token = Your API key here

Главная тема статьи "Поддержка CloudFlare для Fail2Ban" раскрыта - на этом всё, финита:)


Об авторе
АдМинь БагоИскатель
АдМинь БагоИскатель ярый борец за безглючную работу любых механизмов и организмов во всей вселенной и потому пребывает в вечном поиске всяческих багов, а тот кто ищет как известно всегда находит. Когда что-то или кого-то вылечить не в состоянии, то со словами "Я в аду, а вы все черти" уходит в запой выйдя из которого снова берётся лечить неизлечимое.
Ещё статьи автора
Комментарии в блоге
Новое на форуме