この記事はアイスタイル Advent Calendar 2025 15日目の記事です
はじめに
こんにちは、oniyanagigです
アイスタイルではクラウドインフラとしてAWSを利用しており、セキュリティの観点からAWS WAFを導入しています
AWS WAFはAWS上でシステムを構築するうえでほぼ必須のサービスで、使われたことがある方も多いはず…
悪質なBotや不審なアクセスをブロックすることを課題として導入&構築に取り組まれている方もいると思います
アイスタイルでも同様に、色々なロケーションや送信元からのアクセスがある中で、不正なアクセスを判別&ブロックするための方法を検討しています
その手法の一つとして、AWSサポートの方から 「JA4フィンガープリント」 について教えていただきました
丁度いい機会ですので、アドカレついでに確認していきたいと思います!
JA4フィンガープリントとは?
JA4フィンガープリント は、 JA4 というフィンガープリント手法で算出されたTLSフィンガープリントの一種で、FoxIO社によるJA4+スイートの一部になります
JA4+には様々なNWフィンガープリントのメソッドがあり、JA4はそのうちのTLSクライアントフィンガープリントを指します
JA4ではTLSハンドシェイクにおけるClient Helloをもとにフィンガープリントを算出しており、同一クライアント(OS、ブラウザバージョンなど)からの通信であれば同一の値を示します
例えば、JA4フィンガープリントが全く一緒で、複数IPや様々なUAからのアクセスがあった場合、通常では複数のクライアントからの通信であるため、怪しいリクエストである可能性が高いと判断できるかと思います
一方で、たまたま同一の環境だった場合もフィンガープリントは一致するため、フィンガープリントからユーザを特定することはできない点に注意が必要です
過去、JA3フィンガープリントというものがあり…ということについては、詳しい方々がまとめていただいているので参考を見ていただきつつ、AWSにおけるJA4フィンガープリントについて確認していきます
AWSで確認
AWSでは2025/03上旬に、WAFでJA4フィンガープリントをサポートしています
まずはWAFログのフォーマットをリファレンスで見てみましょう
このうちja4fingerprintがJA4フィンガープリントにあたります
それでは実際にAthenaからWAFログを確認し、JA4フィンガープリントを見てみましょう
テーブルはリファレンスを参考に作成していきます
Athenaクエリサンプル
-- WAFログはs3://hoge/yyyy/MM/dd/HHに格納されている前提
CREATE EXTERNAL TABLE `waf_logs`(
`timestamp` bigint,
-- 省略 --
`ja4fingerprint` string,
`oversizefields` string,
`requestbodysize` int,
`requestbodysizeinspectedbywaf` int)
PARTITIONED BY (
`log_time` string
)
ROW FORMAT SERDE
'org.openx.data.jsonserde.JsonSerDe'
STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
's3://hoge/'
TBLPROPERTIES (
'has_encrypted_data'='false',
'projection.enabled'='true',
'projection.log_time.format'='yyyy/MM/dd/HH',
'projection.log_time.type'='date',
'projection.log_time.interval'='1',
'projection.log_time.interval.unit'='HOURS',
'projection.log_time.range'='2000/01/01/00,NOW+9HOURS',
'storage.location.template'='s3://hoge/${log_time}/')
-- パーティションメタデータ更新
MSCK REPAIR TABLE waf_logs;
-- サンプルクエリ
SELECT
timestamp,
ja3fingerprint,
ja4fingerprint
FROM waf_logs
WHERE log_time = 'yyyy/MM/dd/HH' --任意の日付
LIMIT 10;
先述のサポートのお知らせにもあった通り、JA4フィンガープリントをもとにレートベースのルールを作成することもできます
以下WAFルールを作成する際の画面になります
JA4フィンガープリントを集約キーとして、レートベースのルールを設定できるようになっています

また、検査範囲とレート制限にも同様にJA4フィンガープリントを指定することができます
「特定のJA4フィンガープリントのうちIPごとにレートで制限する」といったこともできそうです

IPやヘッダー、JA4フィンガープリントやその他の条件を組み合わせることで、不正なリクエストの検知&抑制に役立てることができるかと思います
終わりに
ざっくりですがAWS WAFにおけるJA4フィンガープリントの利用について確認しました
予防の観点ではなく、実際に攻撃があった場合にレートベースブロックのリストへ追加する形で運用するのが良さそうかなと思いました
そもそもJA4のことも知らなかったため、この機会で調べることができて良かったです
似たような方々の一助となれば幸いです
参考
