Бонусные правила
- Первым делом закроем передачу сигнатур сервера
nano -w /etc/apache2/mods-enabled/security2.conf
# Manipulating server signaturte
ServerTokens Min
SecServerSignature "null"
systemctl restart apache2
- Проверяем
curl -i --header 'Host: null.somedomain.name' https://null.somedomain.name | less
Server: null
- Далее подумаем, а нужно ли нам такое :) Представим, что мы хостим некий контент на который прямых ссылок нет и не предвидится. Технически - можно пройтись каким-нибудь кроулером по сайту в поисках HTTP 200 и дальше уже с этим работать (вопрос сложности и целесообразности оставим в стороне)
- Что с этим можно сделать ? Описанная ситуация предполагает некое количество HTTP 404 возвращенных клиенту до того как он получит HTTP 200, а с этим уже можно работать.
-
ВАЖНЫЙ МОМЕНТ: (отдельное спасибо @Borelli) Если у вас большое количество изменений на сайте то высока вероятность того, что написав подобное правило валидные роботы поисковиков будут отлетать на равне с остальными
Что с этим делать если официальной информации о том, откуда приходят роботы поисковиков нет ? Казалось бы вариантов два:
-
-
Не использовать предложенный функционал при необходимости разрешить доверенных роботов
-
Парсить базы RIRов и добавлять ВСЕ адреса в белый список
-
Парсить базы конечно можно, но дело это такое себе, а функционал нам все таки нужен. Давайте разбираться в том, когда робот поисковика может получить от нас HTTP 404
-
-
В случае если ранее проиндексированная страница более недоступна
- В случае если у нас расхождения в sitemap и широкие allow директивы в robots.txt
-
-
Предположим, что c sitemap и robots.txt у нас все в порядке. Что делать дальше ? А дальше мы сделаем исключение для всех опубликованных URI (включая те, что были проиндексированы и более недоступны) используя переменную REQUEST_URI
В нашем случае весь контент доступен по двум путям /shelves/* и /books/*
Пишем нечто подобное
#
# Block content harvesting
#
# SRC IP Whitelist
SecRule TX:REAL_IP|REMOTE_ADDR "@ipMatchFromFile http_404_whitelist.txt" \
"id:001003001,\
phase:1,\
pass,\
nolog,\
msg:'IP Whitelisted for HTTP 404',\
ctl:ruleRemoveById=001003002,\
ctl:ruleRemoveById=001003003,\
ctl:ruleRemoveById=001003004"
# Bypass for published resources
SecRule REQUEST_URI "@rx (\/shelves(|\/).*|\/books(|\/).*)" \
"id:001003002,\
phase:1,\
pass,\
nolog,\
msg:'URI Whitelisted for HTTP 404',\
ctl:ruleRemoveById=001003003,\
ctl:ruleRemoveById=001003004"
SecRule RESPONSE_STATUS "@streq 404" \
"id:001003003,\
phase:3,\
pass,\
setvar:IP.bad_http_request=+1,\
expirevar:IP.bad_http_request=86400,\
log,\
msg:'Page Not Found - HTTP 404 - Count %{IP.bad_http_request}'"
SecRule IP:BAD_HTTP_REQUEST "@gt 10" \
"id:001003004,\
phase:3,\
drop,\
log,\
msg:'Client Exceeded HTTP 404 Request Limit of 10 - Banned For a Day'"