INTEGRITY Документация

Интеграция Turnstile, WAF и Bot Management

Это руководство покажет, как интегрировать Cloudflare Turnstile, Web Application Firewall (WAF), а также Bot Management в существующую систему аутентификации. Такое сочетание надёжно защищает от разных угроз, включая автоматизированные атаки и вредоносные попытки входа.

Обзор

Для работы WAF и Bot Management DNS вашего сайта должен проходить через Cloudflare. При этом Turnstile можно использовать отдельно на любом сайте, в том числе вне сети Cloudflare. В руководстве описаны все три продукта, но если ваш сайт не в сети Cloudflare, ограничьтесь разделом про Turnstile.

WAF, Bot Management и Turnstile хорошо дополняют друг друга, потому что работают на разных уровнях приложения:

Сочетая серверные меры защиты (WAF и Bot Management) с клиентскими (Turnstile), вы выстраиваете несколько рубежей обороны, которые злоумышленнику трудно обойти.

Перед началом работы

В этом руководстве используется простая форма входа на чистом HTML, чтобы показать интеграцию Turnstile в приложение. На бэкенде запрос на вход обрабатывает заглушка маршрута аутентификации на TypeScript. Вы можете заменить её на любой другой язык. Достаточно, чтобы ваш язык или фреймворк умел отправлять внешний HTTP-запрос к API Turnstile, вы можете интегрировать Turnstile в своё приложение.

Настройка WAF и Bot Management

Если ваш сайт работает в сети Cloudflare и подключён к плану Enterprise, необходимо настроить WAF и Bot Management.

Выдавать проверки для трафика, похожего на ботов

  1. На панели управления Cloudflare перейдите к разделу WAF страницу.

    Перейдите в WAF ↗
  2. Создайте новое пользовательское правило WAF, выбрав Edit expression:

    • Поле: «Bot Score»
    • Оператор: «меньше или равно»
    • Значение: "30"
    • Action: "Managed Challenge"

При такой настройке запросы с низким bot score получают проверку: сетевые сигналы помогают выявить возможные угрозы до того, как запрос дойдёт до приложения. Порог оценки можно изменить под свою задачу.

Настройка Cloudflare Turnstile

Turnstile можно использовать на любом сайте независимо от того, находится ли он в сети Cloudflare:

  1. На панели управления Cloudflare перейдите к разделу Turnstile страницу.

    Перейдите в Turnstile ↗
  2. Выберите Добавить виджет и заполните необходимые сведения.

  3. Добавьте свой домен в конфигурацию Turnstile.

  4. Выберите Создание.

Turnstile добавляет дополнительный уровень защиты: он анализирует сигналы браузера и клиентской стороны и дополняет серверные проверки, которые выполняют WAF и Bot Management.

Если ваш сайт работает в Cloudflare, вы можете включить параметр, который позволяет использовать уже существующий cookie-файл clearance в настройках Turnstile. Благодаря этой интеграции Turnstile учитывает cookie clearance, когда решает, показывать ли пользователю проверку. Интеграция необязательна, но рекомендуется, если вы уже используете WAF и Bot Management.

Интеграция Turnstile в приложение

Интеграция Turnstile в приложение состоит из двух частей: виджета Turnstile и серверной логики валидации.

Добавьте виджет Turnstile в форму входа

Добавьте виджет Turnstile в существующую форму входа:

<form id="login-form">
	<input type="text" id="username" placeholder="Username" required />
	<input type="password" id="password" placeholder="Password" autocomplete="off" required />
	<div class="cf-turnstile" data-sitekey="<YOUR-SITE-KEY>"></div>
	<button type="submit">Log in</button>
</form>

<script
	src="https://challenges.cloudflare.com/turnstile/v0/api.js"
	async
	defer
></script>

Замените <YOUR-SITE-KEY> на ваш настоящий site key Turnstile.

Обработка запроса на вход

В существующий маршрут аутентификации добавьте проверку Turnstile:

async function validateTurnstileToken(
	ip: string,
	token: string,
	secret: string,
): Promise<boolean> {
	const response = await fetch(
		"https://challenges.cloudflare.com/turnstile/v0/siteverify",
		{
			method: "POST",
			headers: { "Content-Type": "application/json" },
			body: JSON.stringify({ ip, secret, response: token }),
		},
	);

	const outcome = await response.json();
	return outcome.success;
}

// Assume that this is a TypeScript route handler.
// You may replace this with a different implementation,
// based on your language or framework
export async function onRequestPost(context) {
	const { request, env } = context;
	const { username, password, token } = await request.json();

	// Validate Turnstile token
	const secretKey = env.TURNSTILE_SECRET_KEY;
	const ip = request.headers.get("CF-Connecting-IP");
	const turnstileValid = await validateTurnstileToken(ip, token, secretKey);
	if (!turnstileValid) {
		// Return back to the login page with an error message
		return Response.redirect("/login", 302, {
			headers: {
				Location: "/login?error=invalid-turnstile-token",
			},
		});
	}

	// Perform your existing authentication logic here
	const isValidLogin = await checkCredentials(username, password);

	if (isValidLogin) {
		return new Response(JSON.stringify({ message: "Login successful" }), {
			status: 200,
			headers: { "Content-Type": "application/json" },
		});
	} else {
		return new Response(JSON.stringify({ error: "Invalid credentials" }), {
			status: 401,
			headers: { "Content-Type": "application/json" },
		});
	}
}

async function checkCredentials(
	username: string,
	password: string,
): Promise<boolean> {
	// Your existing credential checking logic
}

Такая схема гарантирует, что токен Turnstile проверяется на сервере до продолжения входа, и добавляет дополнительный уровень защиты на основе клиентских сигналов.

Тестирование

После развёртывания интеграцию стоит проверить. Ваш bot score будет низким, поэтому проверка, скорее всего, не появится. При необходимости добавьте дополнительные правила, которые принудительно перенаправят на страницу проверки. Сделать это можно, например, так:

  1. Добавьте правило WAF, которое всегда направляет ваш IP-адрес на страницу проверки.
  2. Добавьте правило WAF, которое проверяет наличие параметра запроса, например ?challenge=true.

Рекомендации

  1. Всегда проверяйте токен Turnstile на сервере, прежде чем сверять учётные данные.
  2. Храните конфиденциальные данные, например секретный ключ Turnstile, в переменных окружения.
  3. Реализуйте корректную обработку ошибок и логирование, чтобы отслеживать возможные проблемы с безопасностью.

Связка Turnstile с WAF и Bot Management защищает приложение на сетевом уровне и добавляет ещё один рубеж, построенный на клиентских сигналах. При такой схеме автоматизировать атаку на вашу систему входа заметно сложнее.

Материалы

Если вы хотите настроить Turnstile под себя, обратитесь к материалам ниже: