KeycloakのDevice Flow、
CIBAについて
OSSセキュリティ技術の会 第九回勉強会
KeycloakのFAPI CIBA 対応記念の巻
Hiroyuki Wada / @wadahiro
今日話すこと
● Device Flow、CIBAの紹介
● Keycloakでの使い方、設定のポイントとか
Keycloakの設定
Device Flowについて
Device Flow
(OAuth 2.0 Device Authorization Grant)
● ブラウザがない/文字入力に制限のあるデバイス上で動くアプリケーション
向けにトークンを発行するフロー
● 例: スマートTV、プリンターなど
● 利用者は別のデバイス (PCやスマホ) で認証/同意する
● (何度かプルリクエストのリレーを経てようやく
) Keycloak 13.0.0で実装された
出所: https://qiita.com/TakahikoKawasaki/items/78eff94cef92741131f0
※フローの詳細については既に詳しい日本語記事がいくつかあるのでそちらを参照
・図解デバイスフロー(RFC 8628)
・OAuth Device Flow(Draft 8)の概要と感想
出所: https://www.lg.com/jp/support/product-help/CT20160005-20151886218724
出所: https://developer.okta.com/blog/2019/02/19/add-oauth-device-flow-to-any-server
Keycloakの設定
設定のポイント
● クライアント設定で、Device Flowを
有効化するだけ
● 基本的にパブリッククライアントで使う
ため、不要なフローは無効化しておこ
う
● Consent Requiredはオフにしていて
も、Device Flowでは常に(毎回)同意
が要求される(フィッシング対策のた
め)
Device Flowの
フィッシングと言えば・・・
先月ちょっと話題に
● Microsoft 365のDevice Flow実
装におけるフィッシング問題
● 詳しくは @ritou 先生の日本語記
事を参照
https://zenn.dev/ritou/articles
/560ee21f03a727
● Device Flowそのものの問題では
ないが、利用する際は注意が必要
出所: https://www.netskope.com/jp/blog/new-phishing-attacks-exploiting-oauth-authentication-flows-part-2
フィッシングへの備え
● 同意画面での説明
○ どのクライアントがリソースアクセスを要求しているか説明
○ 要求しているscopeについて説明
● スコープ設計
○ 必要最低限の権限をクライアントに渡すようにする
※多言語化も可能です
※テーマをカスタマイズすればもっと好きなようにカスタマイズ可能です
※ただし、15.0.2で「Consent Required」を有効にするとトークンリクエストで
 エラーとなるバグがあります (プルリク提出済み )
