ZTXBAS:フィッシング耐性のある生体認証
現代のアプリケーション向け生体認証
スタンドアロンのZTXBASは、開発者が自身のアプリケーションに生体認証を組み込むための、無料のセルフホスト型認証サーバーです。コンテナを一つ起動し、サンプルアプリを接続して、ZTXBASモバイルアプリでQRコードを読み取ると、CoreZTアカウント、ライセンスサーバー、外部へのテレメトリー送信なしでフィッシング耐性のある認証を評価できます。
ZTXGate内では、ZTXBASをライセンス対象の統合機能として利用できます。この場合はライブラリとして密結合され、独立したZTXBASサーバーの導入は不要です。オンライン、オンプレミス、ハイブリッド、完全なエアギャップ環境のZTXGateで動作します。
従来のMFAの課題
- SMSコード:SIMスワッピングで盗み取られる可能性があります。
- TOTPコード:リアルタイムのフィッシングプロキシに転送される可能性があります。
- プッシュ通知:繰り返し承認を求めるMFA疲労攻撃の標的になります。
- ハードウェアトークン:追加費用がかかり、紛失する場合があります。
現代のフィッシング攻撃はリアルタイムで認証情報やコードを中継します。認証操作を正しいアプリケーションと暗号学的に結び付けることが重要です。
ZTXBASの仕組み
ZTXBASは生体認証と暗号学的なオリジンバインディングを組み合わせます。各認証リクエストを正規アプリケーションのオリジンに関連付けるため、phishing.example.comで得た承認をapp.example.comにそのまま再利用することはできません。

