コンテンツにスキップ

JA3フィンガープリンティングを有効化する

本記事では、NGINXなどの主要なソフトウェアや、AWS、Google Cloud、Azureといったインフラにおいて、JA3フィンガープリンティングを有効化する方法について説明します。

概要

攻撃者は、ユーザーエージェント(UA)の偽装やIPローテーションなど、セキュリティ対策を回避するための様々な手法を頻繁に用います。これらの手法により、未認証トラフィックにおける行動ベースの攻撃が検出しにくくなります。JA3フィンガープリンティングは、クライアントとサーバ間のTLSネゴシエーション中に定義される特定のパラメーターからMD5ハッシュを生成します。このフィンガープリンティング手法は、API sessionの処理の一環として脅威アクターの識別を強化し、API abuse preventionのための行動プロファイル構築にも寄与します。

NGINX

NGINXでJA3フィンガープリンティングを取得する機能により、すべてのNGINXベースのWallarm deployment optionsでこの識別手法が利用可能となります。JA3用のNGINXモジュールは2種類存在します:

モジュール 説明 インストール
nginx-ssl-ja3 JA3用のメインNGINXモジュールです。THIS IS NOT PRODUCTIONの表示があるため、成功が保証されません。 Instructions
nginx-ssl-fingerprint JA3用の第2のNGINXモジュールです。high performanceの評価があり、スターやフォークも多くなっています。 Instructions

どちらのモジュールにおいても、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

Example NGINX configuration:

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ヘッダーを取得できます:

  1. CloudFrontコンソールにアクセスし、Origin Request Policiesタブを選択します。

  2. Create Origin Request Policyをクリックし、ポリシーの詳細を設定します。

    CloudFront - オリジンリクエストポリシーの作成

  3. Actionsセクションで、Add Headerを選択します。

  4. Header NameフィールドにCloudFront-Viewer-JA3-Fingerprintと入力します。

    CloudFront - オリジンリクエストポリシーへのヘッダー追加

  5. Createをクリックします。これにより、オリジンリクエストポリシーが作成されます。

  6. 作成したリクエストポリシーをCloudFrontディストリビューションに紐づけるには、以下の手順に従います。

  7. CloudFrontコンソールで、ポリシーを紐づけるディストリビューションを選択します。

  8. Origin Request Policiesの横にあるEditボタンをクリックします。

  9. 作成したポリシーの横のチェックボックスを選択し、変更を保存します。

    CloudFront - ディストリビューションへのポリシー紐づけ

これで、オリジンリクエストポリシーがCloudFrontディストリビューションに紐づけられました。ディストリビューションにリクエストを行うクライアントのリクエストには、CloudFront-Viewer-JA3-Fingerprintヘッダーが追加されます。

Google Cloud

クラシックGoogle Cloud Application Load Balancerにおいて、カスタムヘッダーを設定し、tls_ja3_fingerprint変数を通じてその値を取得することで、JA3フィンガープリンティングを取得する設定が可能です:

  1. Google Cloudコンソールにアクセスし、→ Load balancingをクリックします。

  2. Backendsをクリックします。

  3. バックエンドサービスの名前をクリックし、次にEditをクリックします。

  4. Advanced configurationsをクリックします。

  5. Custom request headersの下で、Add headerをクリックします。

  6. Header nameに適当なヘッダー名を入力し、Header valuetls_ja3_fingerprintと設定します。

  7. 変更を保存します。

詳細な手順についてはこちらを参照してください。

Example configuration request:

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フィンガープリンティングの取得方法を使用します。