【目次】
1. はじめに
2023年9月27日にAWS WAFがJA3フィンガープリントを検査対象に指定できるようになったと発表がありました。
AWS WAF now supports JA3 Fingerprint Match
本ブログでは、このアップデートについて紹介します。
2. JA3フィンガープリントとは
JA3フィンガープリントは、リクエストのTLS Client Helloに含まれるTLSバージョンや暗号スイート等いくつかの値から算出される32桁のMD5ハッシュ値です。
GitHub – salesforce/ja3: JA3 is a standard for creating SSL client fingerprints in an easy to produce and shareable way.
AWS WAFにてこの値を取得できた場合には、WAFログの「ja3Fingerprint」の項目に値が記載されます。
AWS WAFのJA3フィンガープリントに関する詳細は、以下のAWS公式ドキュメントもご参考ください。
Request component options – AWS WAF, AWS Firewall Manager, and AWS Shield Advanced
3. ルールの設定方法
JA3フィンガープリントを検査するルールの作成方法は以下の通りです。
1. Web ACL画面の右側にある [Add rules] ボタンをクリックし、 [Add my own rules and rule groups] をクリックする
2. ルール名を入力する
3. [Statement] の [Inspect] の箇所で、[JA3 fingerprint] を選択する

4. [String to match] にマッチしたい値を入力する
JA3フィンガープリントの場合、Match typeは完全一致のみとなるようです。
そのため、ルール設定時には当該の項目は変更できないようになっています。

5. [Fallback for missing JA3 fingerprint] にて [Match] あるいは [No match] のいずれかを選択する
この項目は、AWS WAFがJA3フィンガープリントを計算できなかった場合にルールにマッチさせるかどうかを指定する項目となります。
Matchの場合はルールにマッチしたとみなし、指定したアクションを適用します。
No matchの場合は、当該ルールにはマッチしません。
6. アクションを選択し、 [Add rule] をクリックする
4. ルールのテスト
まずは、テストを実施するためにJA3フィンガープリントの値を取得します。
AWS WAFにて取得できた場合、WAFログに値が記載されるそうですので、対象の環境に通常通りアクセスします。
WAFログを確認すると、確かに以下のような形で記載がありました。
"ja3Fingerprint": "JA3フィンガープリントの値"
実際の値はマスクしていますが、WAFログに記載された値を用いてJA3フィンガープリントでブロックするルールを作成します。
フォールバックは、No matchを指定しています。
{
"Name": "ja3-fingerprint-test",
"Priority": 0,
"Action": {
"Block": {}
},
"VisibilityConfig": {
"SampledRequestsEnabled": true,
"CloudWatchMetricsEnabled": true,
"MetricName": "ja3-fingerprint-test"
},
"Statement": {
"ByteMatchStatement": {
"FieldToMatch": {
"JA3Fingerprint": {
"FallbackBehavior": "NO_MATCH"
}
},
"PositionalConstraint": "EXACTLY",
"SearchString": "JA3フィンガープリントの値",
"TextTransformations": [
{
"Type": "NONE",
"Priority": 0
}
]
}
}
}
ルールを適用後に対象の環境にアクセスしたところ、403エラーが表示されブロックされたことがわかりました。
<html> <head><title>403 Forbidden</title></head> <body> <center><h1>403 Forbidden</h1></center> </body> </html>
WAFログでは以下の通り、JA3フィンガープリントの値で検知するルールでブロックされたことがわかります。
{
"timestamp": 1696395560834,
"formatVersion": 1,
"webaclId": "Web ACLのARN",
"terminatingRuleId": "ja3-fingerprint-test",
"terminatingRuleType": "REGULAR",
"action": "BLOCK",
"terminatingRuleMatchDetails": [],
"httpSourceName": "ALB",
"httpSourceId": "関連づけられたリソースのID",
"ruleGroupList": [],
"rateBasedRuleList": [],
"nonTerminatingMatchingRules": [],
"requestHeadersInserted": null,
"responseCodeSent": null,
"httpRequest": {
"clientIp": "IPアドレス",
"country": "JP",
"headers": [
{
"name": "host",
"value": "Hostの値"
},
{
"name": "user-agent",
"value": "curl/7.86.0"
},
{
"name": "accept",
"value": "*/*"
}
],
"uri": "/",
"args": "",
"httpVersion": "HTTP/2.0",
"httpMethod": "GET",
"requestId": "リクエストID"
},
"ja3Fingerprint": "JA3フィンガープリントの値"
}
なお、Google Chromeでは接続のたびに異なるJA3フィンガープリントが生成される機能が搭載されているため、Chromeでテストを行うと検知できない場合がありました。
WAFログを確認した範囲では、比較的短い時間で連続してリクエストを送信した場合には同じJA3フィンガープリントとなるようですが、少し時間をあけた際には値が変わってしまい検知できなくなっていました。
5. WafCharm での対応
WafCharmをご利用のWeb ACLにてJA3フィンガープリントを検査するルールをご利用いただくことは可能です。
また、カスタマイズ対応も可能です。
カスタマイズをご希望の場合には、WafCharmサポートまでお問い合わせください。
6. おわりに
JA3フィンガープリントはクライアントによって固定されている場合があります。
IPアドレスやドメインなどが変化しても、JA3フィンガープリントが固定されていればその値を用いてブロックするといった対応が可能になります。
ただし、Chromeのように異なるJA3フィンガープリントが生成される機能が搭載されているなど、環境によってはJA3フィンガープリントが固定されないケースもありますので、JA3フィンガープリントのみの対策では不十分な場合がある可能性について認識しておく必要があるかと思います。
