【目次】
- 1. はじめに
- 2. JA4 fingerprintの値をもとにブロックする
- 3. 同じJA4 fingerprintで集計してレート制限を行う
- 4. 特定のJA4 fingerprintの値にだけレート制限を行う
- 5. おわりに
1. はじめに
JA4 fingerprintは、TLS Client Helloをもとに算出した値で、リクエストの送信元を判別する際に使用できる、JA3 fingerprintの後続技術です。JA3/JA4 fingerprintはクライアントごとの識別子として活用できます。
AWS WAFでは、2025年3月のアップデートでJA4 fingerprintを用いた検査ができるようになりました。
クライアントの識別に使える手段としてはIPアドレスやUser-Agentなどがありますが、IPアドレスやUser-Agentを使うことが難しい場面もあるかと思います。もちろん、JA4 fingerprintも、IPアドレスやUser-Agentなどと同じように「これだけで必ずクライアントを識別できる」と断言できるものではありませんので、同一の通信ライブラリを使う正規ユーザーまで巻き込んでしまう誤検知リスクには注意が必要ですが、リクエストの送信元を判別する際に用いる値として、選択肢の1つにはなります。
今回は、そんなJA4 fingerprintを用いたルールの例をご紹介します。
2. JA4 fingerprintの値をもとにブロックする
これは、IPアドレスベースでブロックするルールと同じようなイメージで、特定のJA4 fingerprintの値を用いてブロックすることを目的としたルールです。
多数のリクエストが発生しているような状況で、IPアドレスは頻繁に変わっている場合でも、JA4 fingerprintの値は同一、というケースがあります。
IPアドレスが多種多様な値だとなかなか検知しづらいリクエストでも、JA4 fingerprintが同一ならブロックすることで、スパイクしたリクエストを素早くブロックできることもあるかと思います。
上記のとおり、複数のクライアントで同じJA4 fingerprintの値を持っている可能性もありますので、スパイク時の軽減策の1つとしてご活用いただき、状況が落ち着いたら別の対策を検討するといった運用の方が適している可能性はあります。
{
"Name": "ja4",
"Priority": 1,
"Statement": {
"ByteMatchStatement": {
"SearchString": "JA4 fingerprintの値",
"FieldToMatch": {
"JA4Fingerprint": {
"FallbackBehavior": "NO_MATCH"
}
},
"TextTransformations": [
{
"Priority": 0,
"Type": "NONE"
}
],
"PositionalConstraint": "EXACTLY"
}
},
"VisibilityConfig": {
"SampledRequestsEnabled": true,
"CloudWatchMetricsEnabled": true,
"MetricName": "ja4"
},
"Action": {
"Block": {}
}
}
3. 同じJA4 fingerprintで集計してレート制限を行う
こちらは、集約キーをJA4 fingerprintにした場合のレートベースルールです。
通常レートベースルールというとIPアドレスをもとにリクエスト数を集計して検知することをイメージするかと思います。この例では、JA4 fingerprintの値をもとにリクエスト数を集計します。
同じJA4 fingerprintの値を持つクライアントから多数のリクエストが発生したらブロックしたいといった場合にご利用いただくことを想定しています。
IPアドレスの値が頻繁に変わることで指定した閾値に達しないという場合にも、JA4 fingerprintならば検知できるというケースはあるかもしれません。
{
"Name": "ja4_custom_key",
"Priority": 1,
"Statement": {
"RateBasedStatement": {
"Limit": 100,
"AggregateKeyType": "CUSTOM_KEYS",
"EvaluationWindowSec": 300,
"CustomKeys": [
{
"JA4Fingerprint": {
"FallbackBehavior": "NO_MATCH"
}
}
]
}
},
"VisibilityConfig": {
"SampledRequestsEnabled": true,
"CloudWatchMetricsEnabled": true,
"MetricName": "ja4_custom_key"
},
"Action": {
"Block": {}
}
}
集約キーの活用方法については、レートベースルールの条件を詳細に指定できるようになりました などのブログ記事もご参考ください。
4. 特定のJA4 fingerprintの値にだけレート制限を行う
こちらは、スコープダウンステートメントを利用して特定のJA4 fingerprintの値にレートベースルールを適用するというものです。
集約キーは別途指定する必要がありますので、閾値を適用したい条件を別途検討する必要があります。
例えば、検知したいJA4 fingerprintの値がわかっている場合、集約キー「IPアドレス(Source IP)」と組み合わせることで、正規ユーザー込みで制限してしまうといった状況を回避できます。
{
"Name": "ja4_scope_down",
"Priority": 1,
"Statement": {
"RateBasedStatement": {
"Limit": 100,
"AggregateKeyType": "IP",
"EvaluationWindowSec": 300,
"ScopeDownStatement": {
"ByteMatchStatement": {
"SearchString": "t13d1517h2_8daaf6152771_5cd47779f5c5",
"FieldToMatch": {
"JA4Fingerprint": {
"FallbackBehavior": "NO_MATCH"
}
},
"TextTransformations": [
{
"Priority": 0,
"Type": "NONE"
}
],
"PositionalConstraint": "EXACTLY"
}
}
}
},
"VisibilityConfig": {
"SampledRequestsEnabled": true,
"CloudWatchMetricsEnabled": true,
"MetricName": "ja4_scope_down"
},
"Action": {
"Block": {}
}
}
スコープダウンステートメントには複数の条件を指定することもできますので、JA4 fingerprintとUser-Agentの組み合わせなどでより絞り込んだ条件を指定することでも、正規ユーザーへの影響を減らせるかもしれません。
5. おわりに
今回は、JA4 fingerprintの値を用いたルールの例を紹介しました。
Advanced RuleポリシーにてWafCharmをご利用の場合、2つ目の「同じJA4 fingerprintで集計してレート制限を行う」の例はWafCharmコンソールからも設定が可能です。
リクエストの急激な増加などでお困りの際には、JA4 fingerprintの活用もご検討ください。
