WebAuthn でパスワードの無い世界へ
庄司です。
複数のサービスにアクセスするための異なるパスワードを記憶しておくことは困難で、結果としてパスワードを使いまわすといったセキュリティリスクの高い行動パターンをとりがちです。
最近のスマートフォンやPCでは指紋認証や顔認証のような生体情報を用いた認証が可能になっています。このようなデバイスを活用してより安全性の高い認証の仕様として、FIDO2 (WebAuthn) があります。
この記事では、WebAuthn に対応した Keycloak と iPhone または iPad を使ってパスワードレスにサインインする環境を AWS 上に構築します。
Keycloak は Red Hat 社が開発しているオープンソースの認証管理です。
パスワードレスサインインのイメージ
#最初にパスワードレスサインインのイメージをデモンストレーションします。
iPad から Keycloak に Safari でアクセスします。
Username または Email を入力します。
Password 入力画面で、Try Another Way
をクリックします。
Security Key をクリックします。
「Sign in with Security Key」ボタンをクリックして、指紋認証の Touch ID などを使ってサインインできます。
構成
#では、上記でデモンストレーションした WebAuthn の構成を Keycloak で構築してみます。
WebAuthn では HTTPS が必須です。唯一の例外は localhost を使う場合だけです。ここでは、AWS を使って環境構築するため、ホストゾーン作成済みの Amazon Route 53 と AWS Certificate Manager を使います。
Route 53 のホストゾーンを作成するドメイン名は必ずしも AWS で取得する必要ありません。私が主に使用しているドメイン名は、「お名前.com」や「名づけてねっと」で取得して、ネームサーバーだけ Route 53 を使用しています。
Keycloak の公式のコンテナイメージを AWS Fargate で実行します。
上図の構成を構築する CloudFormation テンプレートは GitHub リポジトリ にあります。
この記事で構築する Keycloak はデモンストレーション用に簡素化しています。そして永続化しません。つまり、これから述べる手順で構築した後、コンテナを停止 (サービスを停止) すると初期状態に戻ります。永続化のためには、データベース等も必要になります。冗長化や永続化については、最後に紹介しているリンクも参考にしてください。
Keycloak の起動
#- AWS コンソールの Elastic Container Service から、クラスターを選択し、作成したサービスを選択し、「更新」ボタンをクリックします。
- サービスの設定にある、タスクの数を 1 に設定して、「次のステップ」ボタンをクリックします。
- ネットワーク構成は変更せずに「次のステップ」ボタンをクリックします。
- Auto Scaling もそのまま「次のステップ」ボタンをクリックします。
- 確認で、「サービスの更新」ボタンをクリックします。
しばらく経つと CloudFormation テンプレートに適用した DNSName の URL にアクセスできます。
https://{設定したDNSName}/auth
にブラウザでアクセスしてください。
パスワードレス認証の設定
#Administration Console のリンクをクリックして、Username or email
に admin
、Password
に password
を入力して Sign In します。
新しい Realm を作成するため、左上の Master のあたりにマウスを置いて「Add realm」ボタンをクリックします。
Add realm の Name に passengers
と入力します。
左側にある Authentication
をクリックします。
Flow の設定
#- Flow で Browser が選択されたボックスの右にある「Copy」ボタンをクリックします。
- 新しい名前として
WebAuthn Browser
と入力します。 - WebAuthn Browser Forms の下にある「Username Password Form」、「WebAuthn Browser Browser - Conditional OTP」、「Condition - User Configured」と「OTP Form」の右にある
Actions
からDelete
を選んで削除します。
- WebAuthn Browser Forms の右にある
Actions
のAdd execution
をクリックして、Provider
からUsername Form
を選択して「Save」ボタンをクリックします。 - WebAuthn Browser Forms の右にある
Actions
のAdd flow
をクリックしてAlias
にPassword Or Two-factor
を入力して「Save」ボタンをクリックします。このフローはREQUIRED
に設定します。 - Password Or Two-factor の右にある
Actions
のAdd execution
をクリックして、Provider
からWebAuthn Passwordless Authenticator
を選択して「Save」ボタンをクリックします。このフローはALTERNATIVE
に設定します。 - Password Or Two-factor の右にある
Actions
のAdd flow
をクリックしてAlias
にPassword And Two-factor WebAuthn
を入力して「Save」ボタンをクリックします。このフローはALTERNATIVE
に設定します。 - Password And Two-factor WebAuthn の右にある
Actions
のAdd execution
をクリックしてProvider
からPassword Form
を選択して「Save」ボタンをクリックします。このフローはREQUIRED
に設定します。 - 最後に Password And Two-factor WebAuthn の右にある
Actions
のAdd execution
をクリックしてProvider
からWebAuthn Authenticator
を選択して「Save」ボタンをクリックします。このフローはREQUIRED
に設定します。
Bindings
#Bindings タブをクリックして Browser Flow
に WebAuthn Browser
を選択して「Save」ボタンをクリックします。
Required Actions
#Required Actions タブをクリックして「Register」ボタンをクリックし、Required Action に Webauthn Register Passwordless
と Webauthn Register
を選択して「Ok」ボタンをクリックします。
WebAuthn Passwordless Policy
#WebAuthn Passwordless Policy タブをクリックします。
この画面では、次のように入力して「Save」ボタンをクリックします。
項目名 | 値 |
---|---|
Relying Party Entity Name | keycloak |
Signature Algorithms | ES256 |
Relying Party ID | 構築した keycloak の DNSName |
Attestation Conveyance Preference | none |
Authenticator Attachment | platform |
Require Resident Key | No |
User Verification Requirement | discouraged |
Timeout | 0 |
Avoid Same Authenticator Registration | OFF |
Acceptable AAGUIDs |
試してみましょう
#左側の Manage にある Users
をクリックします。
「Add user」ボタンをクリックします。
「Username」、「Email」、「First Name」、「Last Name」を入力し「Save」ボタンをクリックします。
Credentials タブをクリックします。
Set Password にパスワードを入力し「Set Password」ボタンをクリックします。
認証情報の登録
#iPhone や iPad 等の WebAuthn 対応端末の Safari で https://{DNSName}/auth/realms/passengers/account
にアクセスします。
「Sign In」ボタンをクリックします。
Username or email に作成したユーザの Username か Email を入力して「Sign In」ボタンをクリックします。
Password を入力して「Sign In」ボタンをクリックします。
Password の変更が求められたら、変更します。
Security Key Registration の「Register」ボタンをクリックします。
サインインに成功すると「OK」ボタンをクリックして登録を完了します。
ここでは、まず、Two-factor 用のつまりパスワード以外の要素を加えるための MFA 用の認証情報が登録された状態です。
次に、Account Security の Signing In をクリックして、一番下にある Passwordless の Set up Security Key
リンクをクリックしてください。
Serurity Key Registration で「Register」ボタンをクリックして、認証情報の登録をします。
Please input your registerd authentication's label は、先の WebAuthn の登録に使ったものと違うラベルに変更しておいた方がよいでしょう。
Sign Out して、もう一度 Sign In すると、Password を入力する画面の下に Try Another Way
が表示されパスワードレスでサインインできることが確認できます。
まとめ
#最後の認証情報の登録というところで、Keycloak に指紋等の生体情報を登録しているのではないかと疑念を感じたかもしれません。しかし、そのようなことはなく、Keycloak のようなサーバーには公開鍵を登録しているだけで、生体情報とはなんら関係のない情報を登録しているにすぎません。そして、もしサーバーからこの公開鍵が漏洩したとしても、iPhone や iPad 内に厳重に保存された秘密鍵がなければ意味を持つことはありません。
日本クラウドセキュリティアライアンスの「クラウドコンピューティングのためのセキュリティガイダンス v4.0」には次のように書かれています。
生体認証(バイオメトリクス)は、携帯電話で一般的に利用できる生体情報リーダのおかげで、選択肢として成長している。クラウドサービスの場合、バイオメトリクスはローカルな手段であり、バイオメトリクス情報をクラウド事業者には送信しない。
今回は、パスワードレス認証をデモンストレーションしました。次回以降でより深堀りした記事を投稿する予定です。