← Dokumentace WAF / custom-rules / use-cases
Konfigurace ověřování pomocí tokenu
Autentizace pomocí tokenu umožňuje omezit přístup k dokumentům, souborům a médiím pouze na vybrané uživatele, aniž by se museli registrovat. To pomáhá chránit placený nebo omezený obsah před stahováním bez souhlasu a neoprávněným sdílením.
Ověřování pomocí tokenu můžete nakonfigurovat dvěma způsoby: přes Cloudflare Workers nebo přes vlastní pravidla.
Dva různé způsoby implementace ověřování pomocí tokenu najdete v následujících zdrojích Cloudflare Workers:
Chcete-li začít pracovat s Workers, přečtěte si Šablony.
Použijte Rules language is_timed_hmac_valid_v0() ověřovací funkce HMAC pro ověřování tokenů hash-based message authentication code (HMAC) ve výrazu vlastního pravidla.
Chcete-li ověřit autentizaci pomocí tokenu, vytvořit vlastní pravidlo pomocí volání is_timed_hmac_valid_v0() funkci ve výrazu pravidla. Můžete použít akci, jako je Block.
Příklad pravidla
Tento příklad ukazuje pravidlo, které zablokuje každého návštěvníka, jenž neprojde ověřením klíče HMAC u konkrétního hostitelského názvu a cesty URL. Mezi údaje potřebné pro ověřování pomocí tokenu patří:
- Tajný klíč pro generování a ověřování HMAC (například
mysecrettoken)
- Cesta, kterou chcete ověřit (například
downloads.example.com/images/cat.jpg)
- Název parametru řetězce dotazu obsahujícího token (například
verify)
- Životnost tokenu v sekundách (například 3 hodiny = 10,800 sekund)
Uvažujme následující příklad adresy URL:
downloads.example.com/images/cat.jpg?verify=1484063787-9JQB8vP1z0yc5DEBnH6JGWM3mBmvIeMrnnxFi3WtJLE%3D
Kde:
/images/cat.jpg představuje cestu k prostředku: zprávu HMAC k ověření.
?verify= je oddělovač mezi cestou k assetu a časovým razítkem vydání tokenu HMAC.
1484063787 představuje časové razítko vydání tokenu vyjádřené jako čas UNIX v sekundách.
9JQB8vP1z0yc5DEBnH6JGWM3mBmvIeMrnnxFi3WtJLE%3D je MAC kódovaný v Base64.
Výraz pro vlastní pravidlo by mohl vypadat podobně jako v následujícím příkladu:
(http.host eq "downloads.example.com" and not is_timed_hmac_valid_v0("mysecrettoken", http.request.uri, 10800, http.request.timestamp.sec, 8))
Součásti tohoto ukázkového vlastního pravidla (s použitím předchozí ukázkové adresy URL) zahrnují:
- Tajný klíč tokenu =
mysecrettoken
- Platnost tokenu =
10800 (10,800 sekund = 3 hodiny)
http.request.uri = /images/cat.jpg?verify=1484063787-9JQB8vP1z0yc5DEBnH6JGWM3mBmvIeMrnnxFi3WtJLE%3D
http.request.timestamp.sec = 1484071925 (například)
- Délka oddělovače:
len("?verify=") = 8
is_timed_hmac_valid_v0() funkce porovnává hodnotu MAC vygenerovanou pomocí mysecrettoken tajný klíč na hodnotu zakódovanou v http.request.uri.
Pokud se hodnoty MAC shodují a token ještě nevypršel, podle následujícího vzorce:
http.request.timestamp.sec < (<TIMESTAMP_ISSUED> + 10800)
Pak je token platný a is_timed_hmac_valid_v0() vrací true.
Generování tokenu HMAC
Následující příklady ukazují, jak byste mohli generovat tokeny na svém origin serveru pro cestu ověřenou pomocí vlastního pravidla popsaného v předchozí části:
import hmac
import base64
import time
import urllib.parse
from hashlib import sha256
message = "/images/cat.jpg"
secret = "mysecrettoken"
separator = "verify"
timestamp = str(int(time.time()))
digest = hmac.new((secret).encode('utf8'), "{}{}".format(message, timestamp).encode('utf8'), sha256)
token = urllib.parse.quote_plus(base64.b64encode(digest.digest()))
print("{}={}-{}".format(separator, timestamp, token))
import hmac
import base64
import time
import urllib
from hashlib import sha256
message = "/images/cat.jpg"
secret = "mysecrettoken"
separator = "verify"
timestamp = str(int(time.time()))
digest = hmac.new(secret, message + timestamp, sha256)
param = urllib.urlencode({separator: '%s-%s' % (timestamp, base64.b64encode(digest.digest()))})
print(param)
<?php
$message = "/images/cat.jpg";
$secret = "mysecrettoken";
$separator = "verify";
$timestamp = time();
$token = urlencode(base64_encode(hash_hmac("sha256", $message . $timestamp, $secret, true)));
echo("{$separator}={$timestamp}-{$token}");
Úplný příklad v JavaScriptu (JS) nebo TypeScriptu (TS) najdete v Podepisování požadavků příklad v dokumentaci Workers.
Ukázková implementace v JS/TS je kompatibilní s is_timed_hmac_valid_v0() funkci lze požadavky ověřené pomocí poskytnutého zdrojového kódu ověřit vlastním pravidlem WAF a is_timed_hmac_valid_v0() .
Tím se vygeneruje parametr URL podobný následujícímu:
verify=1484063787-9JQB8vP1z0yc5DEBnH6JGWM3mBmvIeMrnnxFi3WtJLE%3D
K URL, kterou chráníte, budete muset připojit tento parametr:
/images/cat.jpg?verify=1484063787-9JQB8vP1z0yc5DEBnH6JGWM3mBmvIeMrnnxFi3WtJLE%3D
Otestování vygenerovaného parametru tokenu
Pokud máte plán Enterprise, můžete otestovat, zda origin server generuje URL adresy správně, následujícím postupem:
- Nastavte akci vlastního pravidla na Log.
- Zkontrolujte vzorkované protokoly v Security Events.
Chránit více cest pomocí stejného tajného klíče
Stejný tajný klíč můžete použít k ochraně několika cest URI.
To ukazuje předchozí příklad, kde http.request.uri se předává jako MessageMAC argument pro validační funkci.
Protože http.request.uri obsahuje cestu k danému zdroji a tato hodnota se extrahuje pro každý požadavek, validační funkce vyhodnotí všechny URI požadavků na downloads.example.com pomocí stejného tajného klíče.
Upozorňujeme, že ačkoli lze pro ověření několika cest použít stejný tajný klíč, pro každou jedinečnou zprávu, kterou chcete ověřit, musíte vygenerovat token HMAC.
Chránit celý prefix cesty URI jedinou signaturou
Celý prefix cesty URI s pevnou délkou můžete chránit jediným podpisem HMAC (ten by také používal stejný tajný klíč). Chcete-li toho dosáhnout, zadejte prefix cesty URI (místo celé cesty URI) a původní řetězec dotazu jako MessageMAC argument pro is_timed_hmac_valid_v0() .
Použijte substring() funkci pro získání prefixu z úplné cesty URI.
V následujícím příkladu má prefix cesty URI vyžadující jeden podpis HMAC vždy délku 51 znaků (x je zástupný znak):
/case-studies/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/
V takovém případě byste museli pro každý odlišný prefix cesty URI o délce 51 znaků použít jiný podpis HMAC.
Pokud byste chtěli blokovat požadavky na soubory případové studie, které neprojdou ověřením HMAC, můžete vytvořit vlastní pravidlo podobné následujícímu:
Výraz pravidla:
(http.host eq "downloads.example.com" and starts_with(http.request.uri.path, "/case-studies") and not is_timed_hmac_valid_v0("mysecrettoken", concat(substring(http.request.uri.path, 0, 51), "?", http.request.uri.query), 10800, http.request.timestamp.sec, 1))
Akce:
Příklady cest URI platných příchozích požadavků:
/case-studies/12345678-90ab-4cde-f012-3456789abcde/foobar-report.pdf?1755877101-5WOroVcDINdl2%2BQZxZFHJcJ6l%2Fep4HGIrX3DtSXzWO0%3D
/case-studies/12345678-90ab-4cde-f012-3456789abcde/acme-corp.pdf?1755877101-5WOroVcDINdl2%2BQZxZFHJcJ6l%2Fep4HGIrX3DtSXzWO0%3D
/case-studies/768bf477-22d5-4545-857d-b155510119ff/another-company-report.pdf?1755878057-jeMS5S1F3MIgxvL61UmiX4vODiWtuLfcPV6q%2B0Y3Rig%3D
První dvě cesty URI mohou používat stejný podpis HMAC, protože sdílejí stejný 51znakový prefix (/case-studies/12345678-90ab-4cde-f012-3456789abcde/), které vlastní pravidlo ověřuje.
Třetí cesta URI vyžaduje jiný podpis HMAC, protože prefix je odlišný.