Skip to main content

Бонусные правила

  • Первым делом закроем передачу сигнатур сервера
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'"