公開日:2023年11月17日最終更新日: 2023年11月17日
AWS WAFの標準サイズがアップデートされ、ルールの検査条件に「JA3フィンガープリント」が追加されました。AWS WAFのログフィールドには「ja3Fingerprint」も新設され、アクセスごとにJA3フィンガープリントを確認できるようにもなっています。今回は、AWS WAFに新しく追加された、JA3フィンガープリントについて解説します。
目次 <Contents>
そもそもJA3フィンガープリントとは
JA3はTLSネゴシエーションの「TLS Client Hello」に格納されている情報を用いて、新しく算出される値を指します。詳細は割愛しますが、JA3がGitHubで公開しているため、そちらを参照すれば詳細なアルゴリズムを確認可能です。仕組みがブラックボックスというわけではありません。
TLS Client Helloは、接続元のクライアントが同じであれば、基本的に同じ情報が格納され続けます。IPアドレスやセッション、Cookieなどは状況によって変化する可能性がありますが、TLS Client Helloは基本的に変化しないのです。そのため、これを用いて算出されるフィンガープリントの値も変化することもないという点に注目しておきましょう。
JA3フィンガープリントによるアクセス制御
従来のAWS WAFは、 IP アドレスや ユーザーエージェントなど、 ヘッダーに含まれる情報で送信元を判別していました。 事前にブラックリストを用意しておき、 これに該当する通信は遮断するなどしていたのです。ただ、 IP アドレスのリストは頻繁に更新されるとはいえども、攻撃者も頻繁に IP アドレスを変更する場合には対応できませんでした。
しかし、 上記のとおりJA3フィンガープリントは、TLS Client Helloから算出される変化しない値です。そのため、この値を共有することによって、悪意のあるクライアントからのアクセスを防ぐことができます。例えば、海外で発生した攻撃のクライアントについて、JA3フィンガープリントの値を共有してもらえば、日本国内でもAWS WAFによってアクセスを防げるのです。
なお、TLS Client HelloはIPアドレスのように頻繁に変化するものではないものの、絶対に変化しないものではありません。例えば、TLSのハンドシェイクが変更されると、TLS Client Helloも変化してしまいます。この場合、JA3フィンガープリントとAWS WAFの組み合わせをもってしても、攻撃者からのアクセスは防げません。
AWS WAFにJA3フィンガープリントを適用する流れ
上記で、AWS WAFにどのようなルールが追加されたのか、概ね理解していただけたのではないでしょうか。続いては、実際にJA3フィンガープリントを導入したい場合、どのような操作が必要となるのか紹介します。
ルールの適用
Web ACL画面から「Rules」を選択し、「Add rules」ボタン>「Add my own rules and rule groups」の順にをクリックします。
ルールの名称を入力します。
「Statement」の 「Inspect」に「JA3 fingerprint」と入力し、検索結果を選択します。
本来は、Match typeを選択する必要がありますが、JA3フィンガープリントでは選択できません。そのため、基本的には初期設定を変更することなく、ルールを適用して差し支えありません。
基本的に操作は「Block」になると考えられますが、何かしら別の操作としたい場合には変更します。
改めて全体を確認し「Add Rule」をクリックします。
以下のとおり、ルールが作成されていれば完了です。
AWS WAFの確認
JA3フィンガープリントの設定状況を確認する際は、AWS WAFのログを確認します。一般的には、CloudWatch LogsかS3に出力しているでしょう。それらのログを参照すると、以下の記載があるはずです。
"ja3Fingerprint": "XXXXXXXXXX"
セキュリティのため具体的な値は伏せますが、ここに記載されている文字列が、クライアントのJA3フィンガープリント値ということになります。もし、アクセスを制御したいのであれば、この値をブロックするようにルールを設定する流れです。JSONでブロックするルールを定義するならば、以下のように定義します。
{
"Name": "WAF-ja3-test",
"Priority": 0,
"Action": {
"Block": {}
},
"VisibilityConfig": {
"SampledRequestsEnabled": true,
"CloudWatchMetricsEnabled": true,
"MetricName": "WAF-ja3-test"
},
"Statement": {
"ByteMatchStatement": {
"FieldToMatch": {
"JA3Fingerprint": {
"FallbackBehavior": "MATCH"
}
},
"PositionalConstraint": "EXACTLY",
"SearchString": "XXXXXXXXXX",
"TextTransformations": [
{
"Type": "NONE",
"Priority": 0
}
]
}
}
}
なお、検知した場合の動作は「Block」に設定しています。こちらの値はコンソールから設定したときと同様に「Count」や「CAPTCHA」などの値を設定することが可能です。接続をブロックすると「403エラー」の扱いになるため、別の要件がある場合は工夫すると良いでしょう。
ブロックされた通信があるかどうかを判定する際は、AWS WAFが出力するログから「terminatingRuleId」で検索すると良いでしょう。今回であれば「WAF-ja3-test」で検索してみます。
Google Chromeでのテストに注意
JA3フィンガープリントをテストするにあたっては、Google Chromeの挙動に注意しなければなりません。ブラウザの仕様上、TLS Client Helloの値が変動することがあり、それに伴いJA3フィンガープリントの値も変化することがあります。テストしても思うような挙動にならないかもしれません。
この場合は、異なるブラウザを利用することで基本的には解決します。また、ブラウザではなく、アプリケーションからAWS WAFを経由する形でアクセスすればテストが可能です。
セキュリティ強化には複数の組み合わせが重要
今回は、JA3フィンガープリントを活用してアクセス制御する方法を解説しています。ただ、残念ながらフィンガープリントも完璧な仕組みではないため「これさえ導入すればセキュリティ対策は完璧」という訳ではありません。もし、この点を誤認識している人がいるならば、改めるようにしてください。
AWS WAFにJA3フィンガープリントを導入したとしても、今までと同様にIPアドレスやユーザーエージェントによるアクセス制御も必要です。むしろ、これらが導入されている環境に、追加でJA3フィンガープリントを導入すると考えましょう。全てを組み合わせることによって、今まで以上に強靭なセキュリティを実現できるようになるのです。
まとめ
AWS WAFに新しく追加された、JA3フィンガープリントを採用したルールについて解説しました。JA3フィンガープリントは、TLS Client Helloを元に値を算出して接続の可否を判断するもので、IPアドレスやユーザーエージェントのように頻繁に変化しないことが特徴です。そのため、攻撃者がIPアドレスを変更してアクセスしてくる場合でも、JA3フィンガープリントならばブロックしやすくなります。
ただ、TLS Client Helloは全く変化しない値というわけではないため、JA3フィンガープリントだけでセキュリティが完璧になるわけではありません。AWS WAFには、いくつもの機能やルールが備わっているため、JA3フィンガープリントを組み合わせてセキュリティを高めることが重要です。設定しておいて大きな問題にはなりにくいため、この機会にぜひ採用をご検討ください。