OAuth PKCE
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicros...
-戻る
--[[OAuth 2.0 拡張]]
--[[UserAgentでOAuth2のTokenを取得するベスト・プラクティ...
* 目次 [#p291d1f4]
#contents
*概要 [#jb3d7ad1]
認可コード横取り攻撃 (authorization code interception att...
-(Authorization Codeグラント種別により発行された)~
認可コードをクライアントアプリケーションが受け取る際、~
悪意のあるアプリケーションがその認可コードを横取りする攻...
-[[OpenID Connect]]の、[[Authorization Code Flow>OpenID C...
**課題 [#d588d1d4]
ネイティブアプリが、外部ブラウザを使用してOAuth 2.0認証要...
>「[[Implicit Flow>OAuth#m5c2d510]]ではなく、[[Authorizat...
redirect_uriにPrivate-Use URI Schemeを使用してcodeを取得...
という方式があるが(下図を参照)、
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+
| End Device (e.g., Smartphone) |
| |
| +-------------+ +----------+ | (6) Access Token ...
| |Legitimate | | Malicious|<--------------------...
| |OAuth 2.0 App| | App |-------------------->...
| +-------------+ +----------+ | (5) Authorization ...
| | ^ ^ | Grant ...
| | \ | | ...
| | \ (4) | | ...
| (1) | \ Authz| | ...
| Authz| \ Code | | ...
| Request| \ | | ...
| | \ | | ...
| | \ | | ...
| v \ | | ...
| +----------------------------+ | ...
| | | | (3) Authz Code ...
| | Operating System/ |<--------------------...
| | Browser |-------------------->...
| | | | (2) Authz Request ...
| +----------------------------+ | ...
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+
-Private-Use URI Schemeの上書き攻撃によって、このcodeが傍...
-また、client_idや、client_secretも漏洩してしまう可能性が...
**対策 [#j94e6ae3]
-コード交換のための証明鍵(PKCE、 "pixy"と発音)を使用し...
-プロビジョニングされたアプリケーションのバイナリ・ファイ...
機密性が考慮されていないため、client_secretを必要としない...
*仕様 [#gb8fc333]
**仕様の概要 [#obb75901]
このフローは、
-Client ≒ デバイス(UserAgent)になる。
-redirect_uriにPrivate-Use URI Schemeが使用される点を除い...
[[Authorization Code Flow>OAuth#yfeb403d]]と同じだが、下...
--認証リクエスト
--Tokenリクエスト
+-------...
| Auth...
+--------+ | +-----...
| |--(A)- Authorization Request ---->| ...
| | + t(code_verifier), t_m | | Auth...
| | | | E...
| |<-(B)---- Authorization Code -----| ...
| | | +-----...
| Client | | ...
| | | +-----...
| |--(C)-- Access Token Request ---->| ...
| | + code_verifier | | T...
| | | | En...
| |<-(D)------ Access Token ---------| ...
+--------+ | +-----...
+-------...
**仕様の詳細 [#sb35c097]
-Clientは、認可リクエストを送信する前に、
--乱数 "code_verifier" を発生させ、
--[[ハッシュ関数>#k363fd25]] "t" を用いた
--ハッシュ値 "t(code_verifier)"を計算する。
-Clientは、認可リクエストに以下のパラメタを含める。
--code_challenge_method:[[ハッシュ関数>#k363fd25]] "t"
--code_challenge:ハッシュ値 "t(code_verifier)"
-認可エンドポイントで、前述の認可リクエストを受信した際、...
-Clientは、Tokenリクエストに、先程生成した code_verifier...
-Tokenエンドポイントでcode_verifierを含むTokenリクエスト...
--code_challenge_method:[[ハッシュ関数>#k363fd25]] "t"
--code_challenge:ハッシュ値 "t(code_verifier)"
>を使用して、code_verifierの妥当性を検証する。
-なお、このフローでは、client_secretは不要とする。
***[[各エンドポイント>OAuth#h4dcb0c7]]で受け取るパラメタ ...
-認可エンドポイント
|#|パラメタ|要否|説明|h
|1|code_challenge|必須|Code Verifier を元に計算された Cod...
|2|code_challenge_method|任意|Code Challenge の計算に用い...
-Tokenエンドポイント
|#|パラメタ|要否|説明|h
|1|code_verifier|必須|動的に作成された暗号的にランダムな4...
***ハッシュ関数 [#k363fd25]
-plain:
--恒等関数(引数と同じ戻り値を返すの意)
--code_verifierをそのまま使用する(ClientでS256がサポート...
-S256:
--BASE64URL-ENCODE(SHA256(ASCII(code_verifier)))
--SHA-256 でハッシュ化した値を base64url に変換したもの。
***codeとの関連 [#qe9e38a1]
-サーバー・ステートレス~
通常、"code_challenge"および"code_challenge_method"の~
値は暗号化された形式で"code"自体に格納される。
-サーバー・ステートフル~
codeに関連付けられたAuthorization Serverに格納することも...
"code_challenge"と"code"を関連付ける方法は、仕様の対象外。
*セキュリティに関する考慮事項 [#id24a0d3]
**code_verifier [#k379ad67]
-code_verifierには充分なエントロピーが必要(256ビット以上...
-生成には、適切なRNG(RNGCryptoServiceProviderなど)の使...
**盗聴者からの保護 [#r76df0b6]
-通常、"S256"を使用する。~
PKCEをサポートするサーバーは"S256"をサポートする必要があ...
--"plain"では、"code_challenge" = "code_verifier"となり盗...
--従って、通常、"plain"ではなく、"S256"を使用する必要があ...
-"plain"を使用する場合、
>サーバー・ステートレスで"code"から"code_challenge"および...
取り出す場合の処理は、当該サーバだけが可能になるように実...
**code_challenge [#s821e3e8]
code_challengeの生成にソルト(やストレッチ)が不要な理由。
-ソルトによって、辞書空間が大幅に拡張される。
-しかし、
--code_verifierはpasswordと異なり、エントロピーが高い。
--GPUの進化によってソルトの価値が減ってきている。
このため、code_challengeの生成にソルト(やストレッチ)は...
*補足 [#odafd559]
**client_secret不要?問題 [#k3b1f3c9]
***概要 [#q94b6549]
OAuth PKCEのアクセストークン・リクエストでは、client_secr...
-なので、client_secret_basic ではなく、client_secret_post...
-Auth0では、client_secret_post でもなく、client_secret_qu...
***参考 [#s63ff1ec]
-OSSコンソーシアム
--PKCEのトークンリクエストはフロントエンドから?バックエ...
---①~
https://www.osscons.jp/jorfs4g6d-537
---②~
https://www.osscons.jp/joxql6yjz-537
**オレオレPKCE [#t885d050]
***概要 [#fdf40453]
-OAuth PKCEをサポートしていない Idp/Sts でClient側に実装...
PKCEッポくする処理シーケンス(本来は、リプレース予算の獲...
-よりセキュアに、OAuth PKCEっぽく実装する場合、~
code_verifierをそのまま使用するのではなく、以下のcode_cha...
なお、アルゴリズム(code_challenge_method)は、今の所、"p...
--code_challenge_method:ハッシュ関数 "t"
--code_challenge:ハッシュ値 "t(code_verifier)"
***フロー [#y5663f4b]
① Resource Owner(ユーザ)がスマホ上のClient(スマホネイ...
② Client(スマホネイティブ・アプリ)が起動する。
③ Client(スマホネイティブ・アプリ)のログイン ボタン or ...
④ 外部ブラウザが起動して、Client(バックエンドWebアプリ)...
☆ CSRF対策、カスタムURLスキーム上書き攻撃対策として、~
Client(スマホネイティブ・アプリ)は、固定でないstate...
※ stateとcode_verifierパラメタは後で使用するので、Clien...
[ここからOAuth2のAuthoriaztion Codeフローでの認証]
⑤ Client(バックエンドWebアプリ)はClient(スマホネイティ...
Authorization Serverへリダイレクト(OAuth2のAuthoriazti...
☆ CSRF対策として、Client(バックエンドWebアプリ)は、~
Client(スマホネイティブ・アプリ)から渡されたstate...
⑥ Authorization Serverがログイン画面を表示する。
⑦ Resource Owner(ユーザ)がクレデンシャル(ID, PWD)を入...
⑧ Authorization ServerはAuthoriaztion Code(code)を発行し~
Client(バックエンドWebアプリ)のRedirectエンドポイント...
⑨ Client(バックエンドWebアプリ)は、先ず、stateパラメタ...
Authorization ServerのTokenエンドポイントへ AccessToken...
⑩ Authorization ServerからClient(バックエンドWebアプリ)...
⑪ Client(バックエンドWebアプリ)は、AccessTokenを使用し...
ユーザー情報が取得できたらユーザがログイン(認証/認可)さ...
[ここまでOAuth2のAuthoriaztion Codeフローでの認証]
⑫ Client(バックエンドWebアプリ)は、Client(スマホネイテ...
⑬ 次に、カスタムURLスキームでClient(スマホネイティブ・ア...
⑭ Client(スマホネイティブ・アプリ)は、一時codeとstateを...
stateが問題なければ、一時codeと、④で指定したcode_verifi...
⑮ Client(バックエンドWebアプリ)のTokenエンドポイントは、~
codeとcode_verifierを検証し、問題なければ認証tokenを発...
⑯ Client(スマホネイティブ・アプリ)は、認証tokenを取得す...
⑰ Client(スマホネイティブ・アプリ)は、 認証tokenを使用...
Client(バックエンドWebアプリ)のWebAPIへアクセスし、~
正常系のリターンがあれば、ユーザがログイン(認証/認可)さ...
**スマホ向けPKCE [#i133571b]
***[[Authorization Code Grant Flow with PKCE]] [#f3cfb634]
[[SPA>Single-page application]]でPKCEする場合のプロファイ...
*参考 [#ca1689ad]
-RFC7636として発行されたOAuth PKCEとは - r-weblife~
http://d.hatena.ne.jp/ritou/20151018/1445181974
-PKCE: 認可コード横取り攻撃対策のために~
OAuth サーバーとクライアントが実装すべきこと - Qiita~
https://qiita.com/TakahikoKawasaki/items/00f333c72ed96c4d...
-OAuth2.0で認可コードの漏洩を防ぐPKCE - 理系学生日記~
http://kiririmode.hatenablog.jp/entry/20170206/1486306800
--OAuth 2.0 and PKCE | Pedro Félix's shared memory~
https://blog.pedrofelix.org/2016/02/15/oauth-2-0-and-pkce/
-OAuth for Native Apps | GREE Engineers' Blog~
http://labs.gree.jp/blog/2015/12/14831/
--解決策1-2: OAuth PKCE 拡張を利用する
**仕様 [#g417e99c]
-RFC 7636 - Proof Key for Code Exchange by OAuth Public C...
https://tools.ietf.org/html/rfc7636
--OAuth 2.0 Threat Model and Security Considerations~
https://www.rfc-editor.org/rfc/rfc6819.txt
--Recommendations for Secure Use of~
Transport Layer Security (TLS)~
and Datagram Transport Layer Security (DTLS)~
https://www.rfc-editor.org/rfc/rfc7525.txt
**関連 [#xe006d83]
***[[OAuth PKCE利用時の構成図>UserAgentでOAuth2のTokenを...
***[[OAuth 2.0 for Native Apps]] [#fd72f8ea]
***[[OAuth 2.0 for Browser-Based Apps]] [#m5706070]
----
Tags: [[:IT国際標準]], [[:認証基盤]], [[:クレームベース認...
終了行:
「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicros...
-戻る
--[[OAuth 2.0 拡張]]
--[[UserAgentでOAuth2のTokenを取得するベスト・プラクティ...
* 目次 [#p291d1f4]
#contents
*概要 [#jb3d7ad1]
認可コード横取り攻撃 (authorization code interception att...
-(Authorization Codeグラント種別により発行された)~
認可コードをクライアントアプリケーションが受け取る際、~
悪意のあるアプリケーションがその認可コードを横取りする攻...
-[[OpenID Connect]]の、[[Authorization Code Flow>OpenID C...
**課題 [#d588d1d4]
ネイティブアプリが、外部ブラウザを使用してOAuth 2.0認証要...
>「[[Implicit Flow>OAuth#m5c2d510]]ではなく、[[Authorizat...
redirect_uriにPrivate-Use URI Schemeを使用してcodeを取得...
という方式があるが(下図を参照)、
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+
| End Device (e.g., Smartphone) |
| |
| +-------------+ +----------+ | (6) Access Token ...
| |Legitimate | | Malicious|<--------------------...
| |OAuth 2.0 App| | App |-------------------->...
| +-------------+ +----------+ | (5) Authorization ...
| | ^ ^ | Grant ...
| | \ | | ...
| | \ (4) | | ...
| (1) | \ Authz| | ...
| Authz| \ Code | | ...
| Request| \ | | ...
| | \ | | ...
| | \ | | ...
| v \ | | ...
| +----------------------------+ | ...
| | | | (3) Authz Code ...
| | Operating System/ |<--------------------...
| | Browser |-------------------->...
| | | | (2) Authz Request ...
| +----------------------------+ | ...
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+
-Private-Use URI Schemeの上書き攻撃によって、このcodeが傍...
-また、client_idや、client_secretも漏洩してしまう可能性が...
**対策 [#j94e6ae3]
-コード交換のための証明鍵(PKCE、 "pixy"と発音)を使用し...
-プロビジョニングされたアプリケーションのバイナリ・ファイ...
機密性が考慮されていないため、client_secretを必要としない...
*仕様 [#gb8fc333]
**仕様の概要 [#obb75901]
このフローは、
-Client ≒ デバイス(UserAgent)になる。
-redirect_uriにPrivate-Use URI Schemeが使用される点を除い...
[[Authorization Code Flow>OAuth#yfeb403d]]と同じだが、下...
--認証リクエスト
--Tokenリクエスト
+-------...
| Auth...
+--------+ | +-----...
| |--(A)- Authorization Request ---->| ...
| | + t(code_verifier), t_m | | Auth...
| | | | E...
| |<-(B)---- Authorization Code -----| ...
| | | +-----...
| Client | | ...
| | | +-----...
| |--(C)-- Access Token Request ---->| ...
| | + code_verifier | | T...
| | | | En...
| |<-(D)------ Access Token ---------| ...
+--------+ | +-----...
+-------...
**仕様の詳細 [#sb35c097]
-Clientは、認可リクエストを送信する前に、
--乱数 "code_verifier" を発生させ、
--[[ハッシュ関数>#k363fd25]] "t" を用いた
--ハッシュ値 "t(code_verifier)"を計算する。
-Clientは、認可リクエストに以下のパラメタを含める。
--code_challenge_method:[[ハッシュ関数>#k363fd25]] "t"
--code_challenge:ハッシュ値 "t(code_verifier)"
-認可エンドポイントで、前述の認可リクエストを受信した際、...
-Clientは、Tokenリクエストに、先程生成した code_verifier...
-Tokenエンドポイントでcode_verifierを含むTokenリクエスト...
--code_challenge_method:[[ハッシュ関数>#k363fd25]] "t"
--code_challenge:ハッシュ値 "t(code_verifier)"
>を使用して、code_verifierの妥当性を検証する。
-なお、このフローでは、client_secretは不要とする。
***[[各エンドポイント>OAuth#h4dcb0c7]]で受け取るパラメタ ...
-認可エンドポイント
|#|パラメタ|要否|説明|h
|1|code_challenge|必須|Code Verifier を元に計算された Cod...
|2|code_challenge_method|任意|Code Challenge の計算に用い...
-Tokenエンドポイント
|#|パラメタ|要否|説明|h
|1|code_verifier|必須|動的に作成された暗号的にランダムな4...
***ハッシュ関数 [#k363fd25]
-plain:
--恒等関数(引数と同じ戻り値を返すの意)
--code_verifierをそのまま使用する(ClientでS256がサポート...
-S256:
--BASE64URL-ENCODE(SHA256(ASCII(code_verifier)))
--SHA-256 でハッシュ化した値を base64url に変換したもの。
***codeとの関連 [#qe9e38a1]
-サーバー・ステートレス~
通常、"code_challenge"および"code_challenge_method"の~
値は暗号化された形式で"code"自体に格納される。
-サーバー・ステートフル~
codeに関連付けられたAuthorization Serverに格納することも...
"code_challenge"と"code"を関連付ける方法は、仕様の対象外。
*セキュリティに関する考慮事項 [#id24a0d3]
**code_verifier [#k379ad67]
-code_verifierには充分なエントロピーが必要(256ビット以上...
-生成には、適切なRNG(RNGCryptoServiceProviderなど)の使...
**盗聴者からの保護 [#r76df0b6]
-通常、"S256"を使用する。~
PKCEをサポートするサーバーは"S256"をサポートする必要があ...
--"plain"では、"code_challenge" = "code_verifier"となり盗...
--従って、通常、"plain"ではなく、"S256"を使用する必要があ...
-"plain"を使用する場合、
>サーバー・ステートレスで"code"から"code_challenge"および...
取り出す場合の処理は、当該サーバだけが可能になるように実...
**code_challenge [#s821e3e8]
code_challengeの生成にソルト(やストレッチ)が不要な理由。
-ソルトによって、辞書空間が大幅に拡張される。
-しかし、
--code_verifierはpasswordと異なり、エントロピーが高い。
--GPUの進化によってソルトの価値が減ってきている。
このため、code_challengeの生成にソルト(やストレッチ)は...
*補足 [#odafd559]
**client_secret不要?問題 [#k3b1f3c9]
***概要 [#q94b6549]
OAuth PKCEのアクセストークン・リクエストでは、client_secr...
-なので、client_secret_basic ではなく、client_secret_post...
-Auth0では、client_secret_post でもなく、client_secret_qu...
***参考 [#s63ff1ec]
-OSSコンソーシアム
--PKCEのトークンリクエストはフロントエンドから?バックエ...
---①~
https://www.osscons.jp/jorfs4g6d-537
---②~
https://www.osscons.jp/joxql6yjz-537
**オレオレPKCE [#t885d050]
***概要 [#fdf40453]
-OAuth PKCEをサポートしていない Idp/Sts でClient側に実装...
PKCEッポくする処理シーケンス(本来は、リプレース予算の獲...
-よりセキュアに、OAuth PKCEっぽく実装する場合、~
code_verifierをそのまま使用するのではなく、以下のcode_cha...
なお、アルゴリズム(code_challenge_method)は、今の所、"p...
--code_challenge_method:ハッシュ関数 "t"
--code_challenge:ハッシュ値 "t(code_verifier)"
***フロー [#y5663f4b]
① Resource Owner(ユーザ)がスマホ上のClient(スマホネイ...
② Client(スマホネイティブ・アプリ)が起動する。
③ Client(スマホネイティブ・アプリ)のログイン ボタン or ...
④ 外部ブラウザが起動して、Client(バックエンドWebアプリ)...
☆ CSRF対策、カスタムURLスキーム上書き攻撃対策として、~
Client(スマホネイティブ・アプリ)は、固定でないstate...
※ stateとcode_verifierパラメタは後で使用するので、Clien...
[ここからOAuth2のAuthoriaztion Codeフローでの認証]
⑤ Client(バックエンドWebアプリ)はClient(スマホネイティ...
Authorization Serverへリダイレクト(OAuth2のAuthoriazti...
☆ CSRF対策として、Client(バックエンドWebアプリ)は、~
Client(スマホネイティブ・アプリ)から渡されたstate...
⑥ Authorization Serverがログイン画面を表示する。
⑦ Resource Owner(ユーザ)がクレデンシャル(ID, PWD)を入...
⑧ Authorization ServerはAuthoriaztion Code(code)を発行し~
Client(バックエンドWebアプリ)のRedirectエンドポイント...
⑨ Client(バックエンドWebアプリ)は、先ず、stateパラメタ...
Authorization ServerのTokenエンドポイントへ AccessToken...
⑩ Authorization ServerからClient(バックエンドWebアプリ)...
⑪ Client(バックエンドWebアプリ)は、AccessTokenを使用し...
ユーザー情報が取得できたらユーザがログイン(認証/認可)さ...
[ここまでOAuth2のAuthoriaztion Codeフローでの認証]
⑫ Client(バックエンドWebアプリ)は、Client(スマホネイテ...
⑬ 次に、カスタムURLスキームでClient(スマホネイティブ・ア...
⑭ Client(スマホネイティブ・アプリ)は、一時codeとstateを...
stateが問題なければ、一時codeと、④で指定したcode_verifi...
⑮ Client(バックエンドWebアプリ)のTokenエンドポイントは、~
codeとcode_verifierを検証し、問題なければ認証tokenを発...
⑯ Client(スマホネイティブ・アプリ)は、認証tokenを取得す...
⑰ Client(スマホネイティブ・アプリ)は、 認証tokenを使用...
Client(バックエンドWebアプリ)のWebAPIへアクセスし、~
正常系のリターンがあれば、ユーザがログイン(認証/認可)さ...
**スマホ向けPKCE [#i133571b]
***[[Authorization Code Grant Flow with PKCE]] [#f3cfb634]
[[SPA>Single-page application]]でPKCEする場合のプロファイ...
*参考 [#ca1689ad]
-RFC7636として発行されたOAuth PKCEとは - r-weblife~
http://d.hatena.ne.jp/ritou/20151018/1445181974
-PKCE: 認可コード横取り攻撃対策のために~
OAuth サーバーとクライアントが実装すべきこと - Qiita~
https://qiita.com/TakahikoKawasaki/items/00f333c72ed96c4d...
-OAuth2.0で認可コードの漏洩を防ぐPKCE - 理系学生日記~
http://kiririmode.hatenablog.jp/entry/20170206/1486306800
--OAuth 2.0 and PKCE | Pedro Félix's shared memory~
https://blog.pedrofelix.org/2016/02/15/oauth-2-0-and-pkce/
-OAuth for Native Apps | GREE Engineers' Blog~
http://labs.gree.jp/blog/2015/12/14831/
--解決策1-2: OAuth PKCE 拡張を利用する
**仕様 [#g417e99c]
-RFC 7636 - Proof Key for Code Exchange by OAuth Public C...
https://tools.ietf.org/html/rfc7636
--OAuth 2.0 Threat Model and Security Considerations~
https://www.rfc-editor.org/rfc/rfc6819.txt
--Recommendations for Secure Use of~
Transport Layer Security (TLS)~
and Datagram Transport Layer Security (DTLS)~
https://www.rfc-editor.org/rfc/rfc7525.txt
**関連 [#xe006d83]
***[[OAuth PKCE利用時の構成図>UserAgentでOAuth2のTokenを...
***[[OAuth 2.0 for Native Apps]] [#fd72f8ea]
***[[OAuth 2.0 for Browser-Based Apps]] [#m5706070]
----
Tags: [[:IT国際標準]], [[:認証基盤]], [[:クレームベース認...
ページ名: