ロゴ
HOME > WebAuthn > WebAuthnでログインセキュリティを強化する!

WebAuthnでログインセキュリティを強化する!


WEBシステムを構築する際に避けられないログイン処理ですが、従来のアカウント(メールアドレス)とパスワードを使ったログイン方法では、セキュリティ上の安全性が十分とは言えなくなってきています。

STUDIOKEYでは、画像認証やreCAPTCHA認証、ワンタイムパスワードなど、さまざまな認証方法を導入してきました。しかし近年はYahoo! JAPANなどでも採用されているWebAuthnの認知度が高まってきていますので、今回はその概要を少しご紹介したいと思います!

WebAuthnってなに?

WebAuthn(Web Authentication)は、W3C(World Wide Web Consortium)とFIDO Allianceが策定した認証標準です。ユーザーの認証をより安全にするため、公開鍵と秘密鍵を使用してパスワードの代わりにセキュリティキーや生体認証デバイスでログインします。

  • パスワード不要: ユーザーのデバイス(セキュリティキーやスマートフォンなど)を使ってログインします。
  • 公開鍵暗号方式: 認証には公開鍵と秘密鍵のペアを使用し、パスワードよりも強固なセキュリティを提供します。
  • 生体認証サポート: 指紋や顔認証など、さまざまな生体認証にも対応しています。

これにより、パスワードの漏洩や盗難のリスクを大幅に低減することができます。

既存システムへの組み込みは可能か?

本記事ではPHPベースのWEBシステムで有ることを前提に書いていきますが、既存システムへWebAuthn導入はそれほど面倒では有りません。現行システムのユーザーアカウントに設定されているユニークな値をuserNameとし、公開鍵に紐づけることで独立した処理として組み込むことが可能です。

WebAuthnはログイン認証のみを担いますので、ログイン後にCookieを発行してログインを継続させる等の処理は現行のまま利用することが出来ます。
※もちろん仕様次第ですが

simple PHP WebAuthn

幾つかライブラリが有るのですが、今回は公式サンプルが有るsimple PHP WebAuthn (FIDO2/Passkey) server libraryを紹介したいと思います。

Github
https://github.com/lbuchs/WebAuthn?tab=readme-ov-file

Sample
https://webauthn.lubu.ch/_test/client.html

サンプルを開き、new registrationボタンを押すと、windowsでは以下のような画面が表示されます。

画像はPINですが、別のデバイスを使用するを選択するとスマートフォンやタブレットなどの選択肢が表示されます。公式サンプルは公開鍵をsessionに保存しており、認証すると鍵が右側に表示されます。設定変更も可能なので色々と試すことが出来ます。

simple PHP WebAuthnを使った導入に関して

公式サンプルは設定をGETで送信しているなど、そのままでは使えませんのでカスタマイズが必要です。いえ、カスタマイズというよりも全バラして各機能を理解し、更に結合といった感じでしょうか。理解してしまうと然程でもないのですが、セキュリティに関することですので十分に理解した上で導入すべきと考え、数日格闘した感じです。

ユーザー登録
https://studio-key.com/Sample/Authn/WebAuthn/regist.html

ユーザーログイン
https://studio-key.com/Sample/Authn/WebAuthn/login.html

作成したサンプルは公開鍵やIP、UAをSqliteデータベースへ保存しています。また、認証した情報はパソコン等に保存されますので適宜削除して下さい。PINの場合はアカウント→パスキー(windows)等で適宜削除して下さい。

また、Sqliteに登録された情報は24時間で削除されます。

今回はサンプルソースがGithubに有りますので具体的なカスタマイズ方法については書きませんが、公式サンプルにあった設定メニュー等をconfigに移動するなどしています。

WebAuthnを学ぶにあたり上でも少し触れましたが、◯◯とはなんぞや?と理解しようとすると膨大な資料を相手にしなくてはならず、相当苦戦しました。

ウチのサンプルはブラウザが変わると同じDemoUserでログインしようとしてもログインが出来ない単一の認証にしていますが、実際の現場ではPC、スマホ、タブレットなどなど、多数のデバイスかつ多数のブラウザで認証が必要になりますので、アカウントは同じでも認証情報は複数紐づけるなど必要になると思います。

多要素認証について

多要素認証(MFA)は、ユーザーの認証プロセスに複数の要素を追加することでセキュリティを強化する手法です。一般的に、MFAは以下の3つの要素のうち2つ以上を要求します:

  1. 知識要素(Something you know): ユーザーが知っている情報、例えばパスワードやPINコード。
  2. 所持要素(Something you have): ユーザーが所持している物理的なアイテム、例えばスマートフォン、セキュリティトークン、またはスマートカード。
  3. 生体要素(Something you are): ユーザーの生体情報、例えば指紋、顔認識、虹彩認識など。

これにより、万が一1つの認証要素が盗まれたり漏えいしたりしても、他の要素があればアクセスを防ぐことができます。MFAは、セキュリティが重要なシステムやアカウントで広く採用されています。

なぜ多要素認証に触れたのかは、WebAuthnは多要素認証では無いからです。WebAuthnは指紋認証にも対応しますし、指紋認証をスマホで行えば条件をクリアしているように思えますが、スマホで指紋認証するのは単一と見做されます。

つまり、WebAuthnの他に何かしらが必要になります。例えばユーザーが任意で変更可能なパスワードがそれにあたります。しかし、サンプルを見て分かるとおりDemoUser等のユニークな値が無いと公開鍵を識別出来ません。

ガラケーの個体識別番号のようなものでデバイスを特定出来れば何も入力せずともログインが可能ではないかと考えていましたが、それは不可能なようです。つまりセキュリティを向上させようとすると利便性は低下するという・・・まあ各サイトのログインが異様に面倒に感じるのはセキュリティに配慮されている結果なのでしょう。

WebAuthnのご相談等はお気軽にどうぞ!