認証フロー
- ユーザーがアプリケーションでログインを開始します。
- アプリがユーザーIDとオリジンを指定し、
POST /v1/auth/challengeを呼び出します。 - ZTXBASは登録済みオリジンと照合してチャレンジを検証し、スマートフォンへ送信します。
- ユーザーはFace ID、Touch ID、指紋などで承認します。
- アプリは
GET /v1/auth/status/{id}をポーリングするか署名付きWebhookを受信し、成功時にユーザーとオリジンに結び付いた短寿命のES256 JWT IDアサーションを取得します。 - アプリは
/.well-known/jwks.jsonの公開JWKSでJWTを検証し、自身のセッションを作成します。
セキュリティ上の境界はJWTの検証です。リライングパーティーは通信経路だけを信頼する必要はありません。
フィッシングに強い理由
- オリジンバインディング:登録済みオリジンにチャレンジを結び付け、承認前にアプリでオリジンを表示します。
- デバイスに紐付く鍵:秘密鍵をSecure EnclaveやTEEに保存します。生体認証テンプレートはデバイス外に出ません。
- 共有秘密情報に依存しない方式:短寿命の署名付きアサーションで検証し、盗聴・フィッシング・リプレイに対する保護を強化します。
提供されるコンポーネント
ZTXBASサーバー
単一のコンテナで動作し、データ保存にはSQLite(WAL)を利用します。
- HMAC-SHA256で署名するAPI(約12エンドポイント)
- 署名付きJWT IDアサーションと公開JWKS
- HMAC署名・再試行付きWebhook
- アプリケーション、ユーザー、オリジン、チャレンジを管理する内蔵コンソール
- JSON形式の構造化ログとアプリケーションごとのレート制限
- 本番環境ではHTTPSを使用し、開発時のみ
127.0.0.1上でHTTPを許可
配布: GitHub Container RegistryのOCIイメージghcr.io/corezt/ztxbas、およびGitHub ReleasesのLinux静的バイナリ(amd64、arm64)。
ZTXBASモバイルアプリ
スタンドアロンとZTXGate統合版で同じアプリを使います。サーバーを後から変更してもスマートフォンアプリを入れ替える必要はありません。
- iOS:Face ID/Touch ID、Secure Enclave、iOS 14以降。 App Store
- Android:指紋/顔認証、ハードウェア保護されたキーストア、Android 8以降。 Google Play
SDK
公式SDKはHMAC署名、ポーリング、JWT検証を支援します。
- Go —
github.com/corezt/ztxbas/sdk-go - Node / TypeScript —
@corezt/ztxbas - Python —
corezt-ztxbas
ZTXGateでのZTXBAS
スタンドアロン版とZTXGate統合版では、同じモバイル認証アプリを利用しますが、導入モデルが異なります。
| 項目 | スタンドアロンZTXBAS | ZTXGate統合ZTXBAS |
|---|---|---|
| 主な用途 | 独自アプリへの生体認証追加 | ZTXGateのアクセスポリシーに基づく追加生体認証 |
| 料金 | 無料 | ZTXGateのライセンス対象機能 |
| サーバー | 独立したZTXBASサーバー/コンテナ | 別サーバー不要、ライブラリ統合 |
| オンライン環境 | 対応 | 対応 |
| エアギャップ環境 | 対応 | 対応 |
| モバイルアプリ | ZTXBASアプリ | 同じZTXBASアプリ |
独自アプリに直接組み込むならスタンドアロン版、ZTXGateでのアクセス制御に組み込むならライセンス済みの統合版を使用します。
統合例
# 認証チャレンジを要求
curl -X POST https://ztxbas.example.com/v1/auth/challenge \
-H "X-Application-ID: app_a1b2c3d4e5" \
-H "X-Signature: <HMAC-SHA256 signature>" \
-H "Content-Type: application/json" \
-d '{
"email": "alice@example.com",
"origin": "https://app.example.com"
}'
# レスポンス
{
"challenge_id": "ch_abc123",
"expires_in": 120,
"origin_display": "Example App",
"origin_url": "https://app.example.com",
"challenge_hmac": "..."
}
SDKを使えば署名を手作業で生成する必要はありません。導入ガイドで実行手順を確認してください。
セキュリティ対策
- 本番環境でHTTPSを必須とし、HTTPはループバックだけに制限
- HMAC-SHA256リクエスト署名とタイミングセーフな比較
- 初回起動時に自動生成するJWT署名鍵(ファイルモード0600)
- 管理コンソール:PBKDF2-HMAC-SHA256(60万回)によるパスワードハッシュ、セッションクッキー、任意のZTXBAS生体認証保護
- SQLite WALモードとファイルモード0600
- シークレットをログに記録せず、標準出力へ構造化JSONを出力
- 公開APIではアプリケーション単位、管理画面ではIP単位でレート制限
詳しくはハードニングガイドをご覧ください。
スタンドアロン版の料金
ZTXBASのスタンドアロン版は無料です。バイナリとコンテナイメージはCoreZT EULAに基づきGitHubで配布されます。CoreZTアカウント、テレメトリー、ライセンスサーバーは不要です。ZTXGateへの統合機能は商用ライセンス対象です。ZTXGateの料金
よくある質問
スマートフォンを紛失したら?
DELETE /v1/users/{id}または管理画面からユーザー登録を解除すると、そのデバイスの鍵は直ちに無効になります。アカウント回復フローで新しいデバイスを登録してください。
スタンドアロンZTXBASはオフラインで動作しますか?
はい。エアギャップネットワーク内でセルフホストできます。登録メールにはSMTPが必要なので、内部リレーを利用できます。ZTXGate統合版も別サーバーなしで隔離環境に対応します。
パスキー/WebAuthnとの違いは?
どちらもフィッシング耐性があります。パスキーは制御可能なブラウザーログインに便利です。ZTXBASはサーバーを介したプッシュ方式で、モバイル、CLI、サービス間処理にも対応し、サーバー側で利用する署名付きJWTを提供します。両者は補完的です。
ZTXBASはFIDO認証を取得していますか?
いいえ。デバイス側のECDSA、HMAC、JWTなど類似の暗号要素を使用しますが、FIDO認証製品ではありません。
ZTXGateが必要になるのはいつですか?
マルチテナント、管理者RBACとSSO、SCIM、デバイスポスチャー、SIEM、広範なネットワークリソースへのアクセス制御(SSH/RDPなど非Webサービスを含む)が必要ならZTXGateを検討してください。Webアプリ向けのHTTP/HTTPSクライアントレスアクセスもライセンス機能として提供します。
利用を開始する
CoreZT提供 · ネットワーク全体のゼロトラストにはZTXGateをご覧ください。