Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
ID連携の標準化仕様紹介とセキュアな実装のためのアプローチ 2021 / Identity F...
Search
ritou
September 05, 2021
Technology
3
9.2k
ID連携の標準化仕様紹介とセキュアな実装のためのアプローチ 2021 / Identity Federation Protocols 2021
ritou
September 05, 2021
Tweet
Share
More Decks by ritou
See All by ritou
OIDF-J EIWG 振り返り
ritou
2
17
そのQRコード、安全ですか? / Cross Device Flow
ritou
4
340
MIXI Mと社内外のサービスを支える認証基盤を作るためにやってきたこと #MTDC2024
ritou
2
430
Passkeys and Identity Federation @ OpenID Summit Tokyo 2024
ritou
2
670
Webアプリ開発者向け パスキー対応の始め方
ritou
4
6k
様々なユースケースに利用できる "パスキー" の 導入事例の紹介とUXの課題解説 @ DroidKaigi 2023
ritou
3
4.5k
パスキーはユーザー認証を どう変えるのか?その特徴と導入における課題 @ devsumi 2023 9-C-1
ritou
6
12k
Android/Chromeで体験できる 認証のための標準化仕様の 現在と未来 @ DroidKaigi 2022
ritou
2
6.8k
C向けサービスで 使われている認証方式と安全な使い方
ritou
12
2.9k
Other Decks in Technology
See All in Technology
フルカイテン株式会社 採用資料
fullkaiten
0
40k
これまでの計測・開発・デプロイ方法全部見せます! / Findy ISUCON 2024-11-14
tohutohu
3
370
20241120_JAWS_東京_ランチタイムLT#17_AWS認定全冠の先へ
tsumita
2
250
ハイパーパラメータチューニングって何をしているの
toridori_dev
0
140
New Relicを活用したSREの最初のステップ / NRUG OKINAWA VOL.3
isaoshimizu
2
590
テストコード品質を高めるためにMutation Testingライブラリ・Strykerを実戦導入してみた話
ysknsid25
7
2.6k
Security-JAWS【第35回】勉強会クラウドにおけるマルウェアやコンテンツ改ざんへの対策
4su_para
0
180
AWS Lambdaと歩んだ“サーバーレス”と今後 #lambda_10years
yoshidashingo
1
170
10XにおけるData Contractの導入について: Data Contract事例共有会
10xinc
6
620
RubyのWebアプリケーションを50倍速くする方法 / How to Make a Ruby Web Application 50 Times Faster
hogelog
3
940
Shopifyアプリ開発における Shopifyの機能活用
sonatard
4
250
DMARC 対応の話 - MIXI CTO オフィスアワー #04
bbqallstars
1
160
Featured
See All Featured
BBQ
matthewcrist
85
9.3k
A designer walks into a library…
pauljervisheath
203
24k
Why Our Code Smells
bkeepers
PRO
334
57k
It's Worth the Effort
3n
183
27k
Unsuck your backbone
ammeep
668
57k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
246
1.3M
jQuery: Nuts, Bolts and Bling
dougneiner
61
7.5k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
44
6.8k
Ruby is Unlike a Banana
tanoku
97
11k
5 minutes of I Can Smell Your CMS
philhawksworth
202
19k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
356
29k
What's in a price? How to price your products and services
michaelherold
243
12k
Transcript
ID連携の標準化仕様紹介と セキュアな実装のための アプローチ ritou 2021/9
この資料はチーム内勉強会 用に作ったものに色々足し てるうちに別物になってし まったものです。
ID連携関連の標準化仕様を 知ってもらう、入門編のよ うな立ち位置です。
まずは何かをできるように するための仕様、セキュリ ティ強化のための仕様があ ることを知っていただけれ ば幸いです
ID連携機能のための 標準化仕様とユースケース
いきなり OpenID Connect(OIDC)
••でログイン Ϣʔβʔ 3FMZJOH1BSUZ 0QFO*%1SPWJEFS Ϣʔβʔ31ʹϩάΠϯ ͍ͨ͠ 01ʹϦμΠϨΫτͯ͠
ೝূΠϕϯτͷใΛཁٻ ೝূΠϕϯτͷใΛఏڙ ̏ ϩάΠϯͯ͠ɺ 31ʹଐੑใΛఏڙ͢Δ͜ͱʹಉҙ 7 ೝূΠϕϯτͷใΛ༻͍ͯ ϩάΠϯঢ়ଶʹ͢Δ 1 6 2 5 3 4
••でログイン Ϣʔβʔ 3FMZJOH1BSUZ 0QFO*%1SPWJEFS Ϣʔβʔ31ʹϩάΠϯ ͍ͨ͠ 01ʹϦμΠϨΫτͯ͠
ೝূΠϕϯτͷใΛཁٻ ೝূΠϕϯτͷใΛఏڙ ̏ ϩάΠϯͯ͠ɺ 31ʹଐੑใΛఏڙ͢Δ͜ͱʹಉҙ 8 ೝূΠϕϯτͷใΛ༻͍ͯ ϩάΠϯঢ়ଶʹ͢Δ 1 6 2 5 3 4
••でログイン Ϣʔβʔ 3FMZJOH1BSUZ 0QFO*%1SPWJEFS Ϣʔβʔ31ʹϩάΠϯ ͍ͨ͠ 01ʹϦμΠϨΫτͯ͠
ೝূΠϕϯτͷใΛཁٻ ೝূΠϕϯτͷใΛఏڙ ̏ ϩάΠϯͯ͠ɺ 31ʹଐੑใΛఏڙ͢Δ͜ͱʹಉҙ 9 ೝূΠϕϯτͷใΛ༻͍ͯ ϩάΠϯঢ়ଶʹ͢Δ 1 6 2 5 3 4
••でログイン Ϣʔβʔ 3FMZJOH1BSUZ 0QFO*%1SPWJEFS Ϣʔβʔ31ʹϩάΠϯ ͍ͨ͠ 01ʹϦμΠϨΫτͯ͠
ೝূΠϕϯτͷใΛཁٻ ೝূΠϕϯτͷใΛఏڙ ̏ ϩάΠϯͯ͠ɺ 31ʹଐੑใΛఏڙ͢Δ͜ͱʹಉҙ 10 ೝূΠϕϯτͷใΛ༻͍ͯ ϩάΠϯঢ়ଶʹ͢Δ 1 6 2 5 3 4
••でログイン Ϣʔβʔ 3FMZJOH1BSUZ 0QFO*%1SPWJEFS Ϣʔβʔ31ʹϩάΠϯ ͍ͨ͠ 01ʹϦμΠϨΫτͯ͠
ೝূΠϕϯτͷใΛཁٻ ೝূΠϕϯτͷใΛఏڙ ̏ ϩάΠϯͯ͠ɺ 31ʹଐੑใΛఏڙ͢Δ͜ͱʹಉҙ 11 ೝূΠϕϯτͷใΛ༻͍ͯ ϩάΠϯঢ়ଶʹ͢Δ 1 6 2 5 3 4
OPがユーザーの同意の元、 RPにイベント情報と属性情報を 提供する仕組み
OpenID Connect (Core) ID連携のためのプロトコル 認証”イベント”の情報を受け渡し ユーザーの属性情報提供
次は OAuth 2.0
別サービスとの連携 3FTPVSDF0XOFS $MJFOU "VUIPSJ[BUJPO4FSWFS 3FTPVSDF4FSWFS Ϣʔβʔ$MJFOUͰผαʔϏε
ͷϦιʔεΛར༻͍ͨ͠ "VUI;4FSWFSʹϦμ ΠϨΫτͯ͠ ϦιʔεΞΫηεΛཁٻ ϦιʔεΞΫηεͷݖݶΛఏڙ ̏ ϩάΠϯͯ͠ɺ $MJFOUʹϦιʔεΞΫηεΛఏڙ͢ Δ͜ͱʹಉҙ 15 3FTPVSDF4FSWFS͔Βऔಘ ͨ͠Λར༻͢ΔαʔϏεΛఏڙ 1 6 2 5 3 4
別サービスとの連携 3FTPVSDF0XOFS $MJFOU "VUIPSJ[BUJPO4FSWFS 3FTPVSDF4FSWFS Ϣʔβʔ$MJFOUͰผαʔϏε
ͷϦιʔεΛར༻͍ͨ͠ "VUI;4FSWFSʹϦμ ΠϨΫτͯ͠ ϦιʔεΞΫηεΛཁٻ ϦιʔεΞΫηεͷݖݶΛఏڙ ̏ ϩάΠϯͯ͠ɺ $MJFOUʹϦιʔεΞΫηεΛఏڙ͢ Δ͜ͱʹಉҙ 16 3FTPVSDF4FSWFS͔Βऔಘ ͨ͠Λར༻͢ΔαʔϏεΛఏڙ 1 6 2 5 3 4
別サービスとの連携 3FTPVSDF0XOFS $MJFOU "VUIPSJ[BUJPO4FSWFS 3FTPVSDF4FSWFS Ϣʔβʔ$MJFOUͰผαʔϏε
ͷϦιʔεΛར༻͍ͨ͠ "VUI;4FSWFSʹϦμ ΠϨΫτͯ͠ ϦιʔεΞΫηεΛཁٻ ϦιʔεΞΫηεͷݖݶΛఏڙ ̏ ϩάΠϯͯ͠ɺ $MJFOUʹϦιʔεΞΫηεΛఏڙ͢ Δ͜ͱʹಉҙ 17 3FTPVSDF4FSWFS͔Βऔಘ ͨ͠Λར༻͢ΔαʔϏεΛఏڙ 1 6 2 5 3 4
別サービスとの連携 3FTPVSDF0XOFS $MJFOU "VUIPSJ[BUJPO4FSWFS 3FTPVSDF4FSWFS Ϣʔβʔ$MJFOUͰผαʔϏε
ͷϦιʔεΛར༻͍ͨ͠ "VUI;4FSWFSʹϦμ ΠϨΫτͯ͠ ϦιʔεΞΫηεΛཁٻ ϦιʔεΞΫηεͷݖݶΛఏڙ ̏ ϩάΠϯͯ͠ɺ $MJFOUʹϦιʔεΞΫηεΛఏڙ͢ Δ͜ͱʹಉҙ 18 3FTPVSDF4FSWFS͔Βऔಘ ͨ͠Λར༻͢ΔαʔϏεΛఏڙ 1 6 2 5 3 4
別サービスとの連携 3FTPVSDF0XOFS $MJFOU "VUIPSJ[BUJPO4FSWFS 3FTPVSDF4FSWFS Ϣʔβʔ$MJFOUͰผαʔϏε
ͷϦιʔεΛར༻͍ͨ͠ "VUI;4FSWFSʹϦμ ΠϨΫτͯ͠ ϦιʔεΞΫηεΛཁٻ ϦιʔεΞΫηεͷݖݶΛఏڙ ̏ ϩάΠϯͯ͠ɺ $MJFOUʹϦιʔεΞΫηεΛఏڙ͢ Δ͜ͱʹಉҙ 19 3FTPVSDF4FSWFS͔Βऔಘ ͨ͠Λར༻͢ΔαʔϏεΛఏڙ 1 6 2 5 3 4
認可サーバーがリソースオーナーの 同意の元で、クライアントに リソースアクセスを提供する仕組み
混乱を生むところ 登場人物 (目的が違うので名前は違う) ユーザー vs リソースオーナー Relying Party vs Client
OpenID Provider vs AuthZ Server 提供するもの イベント情報、属性情報 vs リソースアクセス
OIDC vs “OAuth認証" OIDCのRP OPから受け取った情報に紐づくユーザーをログイン状 態にできる OAuthのClient 認可サーバーから受け取ったトークンでリソースサー バー(API)にアクセスする プロフィールAPIにアクセスして受け取った情報に紐づ
くユーザーをログイン状態に”できる場合がある”
OIDC = OAuth 2.0 + Identity Layer ID連携に必要な認証イベント情報のやり取り セキュリティイベント :
5W1H + α 属性情報 : 汎用的なプロフィール情報 OAuth 2.0のトークンのやり取りを拡張 属性情報API : 最新の情報を提供 OAuth 2.0のリソースアクセスで実現
OIDCで扱う属性情報 sub: ユーザーやデバイス等の識別子 profile: ニックネーム、氏名、プロフィール、 性別、生年月日、アイコン画像、URLなど email: メアド、確認済みフラグ phone number:
電話番号、確認済みフラグ address: 住所
属性情報の表現例
OIDCやOAuth 2.0には 関連仕様がいっぱいあるので いくつか紹介
OIDC Discovery, OIDC Dynamic Registration
ログインに利用するOPって 個別に設定が必要だよね…?
Discovery & Dynamic Registration OpenID Connect Discovery エンドユーザーの情報からOPを特定する方法
OPのエンドポイントや仕様のサポート状況を RPが取得するためメタデータ定義 OpenID Connect Dynamic Registration 動的なRP登録
Discoveryの実行例
Dynamic Registration リクエスト/レスポンス例
ユースケース: RP設定の効率化 1. 連携対象として“Google”を選択 2. RPはDiscoveryを行い、Googleのエンドポ イントなどを取得 3.
(Dynamic Registration非対応の場合な ど)必要な情報を手動で設定
ユースケース: “普段利用しているOP”でログイン 1. ユーザーがメールアドレスを送信 2. RPはOP情報を取得、Dynamic Registrationがサポートされていたら自身 を登録、内部でも情報を保存
3. 取得した情報(ClientIDなど)を用いてID連 携開始
Session Management
OIDCで連携してもOP/RPの セッション状態は同期されない “ID連携時” OP/RP共にログイン状態 “OPでログアウト” RPはログイン状態 (逆もあり得る) “RPでログアウト”
OPはログイン状態 (他にもRPがいたりする)
Session Management関連仕様 Session Management セッションの同期状態を確認 RP-initiated Logout RP
-> OPにログアウトを要求 Front-Channel Logout OP -> RPにフロントチャンネルでログアウトを通知 Back-Channel Logout OP -> RPにバックチャンネルでログアウトを通知
ユースケース: ログイン状態の同期 複数ドメインで構成されるサービスで、ID連携 時のログイン状態が継続しているかを検証可能 シングルログアウト 1 OP :
n RPにも対応可能 (実装によっては3rdPartyCookieなどの動向 に注意が必要)
Identity Assurance
検証済みデータの扱い 同意の元で サービスに渡せる? 身元確認! ユーザー
Identity Assurance OIDCでOPがユーザーの検証済み属性情報を RPに提供するための仕様 要求 : どんな情報をどういう目的で欲しい 表現
: 検証プロセスの情報 + 属性情報 応答 : IDトークンもしくは属性情報API 犯収法、携帯電話不正利用防止法の定義も
検証済み属性情報の例 "verified_claims": { "verification": { “trust_ framework": “jp_
aml” }, "claims": { “given_ name#ja-Hani-JP": “太郎", “family_ name#ja-Hani-JP": "東京", “given_ name#ja-Kana-JP": "タロウ", “family_ name#ja-Kana-JP": "トウキョウ", "birthdate": "1981-01-01" } }
ユースケース: 本人確認情報の流通 OPが決済機能で”本人確認” 本人確認書類の画像やマイナンバーカード (JPKI) RPが確認済みの情報やフラグを利用 同様の確認を行うコスト,ユーザーの負担軽 減(どこまで許されるかは仕様の対象外)
RISC & CAEP
ID連携後に非同期になるの はセッションだけではない ID連携 してから… 接続環境が変わった (リスク評価できる?) アカウント無効化 (RPは気付ける?)
OIDF Shared Signals and Event WG セキュリティイベント、状態変化等のイベン トを共有できるようにする Continuous Access
Evaluation Protocol (CAEP) Mitigating Catastrophic Account Compromise (RISC)
RISC実装例: ID連携解除, 退会の 通知 OP側で状態変更を検知したらRPのエンドポイ ントにWebhookで送信 セッション無効化 アカウント無効化
退会 サービス側は署名検証してから処理
CIBA(シーバ)
Decoupled Authentication 手元のスマホで認証+α 決済では 3D Secure 2.2 にて登場 OIDCの文脈で実現するのがCIBA
CIBAでできること 分離された環境によるユースケース Consumption Device: 認証を要求する端末 Authentication Device: 認証を行う端末 端末のローカル認証の利用 FIDOとの組み合わせ
コンビニ決済 ×CIBA コンビニで支払い (ポイントカードを出す) 手元の端末で 認証とアクセス許可 (店員に見せなくて良い) 決済完了
オフラインのユースケース POS端末 コールセンター 銀行の窓口業務 サブスクライブ決済など
ここまでのまとめ ID連携のための仕様のうち、こんなことができ るよってのを紹介 単純な〜〜でログイン以外にも結構ある 標準化された仕様がある=ユースケースに対す るリスクと対策が整理されている ID連携の機能を提供する際はなるべく採用し ていくべき
ID連携仕様から学ぶ Webアプリケーション間の データ送受信をセキュアに する方法
セキュリティ強化のための 仕様 基本仕様 : フレームワーク、最もシンプルな実装 拡張仕様 既存仕様と組み合わせたり一部を置き換えるこ とで安全性を高める プロファイル、BCP(Best Current
Practice) 気をつけること!仕様の組み合わせ方!
OAuth 2.0の場合
基本仕様と拡張仕様 基本仕様 RFC6749 アクセストークン取得までを定義したフ レームワーク RFC6750 Bearerトークンを用いたシンプルなAPI保護 拡張仕様 RFC7636 PKCEと呼ばれる、モバイルアプリ実装の攻
撃を防ぐための拡張
基本仕様と拡張仕様 BCP RFC8252 ネイティブアプリのBCP (策定中) SPAのBCP OAuth 2.1 たくさんのBCPと拡張仕様を整 理して1つのドキュメントとして整理してい
るもの
FAPI
OIDC FAPI 金融サービス相当のセキュリティレベルが求 められる状況でID連携を提供するためのプロ ファイル Baseline : 中程度の… Advanced :
高度な…
ここからはFAPIで定義/引用されている 仕様からセキュアなWebアプリケーション 実装のヒントを紹介します
OIDCで使われている通信 直接通信 : Webアプリ間、Webアプリとモバイ ルアプリ間の通信 クライアント認証つきのリクエスト アクセストークンにより保護されたリクエスト 間接通信 : ブラウザを利用してリダイレクト
GET / POST
クライアント認証 共有鍵暗号方式 クライアントシークレット(テキスト/バイ ナリ)を共有 公開鍵暗号方式 秘密鍵/公開鍵のペアを生成、公開鍵を相 手に渡しておく
クライアントシークレットを 利用したクライアント認証 1. そのまま送る 1. POSTパラメータ client_ secret_
post 2. Basic認証の形式 client_ secret_ basic 2. 直接送らず、署名生成の鍵として利用 client_ secret_ jwt 1. 署名付きのJWTを生成して指定することで、ク ライアントシークレットが通信路を流れない
鍵ペアを利用したクライア ント認証 private_ key__ jwt 秘密鍵を用いて署名付きJWTを生成 受け取った側が公開鍵を用いて署名検証 Mutual
TLS TLSのクライアント証明書の仕組みを利用
リソースアクセス Bearer Token アクセストークンそのまま利用 Sender-Constrained Token Mutual TLS : TLSのクライアント証明書の仕組
みを利用 署名付きJWT : アクセストークン発行時に鍵ペ アを紐付ける(DPoP)
直接通信のポイント 暗号化(Encryption)までは求められない シークレットをそのまま送らない方法が推奨 されている トークンを利用する場合も、JWTなどを用 いてSender-Constrainedにすることでセ キュアにできる
間接通信の保護 GETリクエスト クエリパラメータ フラグメントの利用: サーバーログにパラ メータが含まれない データをJWT形式にする: 改ざん検知可能
間接通信の保護 POST POSTリクエスト フォームデータ データをJWT形式にする: 改ざん検知可能 (3rd Party CookieやSameSite属性の影響 に注意)
間接通信の保護 直接通信との組み合わせ Push(データを送りたい側がリクエスト) 予めデータをPushしておき、取得したキーをGET/ POSTリクエストに含む Pull(データを受け取る側がリクエスト) GET/POSTリクエストに含んだキーに対して受信側にア クセスしてもらう 直接通信を利用することで、複雑な構造のリクエストを 表現可能
連続した間接通信の保護 「ブラウザで行って戻ってくる」処理 例:RP->OP->RPというリダイレクト OIDCの認証フローで一般的 CSRFなどなかなか物騒な世界
連続した間接通信の保護 セッションに紐づけた値をクエリで引き回す (state @ OAuth 2.0) セッションに紐づけた値を署名つきJWTで 引き回す (OIDC nonce
& JAR)
間接通信のポイント こちらも暗号化(Encryption)までは求めら れない 署名付きリクエストにすることで改ざん検知 が可能 データをUser-Agent上に流したくない、大 きいサイズのデータをやり取りするような場 合は直接通信と組み合わせる
ここまでのまとめ OIDCのセキュリティプロファイルや拡張仕 様などで言及されている、直接通信/間接通 信におけるセキュリティ強化のための方法を 紹介した 基本的な部分を押さえておけば仕様を読むこ とがあっても怖くはない…はず
仕様の話があまり出てこな かったが…? OIDCの拡張仕様はたくさんあるが、今回紹 介したポイントを細かく組み合わせて作られ ているものが多い (次回があれば)OIDCのシーケンスに対して “ここを強化するためにはこうする” みた いな解説をしたい
全体のまとめ ユースケースがある仕様の概要と、セキュリ ティ強化のための考え方を紹介した ID連携では単にユーザーIDを取得するだけで はなく様々な処理の標準化が進められている OIDCの拡張仕様はたくさんあるが、今回紹 介したポイントを細かく組み合わせて作られ ているものが多い
終わり