Cloudflare

Cloudflare перед вашим сервером скрывает его адрес, поглощает объёмные атаки, которые не остановит никакая программа на самом сервере, и кэширует ваши страницы по всему миру. WardPane может работать за ним, но каждый проксируемый сайт нужно отметить, иначе для панели любой посетитель выглядит как Cloudflare.

За Cloudflare

В настройках сайта включите За Cloudflare для каждого сайта, чьи DNS-записи проксируются (оранжевое облако). От этого переключателя зависят четыре вещи, описанные ниже.

Настоящие IP посетителей

За Cloudflare каждое соединение с вашим сервером приходит с адреса Cloudflare, а собственный адрес посетителя находится в заголовке CF-Connecting-IP. WardPane берёт IP посетителя из этого заголовка, но только для сайтов с отметкой «За Cloudflare» и только когда соединение действительно приходит с адреса Cloudflare. Из любого другого источника заголовок игнорируется: записать в него любой адрес может кто угодно.

Диапазоны адресов Cloudflare встроены в панель и раз в день обновляются с cloudflare.com.

Когда настоящий IP известен, для каждого посетителя отдельно работают: лимит запросов и баны, проверки адресов в Bot Fight Mode, Гео-блокировка, общий чёрный список, привязка к IP в обязательных параметрах ссылки, журналы и REMOTE_ADDR для PHP-скриптов.

Сертификаты за оранжевым облаком

WardPane выпускает сертификаты Let’s Encrypt, даже если DNS домена указывает на Cloudflare вместо вашего сервера. Настройте режим SSL/TLS зоны в Cloudflare так:

  1. Для самого первого сертификата используйте Full или Flexible. Пока сертификата нет, сервер отвечает самоподписанным, а «Full (strict)» его не принимает.
  2. Когда сертификат выпущен, переключитесь на Full (strict). Тогда Cloudflare проверяет сертификат вашего сервера, и соединение между Cloudflare и вашим сервером как следует зашифровано.

Режим SSL/TLS настраивается для всей зоны: он влияет на все сайты в этой зоне Cloudflare.

Если в зоне включён режим «I’m Under Attack» или высокий уровень безопасности, проверочные запросы Let’s Encrypt может остановить челлендж Cloudflare. Эту проблему решает интеграция с API, о ней ниже.

Перенаправление на HTTPS без циклов

В режиме «Flexible» Cloudflare обращается к вашему серверу по обычному HTTP, даже когда посетитель использует HTTPS. Простое перенаправление с HTTP на HTTPS в этом случае зациклилось бы. WardPane читает настоящую схему посетителя из заголовка CF-Visitor и перенаправляет только тех посетителей, которые действительно пришли по HTTP. PHP-скрипты для посетителей по HTTPS тоже получают HTTPS=on, так что и WordPress не уходит в цикл перенаправлений.

Пропускать трафик только через Cloudflare

Если включить Пропускать трафик только через Cloudflare, прямые запросы к этому сайту по IP вашего сервера получают 404. Тогда атакующий, узнавший настоящий адрес сервера, не доберётся до сайта в обход защиты Cloudflare. Включайте это, когда сайт уже работает через Cloudflare.

Если переключатель выключен, а сайт за Cloudflare

В этом случае каждый запрос приходит с адреса Cloudflare, а за каждым таким адресом стоят сразу многие ваши посетители. Бан одного адреса закрыл бы сайт для всех, кто идёт через этот сервер Cloudflare, поэтому WardPane распознаёт адреса Cloudflare и обращается с ними иначе:

  • Адреса Cloudflare никогда не банятся.
  • Лимит запросов считается на каждый сервер Cloudflare, с лимитом в десять раз больше, чем у сайта.
  • Баны, публичные списки блокировки IP, проверка и блокировка краулеров по IP, обнаружение сканирования, страны и сети для таких запросов пропускаются. Работают только проверки самого запроса: правила User-Agent, атаки в URL, пробы и методы. Фильтр по языку браузера тоже работает.
  • Привязка к IP в обязательных параметрах ссылки отключена: запоминание адреса Cloudflare открыло бы сайт всем, кто стоит за тем же сервером Cloudflare.
  • В журнал записывается предупреждение, не чаще раза в день для каждого сайта, с предложением включить «За Cloudflare».

Сайт продолжает работать, но большая часть защиты простаивает, пока вы не включите переключатель.

Cloudflare Workers

Запросы, сделанные Cloudflare Worker, тоже приходят с адресов Cloudflare, а бесплатный Worker может создать кто угодно. Если бы такие запросы считались «Cloudflare», атакующий с Worker обходил бы все правила по IP. Поэтому WardPane учитывает их по зоне Worker из заголовка CF-Worker (worker:<zone>), с обычными лимитами и банами, и Worker, который ведёт себя плохо, банится как любой посетитель.

Worker собственной зоны сайта (домена сайта или его родительского домена) несёт всех ваших настоящих посетителей, поэтому он считается обычным адресом Cloudflare и никогда не банится.

Подключение панели к Cloudflare

