JA3フィンガープリンティングの有効化¶
本記事では、NGINXなどの主要なソフトウェアやAWS、Google Cloud、AzureなどのインフラでJA3フィンガープリンティングを有効化する方法を説明します。
概要¶
攻撃者は、ユーザーエージェント(UA)偽装やIPローテーションなど、セキュリティ対策を回避するさまざまな手法を頻繁に用います。これらの手法により、未認証トラフィックにおける振る舞いベースの攻撃の検知が難しくなります。JA3フィンガープリンティングは、クライアントとサーバー間のTLSネゴシエーション中に定義される特定のパラメータからMD5ハッシュを生成します。このフィンガープリンティング手法は、APIセッション処理の一環として脅威アクターの識別を強化し、API不正利用対策における行動プロファイルの構築にも寄与します。
NGINX¶
NGINXからJA3フィンガープリントを取得できると、NGINXベースのWallarmのすべてのデプロイオプションでこの識別手法を利用できます。JA3用のNGINXモジュールは2つあります。
モジュール | 説明 | インストール |
---|---|---|
nginx-ssl-ja3 | JA3向けの主要なnginxモジュールです。THIS IS NOT PRODUCTION の表示があるため、動作の保証はありません。 | 手順 |
nginx-ssl-fingerprint | JA3向けの2つ目のnginxモジュールです。high performance のラベルがあり、スターやフォークもあります。 | 手順 |
どちらのモジュールでも、OpenSSLとNGINXにパッチを適用する必要があります。
モジュールのインストール例(nginx-ssl-fingerprint
モジュールからの例):
# クローン
$ git clone -b OpenSSL_1_1_1-stable --depth=1 https://github.com/openssl/openssl
$ git clone -b release-1.23.1 --depth=1 https://github.com/nginx/nginx
$ git clone https://github.com/phuslu/nginx-ssl-fingerprint
# パッチ適用
$ patch -p1 -d openssl < nginx-ssl-fingerprint/patches/openssl.1_1_1.patch
$ patch -p1 -d nginx < nginx-ssl-fingerprint/patches/nginx.patch
# 設定とビルド
$ cd nginx
$ ASAN_OPTIONS=symbolize=1 ./auto/configure --with-openssl=$(pwd)/../openssl --add-module=$(pwd)/../nginx-ssl-fingerprint --with-http_ssl_module --with-stream_ssl_module --with-debug --with-stream --with-cc-opt="-fsanitize=address -O -fno-omit-frame-pointer" --with-ld-opt="-L/usr/local/lib -Wl,-E -lasan"
$ make
# テスト
$ objs/nginx -p . -c $(pwd)/../nginx-ssl-fingerprint/nginx.conf
$ curl -k https://127.0.0.1:8444
NGINX設定の例:
server {
listen 80;
server_name example.com;
…
# JA3フィンガープリントのヘッダーを別のアプリにプロキシ転送します。
proxy_set_header X-Client-TLS-FP-Value $http_ssl_ja3_hash;
proxy_set_header X-Client-TLS-FP–Raw-Value $http_ssl_ja3;
# リクエストをプロキシ先のアプリに転送します。
proxy_pass http://app:8080;
}
AWS¶
AWS CloudFrontからJA3フィンガープリントを取得するように設定できます。
WallarmはCloudFrontと連携して、CloudFront-Viewer-JA3-Fingerprint
およびCloudFront-Viewer-TLS
のJA3ヘッダーを取得できます。
-
CloudFrontコンソールに移動し、Origin Request Policiesタブを選択します。
-
Create Origin Request Policyをクリックし、ポリシーの詳細を設定します。
-
Actionsセクションで、Add Headerを選択します。
-
Header Nameフィールドに
CloudFront-Viewer-JA3-Fingerprint
と入力します。 -
Createをクリックします。これでオリジンリクエストポリシーが作成されます。
-
作成したリクエストポリシーをCloudFrontディストリビューションにアタッチするには、以下の手順に従います。
-
CloudFrontコンソールで、ポリシーをアタッチするディストリビューションを選択します。
-
Origin Request Policiesの横にあるEditボタンをクリックします。
-
作成したポリシーのチェックボックスを選択して、変更を保存します。
これでオリジンリクエストポリシーがCloudFrontディストリビューションにアタッチされました。ディストリビューションにリクエストを送信するクライアントのリクエストには、
CloudFront-Viewer-JA3-Fingerprint
ヘッダーが追加されます。
Google Cloud¶
従来のGoogle Cloud Application Load Balancerでカスタムヘッダーを設定し、tls_ja3_fingerprint
変数経由でその値を取得することで、JA3フィンガープリントを取得するように設定できます。
-
Google Cloudコンソールに移動し、Load balancingを開きます。
-
Backendsをクリックします。
-
バックエンドサービス名をクリックし、Editをクリックします。
-
Advanced configurationsをクリックします。
-
Custom request headersの下でAdd headerをクリックします。
-
Header nameを入力し、Header valueに
tls_ja3_fingerprint
を設定します。 -
変更を保存します。
詳細な手順はこちらをご覧ください。
設定リクエストの例:
PATCH https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/BACKEND_SERVICE_NAME
"customRequestHeaders": [
"X-Client-TLS-FP-Value: {tls_ja3_fingerprint}"
]
Azure¶
AzureでのWallarmデプロイでは、上記で説明したNGINXからJA3フィンガープリントを取得する方法を使用します。