https://issues.redhat.com/browse/KEYCLOAK-19237
● デフォルトでいくつかのスコープ
は有効 (Assigned)
● 不要なscopeは利用できないよ
うにアサイン解除しておく
● ロールスコープマッピングがデ
フォルトではフルスコープ許可に
なっている
● リソースサーバにてKeycloakの
ロールを利用して認可制御する
場合は注意
Keycloakの設定
CIBAについて
CIBA
(OpenID Connect Client Initiated Backchannel Authentication Flow)
● これまた一味違う新しいフロー
● トークンを必要とするアプリケーションと、実際に認証/同意を行う利用者
のデバイスを分離
● Device Flowと異なり、ユーザを介したリダイレクトは行わない
● 事前にユーザに紐付けられたスマホなどに直接通知される
● その代わり、フロー開始時にユーザを特定するための情報を与える必要
あり (クライアント認証必須)
● こちらもKeycloak 13.0.0で実装された(Pollモードのみ)
● Keycloak 15.0.0ではPingモードも追加された
CIBA
(OpenID Connect Client Initiated Backchannel Authentication Flow)
● ユースケース
○ コールセンターでのユーザ認証、同意取得
○ 銀行窓口でのユーザ認証(対面での認証)
○ POS端末での支払いの承認
○ Googleのスマホでログインの機能
出所: https://ritou.hatenablog.com/entry/2019/03/04/005238
※フローの詳細については既に詳しい日本語記事があるのでそちらを参照
・実装者による CIBA 解説
・OIDC Client Initiated Backchannel Authentication Flow (CIBA)とは - 詳細もとい感想編
● OP <=> 認証デバイス(AD) 間のやりとりは仕様では決まっていない
● KeycloakはADとどう通信する・・・?
CIBAの範囲
出所: https://openid.net/specs/openid-client-initiated-backchannel-authentication-core-1_0.html#auth_server_obtains_consent
出所: https://ritou.hatenablog.com/entry/2019/03/04/005238
● Keycloakでは Decoupled Auth Server (ドキュメントでは Authentication Entity) というもの
を想定している
● KeycloakとHTTP(S)で相互通信を行う (デフォルトSPI実装では)
● Authentication Entity の実装 (ADとのやりとり) はKeycloakの外側で開発者にお任せ
出所: https://github.com/keycloak/keycloak-community/blob/e750f8cbeeaec5506316b6dec765b01f782ffe88/design/client-initiated-backchannel-authentication-flow.md
Authentication Entity の作り方
KeycloakからのHTTPリクエスト
(Authentication Delegation Request)
KeycloakへのHTTPリクエスト
(Authentication Result Notification)
出所:
受け取ったトークンで返信する
login_hintより、ス
マホに通知などし
て同意を得る
Keycloakの設定
設定のポイント
<subsystem xmlns="urn:jboss:domain:keycloak-server:1.1">
...
<spi name="ciba-auth-channel">
<default-provider>ciba-http-auth-channel</default-provider>
<provider name="ciba-http-auth-channel" enabled="true">
<properties>
<property name="httpAuthenticationChannelUri"
value="${env.AUTHENTICATION_ENTITY_URL}"/>
</properties>
</provider>
</spi>
</subsystem>
Authentication Entity の指定 (standalone(-ha).xml 設定)
/subsystem=keycloak-server/spi=ciba-auth-channel/:add(default-provider=ciba-http-auth-channel)
/subsystem=keycloak-server/spi=ciba-auth-channel/provider=ciba-http-auth-channel:add(enabled=tru
e,properties={httpAuthenticationChannelUri=${env.AUTHENTICATION_ENTITY_URL}})
Authentication Entity の指定 (CLIで設定の場合)
● クライアント設定で、Access Typeを
confidential にする。
● 後は、CIBAを有効化するだけ
● こちらも不要なフローは無効化しておく
とよい
後は Authentication Entity を用意
● ここの実装はCIBAのユースケース次第
● 設定ではなく開発・・・
● よく紹介されるコンシューマ向けの用途ではなく、エンタープライズ向けで
何か利用できないか考えて試しに実装してみました
試したユースケースと実装方式
社内のある重要なWebアプリにアクセスする際には、管理者による承認がないとアクセス不可としたい
チャットツール(Mattermost)にBotよりDMでメッセージを送りチャットツール上で許可を得る
3) ログイン
6) 承認依頼
7) 許可
1) アクセス
2) 未認証のためリダイレクト
(OIDCの認可コードフロー開始 )
9) アクセス
4) 認証リクエスト
(CIBAのフロー開始)
5) Authentication
Delegation Request
8) Authentication
Result Notification
2) 未認証のためリダイレクト
(OIDCの認可コードフロー開始 )
試したユースケースと実装方式
社内のある重要なWebアプリにアクセスする際には、管理者による承認がないとアクセス不可としたい
チャットツール(Mattermost)にBotよりDMでメッセージを送りチャットツール上で許可を得る
3) ログイン
6) 承認依頼
7) 許可
1) アクセス
9) アクセス
4) 認証リクエスト
(CIBAのフロー開始)
5) Authentication
Delegation Request
8) Authentication
Result Notification
ここがCIBAの利
用範囲
このケースでは
Keycloak自身がCIBAの
クライアントになる
デモ
Keycloakのアカウント管理画
面をアプリケーションとみたて
て実行
参考) 作ったもの
● https://github.com/wadahiro/mattermost-plugin-keycloak-ciba
○ Mattermost用プラグイン
■ Authentication Entityの役割の実装(HTTP受付、KeycloakにPOST)、Botを
使いDMでユーザとやりとり
○ Keycloak拡張部品
■ Mattermost用AuthenticationChannelProvider
● デフォルトSPI実装だとMattermostにBearerトークンが弾かれたため泣く
泣く実装
■ CIBAAuthenticator
● CIBAクライアントの実装
● 認証フローの最後に必須として設定
Keycloakの設定
まとめ
まとめ
● Keycloakでついに Device Flow / CIBA が使えるようになりました
● Device Flowはフィッシングを念頭に置いて、ご利用は計画的に
● CIBAの利用例として、社内チャットツールを連携したアクセス許可を試してみ
ました
● 皆さんも CIBA のユースケースを考えてみてください!

KeycloakのDevice Flow、CIBAについて