unmask

docs

JA4 取得、LB 設定、対応 distro、よくある質問。

JA4 fingerprint は、TLS handshake (ClientHello) から取り出すクライアントの「指紋」です。攻撃ツールごとに決まっていて、IP / 国 / VPN / User-Agent を切り替えても変わりません。

ただし JA4 を取得できるかどうかは、「誰が TLS handshake を最初に受け取るか (TLS 終端の位置)」で決まります。このページでは代表的な構成パターンごとに可否を一覧します。

結論:TLS 終端の位置で決まる

[Client] ──TLS handshake──▶ [ ここで ClientHello を見た者だけが JA4 を計算できる ]

JA4 を計算するには 生の ClientHello バイト列が必要です。TLS を復号した後の平文 HTTP しか見ていないプロセスは、後から JA4 を組み立てられません。

構成パターン別の JA4 可否

JA4 を計算するには 生の ClientHello バイト列が要るので、可否は TLS をどこで終端するか(= クライアントの ClientHello を最初に見る点)と unmask のモード(native / forward-auth)だけで決まります。後段のアプリは無関係です。

= unmask インストールノード  = TLS 終端 (ここで ClientHello を見る)

構成 (クライアント → …) JA4 unmask 設定
① 前段に LB (unmask 同居) +後段アプリ — unmask が TLS 終端
★●LB nginx (native) → httpdなし (プラグインが算出)
★●LB nginx (forward-auth) → httpd不可— ClientHello を見る役がいない
★●LB apache (forward-auth) → httpd不可
② アプリ直 — unmask が TLS 終端
★●nginx (native)なし
★●nginx (forward-auth)不可
★●apache (forward-auth)不可
③ 前段 (CDN / LB) が TLS 終端 (Cloudflare / GCP HTTPS LB / AWS ALB・CloudFront 等) +後段アプリ
★CDN → ●LB nginx (native) → httpd「信頼する LB / CDN」で選択
★CDN → ●LB nginx (forward-auth) → httpd「信頼する LB / CDN」で選択
★CDN → ●LB apache (forward-auth) → httpd「信頼する LB / CDN」で選択
④ 前段 (CDN / LB) が TLS 終端 + unmask 直
★CDN → ●nginx (native)「信頼する LB / CDN」で選択
★CDN → ●nginx (forward-auth)「信頼する LB / CDN」で選択
★CDN → ●apache (forward-auth)「信頼する LB / CDN」で選択
  • native = nginx + unmask-plugin-nginx。C モジュールが ClientHello を直接解析して JA4 を算出 (最速・サブリクエスト無し・CentOS 6 等の古い distro でも動作)。JA4 を使うならこれ。
  • forward-auth = プラグイン無しで auth_request / Apache mod_lua に委譲。自分で TLS を見ないので、前段 (CDN / LB) が JA4 を転送しない限り JA4 は空 (UA / IP / rate / honeypot で運用)。
  • Apache は native プラグイン非対応 (2.4 の mod_ssl は JA4 のメタデータを出さない。2.6+ はメタデータを公開するが unmask は未対応)。Apache で JA4 が要るなら前段 (CDN / LB) の転送一択。
  • ③④ で forward-auth を使う場合も、native と同じく管理画面の「信頼する LB / CDN」で前段 (CDN / LB) を選ぶだけ。unmask が「その LB の IP から来た X-Client-JA4 だけを採用する」gate を生成し、同梱の server.inc がその gate 済みの値を自動で /api/check へ渡す (トグルも手作業の配線も不要)。手順 → LB / CDN 設定

JA4 が取れないとどうなる?

JA4 が空でも unmask は動作します。bot 判定は以下のシグナルで続行されます。

  • User-Agent 分類 — 250+ パターンのクローラー / bot UA リストで既知 bot を識別
  • 公式 IP 範囲 — Googlebot / Bingbot 等の公式範囲を通過リストに登録 (順位事故防止)。UA リストと OR で適用 (どちらかが一致すれば素通し)
  • rate-limit — IP × パス単位の閾値超過で challenge に格上げ
  • honeypot — 登録した罠パス (運用していない CMS パス等) を踏んだ訪問者を BAN
  • behavioral CAPTCHA — mouseTrail / scroll / keyboard 等 5 軸の人間らしさスコア
JA4 が無い場合に bot 判定の精度が落ちるのは「正規ブラウザを装うステルス bot」の検出です。UA も IP も綺麗に偽装した bot は、TLS の癖 (JA4) でしか見破れません。逆に言えば JA4 さえ取れれば、IP の入れ替えや UA 偽装を貫通して同一ツールを追跡できます。

まとめ — どの構成を選ぶか

  • JA4 をフル活用したい → nginx + unmask-plugin-nginx (native mode)。nginx が TLS を終端していること
  • 前段 (CDN / LB) がある → そこで JA4 を取り出す → X-Client-JA4 を転送
  • Apache / プラグイン不可の環境 → forward-auth mode。JA4 抜きで UA / IP / rate / honeypot で運用

インストール手順は インストールガイド を参照してください。