[{"data":1,"prerenderedAt":126},["ShallowReactive",2],{"i-heroicons:building-office-2":3,"i-heroicons:computer-desktop":8,"i-heroicons:cloud":10,"i-heroicons:server":12,"i-heroicons:folder":14,"i-heroicons:chart-bar":16,"i-heroicons:lock-closed":18,"i-heroicons:rectangle-stack":20,"i-heroicons:scale":22,"i-heroicons:key":24,"i-heroicons:finger-print":26,"i-heroicons:cpu-chip":28,"i-heroicons:document-text":30,"i-heroicons:shield-exclamation":32,"i-heroicons:shield-check":34,"blog-ja-fido2-enterprise-attestation-explained":36,"i-heroicons:user":124},{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":7},0,24,false,"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"M2.25 21h19.5m-18-18v18m10.5-18v18m6-13.5V21M6.75 6.75h.75m-.75 3h.75m-.75 3h.75m3-6h.75m-.75 3h.75m-.75 3h.75M6.75 21v-3.375c0-.621.504-1.125 1.125-1.125h2.25c.621 0 1.125.504 1.125 1.125V21M3 3h12m-.75 4.5H21m-3.75 3.75h.008v.008h-.008zm0 3h.008v.008h-.008zm0 3h.008v.008h-.008z\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":9},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"M9 17.25v1.007a3 3 0 0 1-.879 2.122L7.5 21h9l-.621-.621A3 3 0 0 1 15 18.257V17.25m6-12V15a2.25 2.25 0 0 1-2.25 2.25H5.25A2.25 2.25 0 0 1 3 15V5.25m18 0A2.25 2.25 0 0 0 18.75 3H5.25A2.25 2.25 0 0 0 3 5.25m18 0V12a2.25 2.25 0 0 1-2.25 2.25H5.25A2.25 2.25 0 0 1 3 12V5.25\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":11},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"M2.25 15a4.5 4.5 0 0 0 4.5 4.5H18a3.75 3.75 0 0 0 1.332-7.257a3 3 0 0 0-3.758-3.848a5.25 5.25 0 0 0-10.233 2.33A4.5 4.5 0 0 0 2.25 15\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":13},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"M21.75 17.25v-.228a4.5 4.5 0 0 0-.12-1.03l-2.268-9.64a3.375 3.375 0 0 0-3.285-2.602H7.923a3.375 3.375 0 0 0-3.285 2.602l-2.268 9.64a4.5 4.5 0 0 0-.12 1.03v.228m19.5 0a3 3 0 0 1-3 3H5.25a3 3 0 0 1-3-3m19.5 0a3 3 0 0 0-3-3H5.25a3 3 0 0 0-3 3m16.5 0h.008v.008h-.008zm-3 0h.008v.008h-.008z\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":15},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"M2.25 12.75V12A2.25 2.25 0 0 1 4.5 9.75h15A2.25 2.25 0 0 1 21.75 12v.75m-8.69-6.44l-2.12-2.12a1.5 1.5 0 0 0-1.061-.44H4.5A2.25 2.25 0 0 0 2.25 6v12a2.25 2.25 0 0 0 2.25 2.25h15A2.25 2.25 0 0 0 21.75 18V9a2.25 2.25 0 0 0-2.25-2.25h-5.379a1.5 1.5 0 0 1-1.06-.44\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":17},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"M3 13.125C3 12.504 3.504 12 4.125 12h2.25c.621 0 1.125.504 1.125 1.125v6.75C7.5 20.496 6.996 21 6.375 21h-2.25A1.125 1.125 0 0 1 3 19.875zm6.75-4.5c0-.621.504-1.125 1.125-1.125h2.25c.621 0 1.125.504 1.125 1.125v11.25c0 .621-.504 1.125-1.125 1.125h-2.25a1.125 1.125 0 0 1-1.125-1.125zm6.75-4.5c0-.621.504-1.125 1.125-1.125h2.25C20.496 3 21 3.504 21 4.125v15.75c0 .621-.504 1.125-1.125 1.125h-2.25a1.125 1.125 0 0 1-1.125-1.125z\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":19},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"M16.5 10.5V6.75a4.5 4.5 0 1 0-9 0v3.75m-.75 11.25h10.5a2.25 2.25 0 0 0 2.25-2.25v-6.75a2.25 2.25 0 0 0-2.25-2.25H6.75a2.25 2.25 0 0 0-2.25 2.25v6.75a2.25 2.25 0 0 0 2.25 2.25\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":21},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"M6 6.878V6a2.25 2.25 0 0 1 2.25-2.25h7.5A2.25 2.25 0 0 1 18 6v.878m-12 0q.354-.126.75-.128h10.5q.396.002.75.128m-12 0A2.25 2.25 0 0 0 4.5 9v.878m13.5-3A2.25 2.25 0 0 1 19.5 9v.878m0 0a2.3 2.3 0 0 0-.75-.128H5.25q-.396.002-.75.128m15 0A2.25 2.25 0 0 1 21 12v6a2.25 2.25 0 0 1-2.25 2.25H5.25A2.25 2.25 0 0 1 3 18v-6c0-.98.626-1.813 1.5-2.122\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":23},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"M12 3v17.25m0 0c-1.472 0-2.882.265-4.185.75M12 20.25c1.472 0 2.882.265 4.185.75M18.75 4.97A48 48 0 0 0 12 4.5c-2.291 0-4.545.16-6.75.47m13.5 0q1.515.215 3 .52m-3-.52l2.62 10.726c.122.499-.106 1.028-.589 1.202a6 6 0 0 1-2.031.352a6 6 0 0 1-2.031-.352c-.483-.174-.711-.703-.59-1.202zm-16.5.52q1.485-.305 3-.52m0 0l2.62 10.726c.122.499-.106 1.028-.589 1.202a6 6 0 0 1-2.031.352a6 6 0 0 1-2.031-.352c-.483-.174-.711-.703-.59-1.202z\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":25},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"M15.75 5.25a3 3 0 0 1 3 3m3 0a6 6 0 0 1-7.029 5.912c-.563-.097-1.159.026-1.563.43L10.5 17.25H8.25v2.25H6v2.25H2.25v-2.818c0-.597.237-1.17.659-1.591l6.499-6.499c.404-.404.527-1 .43-1.563A6 6 0 1 1 21.75 8.25\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":27},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"M7.864 4.243A7.5 7.5 0 0 1 19.5 10.5c0 2.92-.556 5.709-1.568 8.269M5.742 6.364A7.47 7.47 0 0 0 4.5 10.5a7.46 7.46 0 0 1-1.15 3.993m1.989 3.559A11.2 11.2 0 0 0 8.25 10.5a3.75 3.75 0 1 1 7.5 0q0 .79-.064 1.565M12 10.5a14.94 14.94 0 0 1-3.6 9.75m6.633-4.596a18.7 18.7 0 0 1-2.485 5.33\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":29},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"M8.25 3v1.5M4.5 8.25H3m18 0h-1.5M4.5 12H3m18 0h-1.5m-15 3.75H3m18 0h-1.5M8.25 19.5V21M12 3v1.5m0 15V21m3.75-18v1.5m0 15V21m-9-1.5h10.5a2.25 2.25 0 0 0 2.25-2.25V6.75a2.25 2.25 0 0 0-2.25-2.25H6.75A2.25 2.25 0 0 0 4.5 6.75v10.5a2.25 2.25 0 0 0 2.25 2.25m.75-12h9v9h-9z\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":31},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"M19.5 14.25v-2.625a3.375 3.375 0 0 0-3.375-3.375h-1.5A1.125 1.125 0 0 1 13.5 7.125v-1.5a3.375 3.375 0 0 0-3.375-3.375H8.25m0 12.75h7.5m-7.5 3H12M10.5 2.25H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 0 0-9-9\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":33},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"M12 9v3.75m0-10.036A11.96 11.96 0 0 1 3.598 6A12 12 0 0 0 3 9.75c0 5.592 3.824 10.29 9 11.622c5.176-1.332 9-6.03 9-11.622c0-1.31-.21-2.57-.598-3.75h-.152c-3.196 0-6.1-1.25-8.25-3.286m0 13.036h.008v.008H12z\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":35},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"M9 12.75L11.25 15L15 9.75m-3-7.036A11.96 11.96 0 0 1 3.598 6A12 12 0 0 0 3 9.749c0 5.592 3.824 10.29 9 11.623c5.176-1.332 9-6.03 9-11.622c0-1.31-.21-2.571-.598-3.751h-.152c-3.196 0-6.1-1.248-8.25-3.285\"\u002F>",{"id":37,"documentId":38,"title":39,"content":40,"slug":41,"published":42,"createdAt":43,"updatedAt":43,"publishedAt":44,"locale":45,"authorManual":46,"cover":47,"tags":90,"seo":121,"author":51},143,"arin4tqqi7jlk4l7invhsvln","FIDO2のEnterpriseAttestationについて","\u003Cp>先日、YubiOn FIDO Logonに企業向け認証器管理機能が実装されました。この機能を簡単に説明すると、セキュリティキーのシリアル番号を使って認証器の管理が出来る機能です。この機能を実現するために、FIDO2の「EnterpriseAttestation」と呼ばれる仕様を利用しています。ただ、こちらの仕様はFIDO仕様として制定されているものの、あまり一般的なものではないため、ブログなどでも踏み込んだ解説などは見かけないように思います。拙筆ながら、私の方でわかっている情報をまとめておこうかと思います。\u003C\u002Fp>\n\u003Cp>なお、今回の記事は、主に技術者向けの内容となっております。FIDO Logonの機能について知りたい場合は\u003Ca href=\"https:\u002F\u002Fwww.yubion.com\u002Fpost\u002Factually-use-enterprise-authenticator\">前回のブログ記事\u003C\u002Fa>を見ていただいた方が良いかと思います。こちらの記事ではFIDO Logonとは（あまり）関係なく、EnterpriseAttestationという仕様についての解説をしていきます。極力FIDO認証技術を知らない方でも読めるようにしているつもりですが、FIDO認証技術や電子署名技術をご存知の方がより理解が深まるかと思います。\u003C\u002Fp>\n\u003Ch2>■EnterpriseAttestation仕様策定の背景\u003C\u002Fh2>\n\u003Cp>FIDO認証の基本的な仕様として、複数のクレデンシャル（認証情報）で利用された認証器が同一個体なのかどうかを判別する事は出来ません。例えば、サイトAとサイトBで同じセキュリティキーを用いた場合、あるいはサイトA内でアカウントXとアカウントYに同じセキュリティキーを用いた場合など、これらのクレデンシャルが同一個体の認証器のものかどうかはクレデンシャルの内容を全て照らし合わせたとしてもわからない仕組みになっています。(*1)　これは主にプライバシーの観点から「追跡」を避けるための仕組みです。安易にこれらの同一性がわかってしまうと、例えば利用者がサイトAでのみ開示したはずの情報が、同じ会社が運営するサイトBでも都合よく使われてしまうといった問題が発生する可能性があります。\u003C\u002Fp>\n\u003Cp>\u003Cimg src=\"https:\u002F\u002Fdty9gbw7gew16.cloudfront.net\u002Fuploads\u002Fblog_fido2_enterprise_attestation_explained_1_dfe6fe1969.png\" alt=\"\">\u003C\u002Fp>\n\u003Cp>このような問題に配慮した結果、FIDO認証に利用したデバイスの個体識別情報は認証を行うサービス側（Relying Party、RP）にもわからなくなっています。この仕組みは、個人利用の場面ではプライバシー保護という観点でとても良いものだと思います。一方で、認証を管理したい企業が利用する場合では、都合が悪い点も存在します。以下のような場面があった場合、これまでのFIDO認証では対応する事が出来ませんでした。\u003C\u002Fp>\n\u003Cul>\n\u003Cli>社員Xが認証器を紛失したので貸与していた認証器を利用できないようにしたい。なので、社員Xに貸与した認証器のクレデンシャルを特定したい。\u003C\u002Fli>\n\u003Cli>システムAしか利用権限がないはずの社員XがこっそりシステムBも使っているらしい、という内部通報があった。システムBで利用されているクレデンシャルの中で、社員Xに貸与している認証器のクレデンシャルがどれか特定したい。\u003C\u002Fli>\n\u003Cli>社員Xが、会社から貸与した認証器以外の個人所有認証器を使っていたらしい。社員Xは先日退社し、貸与していた認証器は返却していたが、社員Xが個人所有している認証器を使って社内システムにアクセスできてしまう。社内システムに対しては個人所有の認証器を使えないように（≒会社貸与の認証器しか使えないように）したい。\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>もちろん、「社員Xのアカウントをきちんと管理して止めればいい」という考え方もあります。私も理想的にはアカウントはきちんと人単位で管理されるべきだと思いますが、現実的には、例えば共用アカウントで認証器を使っていたり、業務の都合で別の社員のアカウントに認証器を登録していたり、社内SEの皆さんが頭を抱えている実運用も存在するかと思います。(*2) そういった悪い運用をしていないか管理者が確認する、という観点でも、企業管理下では「クレデンシャルに対応する実デバイスはどれか」がわかる事がメリットになりえます。\u003C\u002Fp>\n\u003Cp>\u003Cimg src=\"https:\u002F\u002Fdty9gbw7gew16.cloudfront.net\u002Fuploads\u002Fblog_fido2_enterprise_attestation_explained_2_e3dd7f8fa4.png\" alt=\"\">\u003C\u002Fp>\n\u003Cp>(*1)同一「種類」の認証器かどうか（例えばどのベンダーの何という製品か）はクレデンシャル作成時のオプションによっては判別可能です。\u003C\u002Fp>\n\u003Cp>(*2)更に現実的な話としては、FIDO認証を用いて共用アカウントを使うよりも、「複数人が共用アカウントのIDとパスワードを知っている」という形が多いかと思いますが…。\u003C\u002Fp>\n\u003Ch2>■EnterpriseAttestationの概要\u003C\u002Fh2>\n\u003Cp>一方ではデバイスの個体識別を「出来ない」ようにする要求があり、もう一方ではデバイスの個体識別を「出来る」ようにする要求がある、という相反する要求に対して、FIDOが示した解決策が「EnterpriseAttestation」です。これは、認証器の設定によって、限られた範囲でデバイスの個体識別を可能にするための仕様です。\u003C\u002Fp>\n\u003Cp>出来るだけ簡単にEnterpriseAttestationを説明したいと思いますが、その部分だけを切り出して説明してもわかりにくい部分だと思いますので、FIDO認証の全体の流れから説明していきたいと思います。EnterpriseAttestationの説明に必要ない部分は説明を省いておりますので、FIDO認証の全てを紹介しているわけではない点はご了承ください。\u003C\u002Fp>\n\u003Ch3>・FIDO認証\u003C\u002Fh3>\n\u003Cp>まず、FIDO認証はざっくりと言うと、makeCredentialと呼ばれる「登録（クレデンシャル作成）」の部分と、getAssertionと呼ばれる「認証」の部分に分かれます。これらの処理は公開鍵暗号を用いた電子署名の技術に基づいており、「秘密鍵」と「公開鍵」と呼ばれる2種類の鍵を用いて処理を行います。セキュリティキー内部に保存された「秘密鍵」で「署名」を行い、認証を行うサーバー側で保存している「公開鍵」で「署名」が正しいかどうかを判別する事が出来ます。\u003C\u002Fp>\n\u003Cp>\u003Cimg src=\"https:\u002F\u002Fdty9gbw7gew16.cloudfront.net\u002Fuploads\u002Fblog_fido2_enterprise_attestation_explained_3_c7c86da13f.png\" alt=\"\">\u003C\u002Fp>\n\u003Cp>EnterpriseAttestationはmakeCredentialの部分に実装されていますので、今回はこちらを重点的に取り扱っていきます。makeCredentialでは、認証器内で秘密鍵と公開鍵のペアを作成し、公開鍵をサーバー側に渡します。また、ペアの作成と同時に、サーバーから渡された「チャレンジ」と呼ばれる文字列(*3)に秘密鍵で署名を行い、署名結果をサーバーに渡します。サーバー側では、署名対象のチャレンジが直前にサーバーから発行されたものである事、署名が正しい事を確認して(*4)、問題が無ければ公開鍵を今後の認証で用いるために保存しておきます。\u003C\u002Fp>\n\u003Cp>これがFIDO認証の基本的な概念です。getAssertionの場合も大きな流れは変わらず、「秘密鍵と公開鍵のペアを作成」する部分を飛ばして、登録時に作成された秘密鍵を用いて「チャレンジ」に対して署名を行う(*3)、サーバー側ではその署名の確認を行う、という流れになります。(*4)\u003C\u002Fp>\n\u003Cp>(*3)正確には、チャレンジを含む各種情報が内包されたJSON（clientData）に対して署名を行います。\u003C\u002Fp>\n\u003Cp>(*4)あくまで概念の理解のために最低限の記述にしています。実際には「本当にクレデンシャルを登録・認証しようとしたRPに対して行われた操作か」「登録・認証をしようとした時に本人確認（PIN・指紋など）が行われたか」など、様々な情報の検証が必要です。\u003C\u002Fp>\n\u003Ch3>・AttestationStatement\u003C\u002Fh3>\n\u003Cp>実はここまでの説明は本当にFIDO認証の基本的な概念だけで、まだEnterpriseAttestationに繋がる部分の話が出てきていません。EnterpriseAttestationを理解するために、まずは「AttestationStatement」の説明が必要です。\u003C\u002Fp>\n\u003Cp>AttestationStatementは、認証器の信頼性を保証する仕組みです。この仕組みを用いると、登録された認証器がFIDOアライアンスの認定した正規の認証器である事を保証する事が可能になります。そうする事で、悪意のある（例えば秘密鍵をあえて漏洩させるような）認証器であったり、悪意は無くとも脆弱性のある認証器などを拒否する事が可能です。\u003C\u002Fp>\n\u003Cp>ここからはデータ構造を見ながら説明した方がわかりやすいかと思いますので、まずはmakeCredentialを行った際に取得できるデータの構造を以下に示します。\u003C\u002Fp>\n\u003Cp>\u003Cimg src=\"https:\u002F\u002Fdty9gbw7gew16.cloudfront.net\u002Fuploads\u002Fblog_fido2_enterprise_attestation_explained_4_b308c9aec2.png\" alt=\"\">\u003C\u002Fp>\n\u003Cp>この中で、attStmtの部分がAttestationStatementと呼ばれる部分で、この中には署名(sig)と証明書(x5c)が含まれています。ここの署名は、authenticatorDataとclientDataHashと呼ばれる項目に対して行われています。わかりやすく言うと、authenticatorDataとclientDataHash（≒チャレンジ）がその認証器によって出力された、という事が、署名と証明書によって確認できます。\u003C\u002Fp>\n\u003Cp>ここまでの話ではまだ、「この認証器によってauthenticatorDataとclientDataHashが出力された」事が保証されているだけで、「この認証器がFIDOアライアンス認定された認証器である」という事は保証されていません。それを保証するために、FIDOアライアンスによって\u003Ca href=\"https:\u002F\u002Ffidoalliance.org\u002Fmetadata\u002F\">MDS\u003C\u002Fa>（Metadata Service）というサービスが公開されています。このMDSからは、セキュリティキーの各ベンダーが提供している認証器の様々な情報（例えばモデル名など）が取得できるのですが、その中に「attestationRootCertificates」と呼ばれる項目があります。こちらがルート証明書となっており、attStmtから取得できる証明書がattestationRootCertificatesと証明書チェーンを形成している事を確認する事で、その認証器の証明書がベンダーによって生成された＝認証器がベンダーによって提供されたものと保証される事になります。\u003C\u002Fp>\n\u003Cp>\u003Cimg src=\"https:\u002F\u002Fdty9gbw7gew16.cloudfront.net\u002Fuploads\u002Fblog_fido2_enterprise_attestation_explained_5_d3e6981683.png\" alt=\"\">\u003C\u002Fp>\n\u003Cp>なお、ここでattStmtから取得できるアテステーション証明書は、認証器の個体ごとに異なるものではなく、複数の認証器個体で同一のものになっています。実際にどういう単位で同じアテステーション証明書を用いているかはセキュリティキーベンダーの実装によるかと思いますが、製品のモデル単位であったり、ファームウェアバージョン単位であったりするのではないかと思われます。私自身の例で言うと、私物のYubiKey Bioと、同時期に会社から支給されたYubiKey Bioではアテステーション証明書が同一の物でした。\u003C\u002Fp>\n\u003Ch3>・EnterpriseAttestation\u003C\u002Fh3>\n\u003Cp>EnterpriseAttestationは、前項で説明したアテステーション証明書の部分にほんの少しだけ工夫をしたものになります。前項の最後で、アテステーション証明書は複数の認証器で同一である、という旨の説明をしましたが、EnterpriseAttestationの場合は、この部分が認証器ごとに異なる証明書になっており、登録に使われた認証器がどの個体であるかがわかる仕組みになっています。\u003C\u002Fp>\n\u003Cp>\u003Cimg src=\"https:\u002F\u002Fdty9gbw7gew16.cloudfront.net\u002Fuploads\u002Fblog_fido2_enterprise_attestation_explained_6_20939fd75c.png\" alt=\"\">\u003C\u002Fp>\n\u003Cp>実際の\u003Ca href=\"https:\u002F\u002Fwww.w3.org\u002FTR\u002Fwebauthn\u002F#dom-attestationconveyancepreference-enterprise\">WebAuthnの仕様書\u003C\u002Fa>では、EnterpriseAttestationを要求した際の挙動が以下のように記述されています。\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>This value indicates that the Relying Party wants to receive an attestation statement that may include uniquely identifying information.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>この値は、依頼当事者（Relying Party、RP）が、一意に識別される情報を含む可能性のある証明書を受け取りたい事を示しています。\u003C\u002Fp>\n\u003Cp>「一意に識別される情報」としか書かれていませんので、実装としては一意に識別できれば何でもいいのではないかと思われますが、現実的にはシリアル番号などが取得できる場合が多いのではないかと思います。実際に我々が今回の開発に際してYubico様から頂いたEnterpriseAttestation対応YubiKeyでは、x509証明書のsubject項目に、識別名（DistinguishedName、DN）の形式でシリアル番号が格納されていました。\u003C\u002Fp>\n\u003Cp>\u003Cimg src=\"https:\u002F\u002Fdty9gbw7gew16.cloudfront.net\u002Fuploads\u002Fblog_fido2_enterprise_attestation_explained_7_7a416a9baa.png\" alt=\"\">\u003C\u002Fp>\n\u003Cp>この辺り、証明書の中でどのようにシリアル番号などが設定されるかはベンダーによって異なるのではないかと思います。FIDO Logonでは現状はYubico様の認証器でのみ動作を確認しており、subject項目をDNとして分解したうえで、CN(commonName)項目を正規表現でパースして認証器IDを取得していますが、別のベンダーの場合はまた別のパース方法を準備する必要があると考えています。\u003C\u002Fp>\n\u003Ch3>・WEB上でのEnterpriseAttestationの実装\u003C\u002Fh3>\n\u003Cp>WEB上で実際にEnterpriseAttestationを用いる場合、WebAuthnの\u003Ca href=\"https:\u002F\u002Fw3c.github.io\u002Fwebappsec-credential-management\u002F#dom-credentialscontainer-create\">navigator.credentials.create\u003C\u002Fa>メソッドのパラメータ「\u003Ca href=\"https:\u002F\u002Fwww.w3.org\u002FTR\u002Fwebauthn\u002F#attestation-conveyance\">attestation\u003C\u002Fa>」に「enterprise」を指定します。要求が正しく処理された場合、先ほどの項で述べた通り、attStmtの証明書としてEnterpriseAttestationの証明書が設定されたattestationObjectが返却されます。(*5)\u003C\u002Fp>\n\u003Cp>(*5)細かい事を言えばメソッドの戻り値はPublicKeyCredentialで、その中のresponseメンバがAuthenticatorAttestationResponseで、その中にattestationObjectが設定されています。\u003C\u002Fp>\n\u003Ch2>■その他補足事項\u003C\u002Fh2>\n\u003Cp>EnterpriseAttestationを用いる際に必要な事などについていくつか記載していきます。\u003C\u002Fp>\n\u003Ch3>・EnterpriseAttestation対応セキュリティキーの入手\u003C\u002Fh3>\n\u003Cp>我々はFIDO Logonの企業向け認証器管理機能開発にあたってYubico様とやり取りを行い、開発用のYubiKeyを用意して頂きましたが、実際に企業で運用する際には（Yubico様に限らず）ベンダーとの連携が必要となります。この辺りは\u003Ca href=\"https:\u002F\u002Ffidoalliance.org\u002Fspecs\u002Ffido-v2.2-rd-20241003\u002Ffido-client-to-authenticator-protocol-v2.2-rd-20241003.html#sctn-feature-descriptions-enterp-attstn\">CTAP2の仕様\u003C\u002Fa>に以下の記載があります。\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>An enterprise attestation is an attestation that may include uniquely identifying information. This is intended for controlled deployments within an enterprise where the organization wishes to tie registrations to specific authenticators.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>EnterpriseAttestationは一意の識別情報を含むAttestationです。これは、組織が登録を特定の認証器と関連付けることを望む、企業内の管理された配備を意図しています。\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>The expectation is that enterprises will work directly with their authenticator vendor(s) in order to source their enterprise attestation capable authenticators.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>企業は、EnterpriseAttestationが可能な認証器を調達するために、認証器ベンダーと 直接協力することが期待されます。\u003C\u002Fp>\n\u003Cp>FIDOアライアンスの意図としては、あくまでEnterpriseAttestationが有効な認証器は導入する企業で管理されるべきで、導入する企業は認証器ベンダーと協力すべきである、という認識なのではないかと思います。少なくともEnterpriseAttestation対応の認証器は一般に流通させるようなものではない、という認識です。まだそういった話を認証器ベンダーの方と直接話したわけではないのですが、ここで説明したようなソフトウェア技術についての話に限らず、実際の認証器の運用体制（認証器の入手プロセス、紛失した際の連絡体制など）についても相談して決めていくことになると思われます。仕様策定の背景でも述べた通り、FIDOの仕様としては認証器の追跡は出来ない、というのが基本スタンスですので、この辺りはセキュリティキーベンダー側も慎重に対応していく事になるのではないでしょうか。\u003C\u002Fp>\n\u003Ch3>・EnterpriseAttestationが利用できるRPの範囲について\u003C\u002Fh3>\n\u003Cp>EnterpriseAttestationに対応した認証器を入手したとしても、無制限にどのRPに対しても一意の識別情報を提供するわけではありません。どのRPに対して一意の識別情報を提供するかを定めておく必要があるのですが、その方法が2種類あります。\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cp>Vendor-facilitated enterprise attestation\u003C\u002Fp>\n\u003Cp>「認証器ベンダーによるEnterpriseAttestation」の意味です。具体的には、利用可能なRPのIDを認証器に書き込んだ状態で認証器を出荷する形式となります。先ほどの項で、認証器ベンダーと協力する、という話をしましたが、その際に利用するRPの情報も共有し、認証器の提供時点でどのRPを用いるかを確定させておく必要があります。\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\u003Cp>Platform-managed enterprise attestation\u003C\u002Fp>\n\u003Cp>「プラットフォーム管理のEnterpriseAttestation」の意味です。こちらは認証器にRPのIDを書き込むのではなく、プラットフォーム（例えばブラウザ）などの設定として利用可能なRPのIDを指定しておく方法です。2025年2月13日現在では、（私が確認している範囲では）Google Chromeのみがこの方法に対応しています。(*6)\u003C\u002Fp>\n\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Vendor-facilitatedの場合は認証器に利用可能なRP IDを設定し、Platform-managedの場合はブラウザに利用可能なRP IDを設定する形になります。\u003C\u002Fp>\n\u003Cp>なお、CTAPを自前で実装しているYubiOn FIDO Logonについては、現時点ではRP IDはfl.yubion.comに固定ですので、Platform-managedの形式を取っています。今後のお客様の方針次第ではVendor-facilitatedの形も選べるように（＝認証器側にfl.yubion.comのRP IDが設定されていなければ登録不可）しようかと考えています。\u003C\u002Fp>\n\u003Cp>(*6)ChromeブラウザのEnterpriseAttestation設定（ chrome:\u002F\u002Fflags\u002F#web-authentication-permit-enterprise-attestation )の項目で、テキストボックス内にRP IDを指定します。複数指定する場合はカンマ区切りで指定します。\u003C\u002Fp>\n\u003Ch3>・ブラウザ・OSの対応状況（主にWindows上での話）\u003C\u002Fh3>\n\u003Cp>EnterpriseAttestationが利用可能な環境についても、あまりまとまった情報がWEB上には無いように思います。我々の方で把握できている情報をまとめておきますが、Windowsに偏った情報である事はご了承ください。\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cp>OSの制約\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cp>Windows10系統は不可、Windows11系統のみ可(*7)\u003C\u002Fp>\n\u003Cp>これはWindows10系統でOSに実装されているWebAuthnAPI(*8)のバージョンが古く、EnterpriseAttestationに対応していないためです。Windowsの場合、ブラウザでのセキュリティキーの利用は全てWindowsのWebAuthnAPI呼び出しで実装されているため、どのブラウザを使ってもこの制約が適用されます。なお、WindowsServerの場合、2022以前のものがWindows10系統となり、WindowsServer2025のみWindows11系統となります。\u003C\u002Fp>\n\u003Cp>リモートデスクトップ時のWebAuthnリダイレクトを用いる場合、EnterpriseAttestationを利用するには接続元・接続先共にWindows11系統である必要があります。\u003C\u002Fp>\n\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\u003Cli>\u003Cp>ブラウザの制約\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cp>Google Chromeの場合\u003C\u002Fp>\n\u003Cp>Google Chromeの場合は、ブラウザによる制約は特にありません。ただし、ブラウザの設定で、EnterpriseAttestation設定（ chrome:\u002F\u002Fflags\u002F#web-authentication-permit-enterprise-attestation )を有効化しておく必要があります。また、Platform-managed enterprise attestationを用いる場合は利用可能なRP IDも設定しておく必要があります。\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\u003Cp>Edgeの場合\u003C\u002Fp>\n\u003Cp>Edgeの場合、Chromeと違ってEnterpriseAttestation設定がブラウザ設定内に見当たりません。ただ、ブラウザ上でのWebAuthenticationAPI呼び出し時に「attestation」に「enterprise」を指定した場合、WindowsのWebAuthnAPIが出力する提供情報ダイアログに明確に「シリアル番号」が追加される事から、おそらくVendor-facilitated enterprise attestationには対応しているものと思われます。（弊社で入手している認証器はRP IDの設定をしていないため、確認までは取れておりません）\u003C\u002Fp>\n\u003Cp>\u003Cimg src=\"https:\u002F\u002Fdty9gbw7gew16.cloudfront.net\u002Fuploads\u002Fblog_fido2_enterprise_attestation_explained_8_5e4efa79d4.png\" alt=\"\">\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\u003Cp>FireFoxの場合\u003C\u002Fp>\n\u003Cp>FireFoxでは2025年2月時点でEnterpriseAttestationは利用できません。\u003C\u002Fp>\n\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\u003Cli>\u003Cp>その他\u003C\u002Fp>\n\u003Cp>Macの場合、ChromeについてはWindowsと同様に設定をする事で利用可能です。Safariについては17系統のものだとattestation=enterpriseが解釈できなかった（attestation=noneと同様の挙動）のに対して、18.3だと（RP IDの設定をしていないEnterpriseAttestation対応キーで）attestation=directと同等の動きをしたため、Vendor-facilitated enterprise attestationには対応している可能性はありそうです。ただ、リリースノートなどには記述が見つからないため正確なところは不明です。\u003C\u002Fp>\n\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>(*7)YubiOn FIDO Logonのアプリケーション上（設定ツール・ログオン画面）からの認証器登録は、CTAP通信を自前で実装しているため、Windows10系統でもEnterpriseAttestationが利用可能です。ただし、リモートデスクトップ接続からの認証器登録の場合はWindowsのWebAuthnAPIを利用しているため、接続元・接続先共にWindows11系統である必要があります。\u003C\u002Fp>\n\u003Cp>(*8)WEB上のWebAuthenticationAPIと名前が紛らわしいのですが、\u003Ca href=\"https:\u002F\u002Flearn.microsoft.com\u002Fja-jp\u002Fwindows\u002Fwin32\u002Fwebauthn\u002F-webauthn-portal\">Windows上のWin32API\u003C\u002Fa>の事です。\u003C\u002Fp>\n\u003Ch2>■まとめ\u003C\u002Fh2>\n\u003Cp>長々と文章を書いてきましたが、実装技術的な面での要点は以下の通りです。\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cp>navigator.credentials.createメソッド呼び出し時の「attestation」パラメータに「enterprise」を指定する。\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\u003Cp>上記呼び出しを行った結果、対応した認証器であればAttestationStatementの証明書がデバイス個別の証明書になる。\u003C\u002Fp>\n\u003Cul>\n\u003Cli>証明書チェーンなどの仕組みは通常のAttestationStatementと同様。\u003C\u002Fli>\n\u003Cli>ベンダーの実装によるが、証明書内にシリアル番号が保存されている。（Yubico社の場合は証明書のsubject内）\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>ただ、実装技術よりも運用面の方が色々考えるべき事が多いように思います。\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cp>運用方針・体制の検討\u003C\u002Fp>\n\u003Cul>\n\u003Cli>導入までの手順をどのように実行していくか。\u003C\u002Fli>\n\u003Cli>導入後、どのような業務フローで管理を行っていくか。\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\u003Cli>\u003Cp>認証器を使用するサービス・システムの選択\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cp>一般的なサービスについてはEnterpriseAttestation対応のものは多くはないと思われるが、どのようなサービスで認証器を用いるか。\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\u003Cp>社内開発システムで導入する場合は追加の実装が必要。\u003C\u002Fp>\n\u003Cul>\n\u003Cli>EnterpriseAttestationを保存しておくだけであれば簡単な実装となるが、シリアル番号を元にクレデンシャルを管理する機能などを追加する場合は機能の検討が必要と思われる。\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\u003Cli>\u003Cp>Vendor-facilitatedにするか、Platform-managedにするか（あるいは併用するか）。\u003C\u002Fp>\n\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\u003Cli>\u003Cp>利用可能環境の確認（OS・ブラウザ）\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Chromeの場合はブラウザ設定を一括変更する必要がある。\u003C\u002Fli>\n\u003Cli>非対応環境への対処を考える必要がある。\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>名前が示す通り企業向けの機能で、ここまでの説明でもあった通り「企業内での管理された配備」を前提とした機能ですので、導入しました、で終わるような話ではありません。ですが、きちんと運用・管理体制を構築し、日々その体制を改善していく事が出来る企業様にとっては、運用の助けになる良い機能だと思います。\u003C\u002Fp>\n\u003Cp>FIDO Logonでは今回EnterpriseAttestation対応認証器を用いた機能を実装しましたが、もちろん同機能に非対応のセキュリティキーやスマートフォンでも端末のセキュリティを向上させることは可能です。無料版として、有料版と同等の機能を3ヶ月間お試し頂けますので、まずは是非試して頂ければと思います。\u003C\u002Fp>\n\u003Cp>EnterpriseAttestation対応認証器の導入をご検討の場合は、お手数ですが\u003Ca href=\"https:\u002F\u002Fwww.yubion.com\u002Fcontact-form\">お問い合わせ\u003C\u002Fa>いただければ幸いです。\u003C\u002Fp>\n\u003Ch2>■関連リンク\u003C\u002Fh2>\n\u003Cp>[YubiOn FIDO Logon]\u003C\u002Fp>\n\u003Cp>\u003Ca href=\"https:\u002F\u002Ffl.yubion.com\">https:\u002F\u002Ffl.yubion.com\u003C\u002Fa>\u003C\u002Fp>\n\u003Cp>[YubiOn FIDO Logon概要ページ]\u003C\u002Fp>\n\u003Cp>\u003Ca href=\"https:\u002F\u002Fwww.yubion.com\u002Ffidologon\">https:\u002F\u002Fwww.yubion.com\u002Ffidologon\u003C\u002Fa>\u003C\u002Fp>\n","fido2-enterprise-attestation-explained","2025-02-18","2026-04-28T07:49:18.613Z","2026-04-28T07:49:21.652Z","ja","Shiraishi",{"id":48,"documentId":49,"name":50,"alternativeText":51,"caption":51,"focalPoint":51,"width":52,"height":53,"formats":54,"hash":84,"ext":56,"mime":60,"size":85,"url":86,"previewUrl":51,"provider":87,"provider_metadata":51,"createdAt":88,"updatedAt":88,"publishedAt":89},1213,"qs3zib69an4byb4kn20y22t1","blog-fido2-enterprise-attestation-explained-1.png",null,960,540,{"small":55,"medium":66,"thumbnail":75},{"ext":56,"url":57,"etag":58,"hash":59,"mime":60,"name":61,"path":51,"size":62,"width":63,"height":64,"sizeInBytes":65},".png","https:\u002F\u002Fdty9gbw7gew16.cloudfront.net\u002Fuploads\u002Fsmall_blog_fido2_enterprise_attestation_explained_1_dfe6fe1969.png","2e0ef4028ce8ebde390cb249e1558a7b","small_blog_fido2_enterprise_attestation_explained_1_dfe6fe1969","image\u002Fpng","small_blog-fido2-enterprise-attestation-explained-1.png",80.55,500,281,80553,{"ext":56,"url":67,"etag":68,"hash":69,"mime":60,"name":70,"path":51,"size":71,"width":72,"height":73,"sizeInBytes":74},"https:\u002F\u002Fdty9gbw7gew16.cloudfront.net\u002Fuploads\u002Fmedium_blog_fido2_enterprise_attestation_explained_1_dfe6fe1969.png","9b9015730a7b1941f54881e26de9b534","medium_blog_fido2_enterprise_attestation_explained_1_dfe6fe1969","medium_blog-fido2-enterprise-attestation-explained-1.png",150.92,750,422,150923,{"ext":56,"url":76,"etag":77,"hash":78,"mime":60,"name":79,"path":51,"size":80,"width":81,"height":82,"sizeInBytes":83},"https:\u002F\u002Fdty9gbw7gew16.cloudfront.net\u002Fuploads\u002Fthumbnail_blog_fido2_enterprise_attestation_explained_1_dfe6fe1969.png","919c857399160971f70f7a20b54f566e","thumbnail_blog_fido2_enterprise_attestation_explained_1_dfe6fe1969","thumbnail_blog-fido2-enterprise-attestation-explained-1.png",26.51,245,138,26512,"blog_fido2_enterprise_attestation_explained_1_dfe6fe1969",56.73,"https:\u002F\u002Fdty9gbw7gew16.cloudfront.net\u002Fuploads\u002Fblog_fido2_enterprise_attestation_explained_1_dfe6fe1969.png","aws-s3","2026-04-28T07:48:40.362Z","2026-04-28T07:48:40.363Z",[91,97,103,109,115],{"id":92,"documentId":93,"name":94,"slug":51,"createdAt":95,"updatedAt":95,"publishedAt":96},12,"aire52m2y26x0uq2lb8m0nwy","FIDO","2026-04-28T01:49:06.707Z","2026-04-28T01:49:08.676Z",{"id":98,"documentId":99,"name":100,"slug":51,"createdAt":101,"updatedAt":101,"publishedAt":102},44,"ndyi3ro2mlncggjsp6vy47ue","Passkeys","2026-04-28T05:22:55.540Z","2026-04-28T05:22:57.559Z",{"id":104,"documentId":105,"name":106,"slug":51,"createdAt":107,"updatedAt":107,"publishedAt":108},14,"cayvzwteev09nngcidjgi3lb","YubiOn FIDO Logon","2026-04-28T01:49:14.235Z","2026-04-28T01:49:16.082Z",{"id":110,"documentId":111,"name":112,"slug":51,"createdAt":113,"updatedAt":113,"publishedAt":114},54,"aik3it1d9trj8u1rr5wbmw2d","FIDO2","2026-04-28T05:24:47.451Z","2026-04-28T05:24:49.300Z",{"id":116,"documentId":117,"name":118,"slug":51,"createdAt":119,"updatedAt":119,"publishedAt":120},98,"ze8oeribfs3nh7edjn3larik","EnterpriseAttestation","2026-04-28T06:24:31.082Z","2026-04-28T06:24:32.927Z",{"id":122,"metaDescription":123},377,"FIDO2の仕様「EnterpriseAttestation」について技術者向けに詳しく解説します。認証器の個体識別や企業での認証器管理の仕組みに興味のある方は必見です。",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":125},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"M15.75 6a3.75 3.75 0 1 1-7.5 0a3.75 3.75 0 0 1 7.5 0M4.501 20.118a7.5 7.5 0 0 1 14.998 0A17.9 17.9 0 0 1 12 21.75c-2.676 0-5.216-.584-7.499-1.632\"\u002F>",1783406253733]