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
Password-less Journey - パスキーへの移行を見据えたユーザーの準備 @ AXIES 2024
ritou
3
1.4k
OIDF-J EIWG 振り返り
ritou
2
26
そのQRコード、安全ですか? / Cross Device Flow
ritou
4
380
MIXI Mと社内外のサービスを支える認証基盤を作るためにやってきたこと #MTDC2024
ritou
3
470
Passkeys and Identity Federation @ OpenID Summit Tokyo 2024
ritou
2
700
Webアプリ開発者向け パスキー対応の始め方
ritou
4
6.1k
様々なユースケースに利用できる "パスキー" の 導入事例の紹介とUXの課題解説 @ DroidKaigi 2023
ritou
3
4.6k
パスキーはユーザー認証を どう変えるのか?その特徴と導入における課題 @ devsumi 2023 9-C-1
ritou
6
12k
Android/Chromeで体験できる 認証のための標準化仕様の 現在と未来 @ DroidKaigi 2022
ritou
2
6.9k
Other Decks in Technology
See All in Technology
Turing × atmaCup #18 - 1st Place Solution
hakubishin3
0
480
Fanstaの1年を大解剖! 一人SREはどこまでできるのか!?
syossan27
2
170
Snowflake女子会#3 Snowpipeの良さを5分で語るよ
lana2548
0
230
KubeCon NA 2024 Recap / Running WebAssembly (Wasm) Workloads Side-by-Side with Container Workloads
z63d
1
250
終了の危機にあった15年続くWebサービスを全力で存続させる - phpcon2024
yositosi
3
4.5k
1等無人航空機操縦士一発試験 合格までの道のり ドローンミートアップ@大阪 2024/12/18
excdinc
0
160
バクラクのドキュメント解析技術と実データにおける課題 / layerx-ccc-winter-2024
shimacos
2
1.1k
10分で学ぶKubernetesコンテナセキュリティ/10min-k8s-container-sec
mochizuki875
3
330
マイクロサービスにおける容易なトランザクション管理に向けて
scalar
0
120
どちらを使う?GitHub or Azure DevOps Ver. 24H2
kkamegawa
0
730
小学3年生夏休みの自由研究「夏休みに Copilot で遊んでみた」
taichinakamura
0
150
ガバメントクラウドのセキュリティ対策事例について
fujisawaryohei
0
530
Featured
See All Featured
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
0
97
Bash Introduction
62gerente
608
210k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
229
52k
GraphQLとの向き合い方2022年版
quramy
44
13k
StorybookのUI Testing Handbookを読んだ
zakiyama
27
5.3k
Rebuilding a faster, lazier Slack
samanthasiow
79
8.7k
The Illustrated Children's Guide to Kubernetes
chrisshort
48
48k
Done Done
chrislema
181
16k
Measuring & Analyzing Core Web Vitals
bluesmoon
4
170
4 Signs Your Business is Dying
shpigford
181
21k
Build The Right Thing And Hit Your Dates
maggiecrowley
33
2.4k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.3k
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の拡張仕様はたくさんあるが、今回紹 介したポイントを細かく組み合わせて作られ ているものが多い
終わり