FIDO Metadata Service (MDS)
概要
FIDO Metadata Service (MDS) は、FIDO Alliance が運営する認証器メタデータの配布サービスです。
このドキュメントで学 べること:
- MDS の目的と役割
- MDS BLOB の構造と各フィールドの意味
- MetadataStatement の詳細
- StatusReports による脆弱性管理
- MDS の取得・利用方法
対象読者:
- FIDO2 認証を実装する開発者
- セキュリティ担当者
MDS とは
目的と役割
┌─────────────────────────────────────────────────────────────────────────────┐
│ FIDO Metadata Service の役割 │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ 【MDS が解決する課題】 │
│ │
│ 課題 1: ルート CA 証明書の収集 │
│ ────────────────────────────────────────────────────────────────────────── │
│ - Attestation 検証には各認証器のルート CA が必要 │
│ - 認証器ベンダーは多数(Yubico, Feitian, Google, Apple, ...) │
│ - 個別に収集・管理するのは大変 │
│ → MDS が一元的に配布 │
│ │
│ 課題 2: 認証器の信頼性評価 │
│ ────────────────────────────────────────────────────────────────────────── │
│ - この認証器は FIDO 認定を受けているか? │
│ - セキュリティレベルは L1?L2?L3? │
│ - 既知の脆弱性はあるか? │
│ → MDS が認定状態と脆弱性情報を提供 │
│ │
│ 課題 3: 認証器情報の表示 │
│ ────────────────────────────────────────────────────────────────────────── │
│ - ユーザーに「どの認証器を使っているか」を表示したい │
│ - 認証器の名前、アイコンが必要 │
│ → MDS が description, icon を提供 │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
MDS の概念図
┌─────────────────────────────────────────────────────────────────────────────┐
│ MDS のデータフロー │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────┐ │
│ │ 認証器 │ │
│ │ ベンダー │──┐ │
│ └─────────────┘ │ │
│ ┌─────────────┐ │ メタデータ登録 │
│ │ 認証器 │──┼──────────────────┐ │
│ │ ベンダー │ │ │ │
│ └─────────────┘ │ ▼ │
│ ┌─────────────┐ │ ┌─────────────────────────┐ │
│ │ 認証器 │──┘ │ FIDO Alliance │ │
│ │ ベンダー │ │ Metadata Service │ │
│ └─────────────┘ │ │ │
│ │ - メタデータを集約 │ │
│ │ - 署名付き BLOB を生成 │ │
│ │ - 定期的に更新 │ │
│ └───────────┬─────────────┘ │
│ │ │
│ │ HTTPS で配布 │
│ ▼ │
│ ┌─────────────────────────┐ │
│ │ Relying Party (RP) │ │
│ │ │ │
│ │ - BLOB をダウンロード │ │
│ │ - 署名を検証 │ │
│ │ - AAGUID で検索 │ │
│ │ - 認証器を評価 │ │
│ └─────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
MDS BLOB の構造
エンドポイント
URL: https://mds3.fidoalliance.org/
Method: GET
Response: JWT (JSON Web Token)
JWT の構造
MDS BLOB は JWT 形式で配布され、FIDO Alliance によって署名されています。
┌────────────────────────────────────────────────────────────── ───────────────┐
│ MDS BLOB (JWT) の構造 │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ JWT = Header.Payload.Signature │
│ │
│ ┌─────────────────────────────────────────────────────────────────────┐ │
│ │ Header (Base64URL デコード後) │ │
│ ├─────────────────────────────────────────────────────────────────────┤ │
│ │ { │ │
│ │ "alg": "ES256", // 署名アルゴリズム │ │
│ │ "typ": "JWT", │ │
│ │ "x5c": [ // 署名検証用の証明書チェーン │ │
│ │ "MIIB...", // 署名証明書 │ │
│ │ "MIIC...", // 中間 CA(オプション) │ │
│ │ ... │ │
│ │ ] │ │
│ │ } │ │
│ └─────────────────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────────────────┐ │
│ │ Payload (Base64URL デコード後) │ │
│ ├─────────────────────────────────────────────────────────────────────┤ │
│ │ { │ │
│ │ "legalHeader": "https://fidoalliance.org/...", │ │
│ │ "no": 123, // BLOB 番号(更新ごとに増加) │ │
│ │ "nextUpdate": "2025-02-01", // 次回更新予定日 │ │
│ │ "entries": [...] // 認証器メタデータの配列 │ │
│ │ } │ │
│ └─────────────────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────────────────┐ │
│ │ Signature │ │
│ ├─────────────────────────────────────────────────────────────────────┤ │
│ │ - Header.Payload を x5c[0] の秘密鍵で署名 │ │
│ │ - 検証時は x5c[0] の公開鍵を使用 │ │
│ │ - x5c の証明書チェーンを FIDO Alliance Root まで検証 │ │
│ └──────────────────────────────────────────────── ─────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
Payload のフィールド
| フィールド | 型 | 説明 |
|---|---|---|
legalHeader | string | 法的注意事項へのリンク |
no | integer | BLOB のシリアル番号。更新ごとに増加 |
nextUpdate | string | 次回更新予定日(ISO 8601 形式) |
entries | array | 認証器メタデータの配列 |
entries 配列の各要素
{
"aaguid": "ee882879-721c-4913-9775-3dfcce97072a",
"metadataStatement": {
// 認証器の詳細情報(後述)
},
"statusReports": [
// 認定状態・脆弱性情報(後述)
],
"timeOfLastStatusChange": "2024-01-15"
}
| フィールド | 型 | 説明 |
|---|---|---|
aaguid | string | 認証器の AAGUID(UUID 形式) |
metadataStatement | object | 認証器のメタデータ |
statusReports | array | 認定状態・脆弱性レポート |
timeOfLastStatusChange | string | 最終ステータス更新日 |
MetadataStatement の構造
全体像
┌─────────────────────────────────────────────────────────────────────────────┐
│ MetadataStatement の構造 │
├────────────────────────────────── ───────────────────────────────────────────┤
│ │
│ { │
│ // ─────────────── 基本情報 ─────────────── │
│ "description": "YubiKey 5 Series with NFC", │
│ "icon": "data:image/png;base64,iVBORw0KGgo...", │
│ "aaguid": "ee882879-721c-4913-9775-3dfcce97072a", │
│ │
│ // ─────────────── プロトコル情報 ─────────────── │
│ "protocolFamily": "fido2", │
│ "schema": 3, │
│ "upv": [ // 対応プロトコルバージョン │
│ { "major": 1, "minor": 0 }, │
│ { "major": 1, "minor": 1 } │
│ ], │
│ "authenticatorVersion": 328966, │
│ │
│ // ─────────────── 認証アルゴリズム ─────────────── │
│ "authenticationAlgorithms": ["secp256r1_ecdsa_sha256_raw"], │
│ "publicKeyAlgAndEncodings": ["cose"], │
│ │
│ // ─────────────── セキュリティ特性 ─────────────── │
│ "keyProtection": ["hardware", "secure_element"], │
│ "matcherProtection": ["on_chip"], │
│ "cryptoStrength": 128, │
│ │
│ // ─────────────── ユーザー検証 ─────────────── │
│ "userVerificationDetails": [[...]], │
│ │
│ // ─────────────── Attestation ─────────────── │
│ "attestationTypes": ["basic_full"], │