Панель может обращаться к API Cloudflare, чтобы проверять и исправлять ваши зоны. Подключение необязательно. Без него панель никогда не обращается к API Cloudflare, а всё описанное выше всё равно работает. В 2.0 панель подключается API-токеном; вход через Cloudflare появится в версии 2.4.

С API-токеном

  1. В панели нажмите Создать токен Cloudflare. Кнопка открывает страницу API-токенов Cloudflare с шаблоном, в котором уже есть нужные права:

    • Zone: Read
    • DNS: Edit
    • Zone Settings: Edit
    • Config Settings: Edit (так в Cloudflare называется право на Configuration Rules)
  2. Создайте токен в Cloudflare, при желании ограничьте его своими зонами и скопируйте.

  3. Вставьте его в панели в Настройки > Интеграции или задайте в /opt/wardpane/.env:

    CLOUDFLARE_API_TOKEN=your_token
    

    Значение, сохранённое в панели, применяется сразу; изменение в .env применяется после sudo systemctl restart wardpane.

Используйте ограниченный API-токен, а не Global API Key: Global API Key даёт полный контроль над всей вашей учётной записью Cloudflare. Панель никогда не отправляет токен обратно в ваш браузер; она лишь показывает, что токен задан.

Вход через Cloudflare

Появится в версии 2.4, см. в плане развития. Вход через Cloudflare будет подключать панель без копирования токена: вы подтверждаете доступ на сайте Cloudflare.

Панель сама начинает авторизацию по PKCE, поэтому секретная часть обмена создаётся в вашей панели и никогда её не покидает. Каждая панель WardPane работает на своём адресе, а у OAuth-клиента Cloudflare только один фиксированный адрес возврата. Поэтому после подтверждения Cloudflare сначала отправляет вас на промежуточную страницу https://cloudflare.wardpane.com/callback.

Эта промежуточная страница крупными буквами показывает адрес панели, в которую будет отправлена авторизация, и отправляет её туда только после нажатия Continue:

  • Нажимайте Continue, только если показан адрес вашей собственной панели.
  • Если это не так или вы только что не начинали подключение, нажмите Cancel.

Промежуточная страница никогда не перенаправляет сама и ничего не хранит и не записывает в журналы об авторизации. Если Cloudflare отказал в авторизации, промежуточная страница предложит сообщить вашей панели, что подключение не удалось.

Интеграция с API Cloudflare

Когда подключение настроено, в разделе За Cloudflare настроек сайта появляется кнопка Проверить настройки Cloudflare. Она читает зону и показывает, что в ней есть, ничего не меняя:

  • DNS-записи каждого домена и псевдонима сайта: существует ли каждая, указывает ли на этот сервер и проксируется ли (оранжевое облако);
  • режим SSL/TLS зоны и рекомендуемый режим: Full, пока у сайта нет доверенного сертификата, и Full (strict), когда он появился;
  • уровень безопасности и исключён ли из него путь для ACME-челленджа.

Затем она предлагает исправить только найденные проблемы, и ничего не меняется, пока вы не нажмёте Применить исправления:

  • создать или исправить записи A, чтобы каждое имя указывало на этот сервер через оранжевое облако;
  • установить рекомендуемый режим SSL/TLS (для всей зоны);
  • добавить правило ACME (см. ниже).

Каждое изменение перечисляется в результате и записывается в журнал.

Правило ACME

Let’s Encrypt проверяет домен, загружая файл из /.well-known/acme-challenge/. При режиме Cloudflare «I’m Under Attack» или высоком уровне безопасности этот запрос натыкается на страницу проверки, и проверка домена не проходит. Это решает Configuration Rule в зоне, которое отключает уровень безопасности для одного этого пути. По этому пути лежат только одноразовые случайные токены, а остальной сайт сохраняет полную защиту.

Это правило единственное, что панель меняет без спроса: оно добавляется автоматически перед выпуском сертификата, потому что без него выпуск невозможен. Других правил панель не трогает, а если вы уже сами создали равнозначное правило, она его распознает.

Снятие режима Under Attack как крайняя мера

Если Cloudflare отказывается создавать правило (например, у токена нет права Config Settings), панель может на время прохождения проверки переключить зону с «I’m Under Attack» на «High» и сразу вернуть обратно. Прежний уровень сначала записывается на диск, поэтому он восстанавливается, даже если панель упадёт посередине; неудачное восстановление повторяется с растущими паузами, а журнал сообщит, если вам нужно включить режим обратно вручную.

В эти секунды вся зона защищена слабее, поэтому панель идёт на это, только если Cloudflare отказался создать точечное правило. Чтобы запретить это совсем, задайте:

CLOUDFLARE_LIFT_UNDER_ATTACK=false

(в .env или в Настройки > Интеграции; по умолчанию true).

Синхронизация DNS

Синхронизация зон DNS с Cloudflare появится в версии 2.4 вместе с собственным DNS-сервером WardPane; см. DNS. Уже в 2.0 кнопка Проверить настройки Cloudflare создаёт или исправляет записи A каждого сайта в его зоне Cloudflare, как описано выше.

За другими прокси

WardPane доверяет адресу посетителя только от Cloudflare. За любым другим прокси или CDN каждый запрос несёт адрес прокси: не включайте защиту от DDoS для такого сайта, потому что один бан заблокирует всех.