トークン認証の設定
トークン認証を使用すると、ユーザーが登録することなく、特定のユーザーに対してドキュメント、ファイル、メディアへのアクセスを制限できます。これにより、有料または制限されたコンテンツの不正利用や共有から保護されます。
トークン認証を設定するには、Cloudflare WorkersまたはWAFカスタムルールの2つのオプションがあります。
トークン認証の2つの異なる実装については、以下のCloudflare Workersリソースを参照してください。
- リクエストに署名するの例。
- ヘッダーで認証するのテンプレート。
Workersを始めるには、Workerの設定を参照してください。
ルール言語のis_timed_hmac_valid_v0() HMAC検証関数を使用して、カスタムルール式でハッシュベースのメッセージ認証コード(HMAC)トークンを検証します。
トークン認証を検証するには:
- Cloudflareダッシュボード ↗にログインし、アカウントとドメインを選択します。
- セキュリティ > WAF > カスタムルールに移動します。
- ルールを作成を選択します。
- 式を編集を選択して、式エディタに切り替えます。
- ルール式を入力し、
is_timed_hmac_valid_v0()関数への呼び出しを含めることを確認します。 - その後のアクションを取るの下で、_ブロック_などのアクションを選択します。
- ルールを保存して展開するには、展開を選択します。
この例は、特定のホスト名とURLパスでHMACキー検証に合格しない訪問者をブロックするルールを示しています。トークン認証に必要な詳細は以下の通りです:
- HMACを生成および検証するための秘密鍵(例:
mysecrettoken) - 認証したいパス(例:
downloads.example.com/images/cat.jpg) - トークンを含むクエリ文字列パラメータの名前(例:
verify) - トークンの有効期限(秒単位)(例:3時間 = 10,800秒)
次の例のURLを考えてみてください:
downloads.example.com/images/cat.jpg?verify=1484063787-9JQB8vP1z0yc5DEBnH6JGWM3mBmvIeMrnnxFi3WtJLE%3Dここで:
/images/cat.jpgは資産へのパスを表します — 認証するためのHMACメッセージ。?verify=は資産へのパスとHMACトークンが発行されたタイムスタンプの間の区切りです。1484063787はトークンが発行されたタイムスタンプで、UNIX時間で秒単位で表現されています。9JQB8vP1z0yc5DEBnH6JGWM3mBmvIeMrnnxFi3WtJLE%3DはBase64エンコードされたMACです。
カスタムルールの式は次のようになります:
(http.host eq "downloads.example.com" and not is_timed_hmac_valid_v0("mysecrettoken", http.request.uri, 10800, http.request.timestamp.sec, 8))この例のカスタムルールのコンポーネント(前の例のURLを使用)には以下が含まれます:
- トークン秘密鍵 =
mysecrettoken - トークンの有効期限 =
10800(10,800秒 = 3時間) http.request.uri=/images/cat.jpg?verify=1484063787-9JQB8vP1z0yc5DEBnH6JGWM3mBmvIeMrnnxFi3WtJLE%3Dhttp.request.timestamp.sec=1484071925(例として)- 区切り文字の長さ:
len("?verify=")=8
is_timed_hmac_valid_v0()関数は、mysecrettoken秘密鍵を使用して生成されたMACの値をhttp.request.uriにエンコードされた値と比較します。
MACの値が一致し、トークンがまだ有効期限切れでない場合、次の式に従って:
http.request.timestamp.sec < (<TIMESTAMP_ISSUED> + 10800)トークンは有効であり、is_timed_hmac_valid_v0()関数はtrueを返します。
以下の例は、前のセクションで説明したWAFカスタムルールを使用して検証されたパスのために、オリジンサーバーでトークンを生成する方法を示しています:
import hmacimport base64import timeimport urllib.parsefrom 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 hmacimport base64import timeimport urllibfrom 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}");JavaScript(JS)またはTypeScript(TS)での完全な例については、Workersドキュメントのリクエストに署名するの例を参照してください。
例のJS/TS実装はis_timed_hmac_valid_v0()関数と互換性があるため、提供されたソースコードを使用して認証されたリクエストは、WAFカスタムルールとis_timed_hmac_valid_v0()関数で検証できます。
これにより、次のようなURLパラメータが生成されます:
verify=1484063787-9JQB8vP1z0yc5DEBnH6JGWM3mBmvIeMrnnxFi3WtJLE%3Dこのパラメータを保護するURLに追加する必要があります:
/images/cat.jpg?verify=1484063787-9JQB8vP1z0yc5DEBnH6JGWM3mBmvIeMrnnxFi3WtJLE%3DEnterpriseプランに加入している場合、オリジンサーバーでURLが正しく生成されているかをテストするには、次の手順を実行します:
- WAFカスタムルールのアクションを_ログ_に設定します。
- セキュリティ > イベントでアクティビティログを確認します。
同じ秘密鍵を使用して、複数のURIパスを保護できます。
これは前の例で示されており、http.request.uriが検証関数へのMessageMAC引数として渡されます。
http.request.uriには資産へのパスが含まれており、その値は各リクエストのために抽出されるため、検証関数は同じ秘密鍵を使用してdownloads.example.comへのすべてのリクエストURIを評価します。
同じ秘密鍵を使用して複数のパスを認証することはできますが、認証したい各ユニークメッセージに対してHMACトークンを生成する必要があることに注意してください。