SlideShare a Scribd company logo
© Hitachi, Ltd. 2018. All rights reserved.
株式会社 日立製作所
2018/11/29
乗松 隆志
OAuth 2.0でHolder-of-Key Tokenを
実現する仕様について
1© Hitachi, Ltd. 2018. All rights reserved.
乗松 隆志(@tnorimat)
株式会社 日立製作所 OSSソリューションセンタ 所属
⚫ オープンソースソフトウェアへのコントリビューション活動
keycloak(https://www.keycloak.org/)
- Mutual TLS Certificate Bound Access Tokensによる、Holder-of-Key Tokenの実装
- RFC 7636 Proof Key for Code Exchange (PKCE)の実装
- 各種トークンに施す署名について、さまざまな署名アルゴリズムの対応
- 共通鍵を使用したJWS Client Assertionによるクライアント認証の実装
など。
自己紹介
© Hitachi, Ltd. 2018. All rights reserved.
1. Holder-of-Key Tokenについて
2. 実現仕様の比較
3. OAuth 2.0 Token Binding
Contents
2
3© Hitachi, Ltd. 2018. All rights reserved.
1. Holder-of-Key Tokenについて
4© Hitachi, Ltd. 2018. All rights reserved.
【トークン(ex. OAuth2.0のAccess Token、HTTPのCookie、etc…)の種別】
⚫ Bearer Token
誰でも行使できる
⇒ 第三者に漏れると悪用される可能性がある。
⚫ Holder-of-Key Token (他の言い方もある)
行使できる人が限られる
(というか、トークンの送信者がトークンを行使できる者かを、トークンの受信者が
検証できる)
⇒ 第三者に漏れても悪用できない。
(というか、悪用した場合、トークンの受信者がこれを検知できる)
【Holder-of-Key Token実現のためのアイディア】
⚫ Proof-of-Possession (所持証明:何を所持していることを証明するのか?)
⚫ Binding(バインディング:何と何を結びつけるのか?)
1-1 Bearer Token と Holder-of-Key Token
5© Hitachi, Ltd. 2018. All rights reserved.
1-2 Proof-of-Possession と Binding
公開鍵
秘密鍵
所持
証明
バイン
ディング
公開鍵
秘密鍵
所持
証明
バイン
ディング
検証
【トークン要求・発行時】 【トークン行使時】
[Proof-of-Possession(所持証明)]
所持証明の対象 :
公開鍵暗号アルゴリズムにおける秘密鍵
所持証明の方法 :
ディジタル署名
(秘密鍵による署名と、公開鍵による署名検証)
[Binding(バインディング)]
バインディングの対象:
- 公開鍵暗号アルゴリズムにおける公開鍵
- これに対応する派生情報(ex. ハッシュ値)
バインディングの方法:
- トークンの中に入れる
- トークンとバインドされている公開鍵の情報を返す
エンドポイントを用意
バインディングの検証方法:
トークンの行使者が所持証明時に提示してきた公開鍵の
情報と、トークンにバインディングされている公開鍵の
情報とが一致するかどうかを検査する。
所持証明とバインディング検証に成功したら…
リソースサーバーは、アクセストークンを送信してきた
クライアントが、認可サーバーからアクセストークンの発行を
受けたクライアントである、と結論づけられる。
認可サーバー リソースサーバー
クライアント
アクセストークン アクセストークン
クライアント
6© Hitachi, Ltd. 2018. All rights reserved.
2. 実現仕様の比較
7© Hitachi, Ltd. 2018. All rights reserved.
2-1 Mutual TLS Certificate Bound Access Tokens
秘密鍵
所持
証明
バイン
ディング
公開鍵
秘密鍵
バイン
ディング
検証
【トークン要求・発行時】 【トークン行使時】
認可サーバー リソースサーバー
クライアント
アクセストークン アクセストークン
クライアント
X.509証明書
公開鍵
X.509証明書
所持
証明
仕様:OAuth 2.0 Mutual TLS Client Authentication
and Certificate Bound Access Tokens
(draft-ietf-oauth-mtls-12)
★Internet Draftであるため、まだ今後変更が見込まれます。
Holder-of-Key対象のトークン:
アクセストークン
所持証明の対象:
クライアントのX.509証明書内の公開鍵に対応する秘密鍵
★自己署名でも良いことになっています。
ディジタル署名対象データ:
TLS Handshakeにおいて、クライアントとサーバーとの間で
交わされたメッセージのダイジェスト
⇒秘密鍵を知らなくても実施できる攻撃である、リプレイ攻撃に
対する耐性があります。
所持証明が行われるレイヤ:
TLSレイヤ
バインディングとその検証が行われるレイヤ:
アプリケーションレイヤ
バインディングの対象:
- クライアントのX.509証明書
- これに対応する派生情報(ex. ハッシュ値)
8© Hitachi, Ltd. 2018. All rights reserved.
2-2 Token Binding
仕様:OAuth 2.0 Token Binding
(draft-ietf-oauth-token-binding-08)
★Internet Draftであるため、まだ今後変更が見込まれます。
Holder-of-Key対象のトークン:
リフレッシュトークン、アクセストークン、認可コード
所持証明の対象:
Token Binding IDと呼ばれる公開鍵に対応する秘密鍵
★クライアントが、通信相手であるサーバー毎に異なる
鍵ペアを生成し使用できます。
ディジタル署名対象データ:
TLSレイヤでネゴシエーション済みのパラメータ
+TLSレイヤから取得するExported Keying Material(EKM)
⇒秘密鍵を知らなくても実施できる攻撃である、リプレイ
攻撃に対する耐性があります。
所持証明が行われるレイヤ:
アプリケーションレイヤ
バインディングとその検証が行われるレイヤ:
アプリケーションレイヤ
バインディングの対象:
- Token Binding ID(TBID)と呼ばれる公開鍵
- これに対応する派生情報(ex. ハッシュ値)
所持
証明
バイン
ディング
【トークン要求・発行時】 【トークン行使時】
認可サーバー リソースサーバー
クライアント
アクセストークン アクセストークン
クライアント
所持
証明
TBID:Provided
クライアント⇒
認可サーバー
秘密鍵
公開鍵
TBID:Referred
クライアント⇒
リソースサーバ
秘密鍵
公開鍵
TBID:Provided
クライアント⇒
リソースサーバ
秘密鍵
公開鍵
バイン
ディング
検証
9© Hitachi, Ltd. 2018. All rights reserved.
Token Bindingの方ができることが多い。
*クライアントは通信相手のサーバー毎に鍵ペアを持つことができる。
*トークンを払い出すサーバーに対し、そのサーバーに対する公開鍵ではない、
別の公開鍵をバインドすることができる。(ReferredタイプのTBID)
が、新しく実装が必要であるため広めるのも難しいと思われる。
* TLS:Token Bindingのネゴシエーション、EKMの提供
* Token Binding:プロトコルのメッセージ処理、所持証明とその検証
* OAuth 2.0:シグナリング、バインディングとその検証
Mutual TLS Certificate Bound Access Tokensの方は、既に広まった技術を使っており、
広めるのはToken Bindingより容易と考えるが、できることはToken Bindingより少ない。
2-3 比較
10© Hitachi, Ltd. 2018. All rights reserved.
3. OAuth 2.0 Token Binding
11© Hitachi, Ltd. 2018. All rights reserved.
3-1 Refresh Token
所持
証明
バイン
ディング
リフレッシュトークン
クライアント
所持
証明
TBID:Provided
クライアント⇒
認可サーバー
秘密鍵
公開鍵
TBID:Provided
クライアント⇒
認可サーバー
秘密鍵
公開鍵
バイン
ディング
検証
認可サーバー
リフレッシュトークン
リフレッシュトークン要求・発行: リフレッシュトークン行使: トークンの要求元=トークンの行使者
(=クライアント)
トークンの払出元=トークンの行使先
(=認可サーバー)
であることから、最もシンプルな構成になっている。
12© Hitachi, Ltd. 2018. All rights reserved.
3-2 Access Token
所持
証明
バイン
ディング
認可サーバー リソースサーバー
アクセストークン
所持
証明
TBID:Provided
クライアント⇒
認可サーバー
秘密鍵
公開鍵
TBID:Referred
クライアント⇒
リソースサーバ
秘密鍵
公開鍵
TBID:Provided
クライアント⇒
リソースサーバ
秘密鍵
公開鍵
バイン
ディング
検証
★アクセストークンのバインディングを実施するためのシグナリング(TB:Include-Referred-Token-Binding-ID)は省いています。
クライアント
アクセストークン
アクセストークン要求・発行: アクセストークン行使: トークンの要求元=トークンの行使者
(=クライアント)
トークンの払出元≠トークンの行使先
(認可サーバー≠リソースサーバー)
であることから、やや込み入った構成になっている。
*Token Bindingの、Referredという種類のTBIDを
使用する。
* Referredという種類のTBIDを使用するということ
を示すシグナリングが必要となる。
13© Hitachi, Ltd. 2018. All rights reserved.
3-3 Authorization Code for Native App Client
所持
証明
バイン
ディング
クライアント
PKCE:code_challenge
クライアント⇒
認可サーバー 公開鍵
TBID:Provided
クライアント⇒
認可サーバー
秘密鍵
公開鍵
バイン
ディング
検証
★認可コードのバインディングおよびバインディング検証をするためのシグナリング(PKCE:code_challenge_method, code_verifier)は省いています。
ブラウザ
認可コード
認可サーバー
認可コード
クライアント
認可コード
認可サーバー
認可コード要求・発行: 認可コード送信: 認可コード行使:
トークンの要求元(=クライアント)がトークンの払出元
(=認可サーバー)と直接TLSコネクションを張れないた
め、Token Bindingの仕組みでは所持証明とバインドがで
きない。
*バインディングは、RFC 7636 Proof Key for Code
Exchange(PKCE)を利用する。この際の所持証明につい
ては仕様では触れられていない。
*バインディング検証および所持証明は、Token Binding
の仕組みを利用する。
クライアントとブラウザが同じデバイスで動作している、
という前提らしく、ブラウザが、クライアントが保持する、
クライアント⇒認可サーバーの公開鍵にアクセスしこれ
を使用している。
14© Hitachi, Ltd. 2018. All rights reserved.
3-4 Authorization Code for Web Server Client
所持
証明
バイン
ディング
所持
証明
TBID:Provided
ブラウザ⇒
認可サーバ
秘密鍵
公開鍵
TBID:Referred
ブラウザ⇒
クライアント
秘密鍵
公開鍵
TBID:Provided
ブラウザ⇒
クライアント
秘密鍵
公開鍵
バイン
ディング
検証
PKCE:code_verifier
ブラウザ⇒
クライアント公開鍵
バイン
ディング
検証
★認可コードのバインディング検証をするためのシグナリング(PKCE:code_challenge_method, code_challenge)は省いています。
クライアント
認可コード
ブラウザ
認可サーバー認可サーバー
認可コード
クライアント
認可コード
認可コード要求・発行: 認可コード送信: 認可コード行使: トークンの要求元(=クライアント)がトークンの払出
元(=認可サーバー)と直接TLSコネクションを張れ
ないため、Token Bindingの仕組みでは所持証明と
バインドができない。
⇒
トークンの要求元をブラウザと考える。これにより、
認可サーバーとブラウザ、ブラウザとクライアントの
間では、Token Bindingの仕組みでことが足りる。
クライアントと認可サーバーの間は、他の仕組みを
必要とする。
*認可コードは、ブラウザの公開鍵とバインドされ
る。
*認可コード行使時のバインディング検証は、RFC
7636 Proof Key for Code Exchange(PKCE)を利用
する。この際の所持証明については仕様では触れ
られていない。
15© Hitachi, Ltd. 2018. All rights reserved.
3-5 Authorization Code Grant (Native App Client)
バイン
ディング
【認可コード要求・発行⇒送信時】
認可サーバ
認可コード
ブラウザ
クライアント
バイン
ディング
検証
【認可コード行使⇒トークン払出時】
バイン
ディング
アクセストークン
TBID:Provided
クライアント⇒
認可サーバー
秘密鍵
公開鍵
TBID:Referred
クライアント⇒
リソースサーバ
秘密鍵
公開鍵
バイン
ディング
リフレッシュトークン認可コード
クライアント
認可サーバ
認可コード
所持
証明
認可コード行使⇒トークン払出:認可コード送信:認可コード要求・発行:
★認可コードのバインディングを実施するためのシグナリング(PKCE:code_challenge_method, code_verifier)は省いています。
★アクセストークンのバインディングを実施するためのシグナリング(TB:Include-Referred-Token-Binding-ID)は省いています。
PKCE:code_challenge
クライアント⇒
認可サーバー 公開鍵
16© Hitachi, Ltd. 2018. All rights reserved.
3-6 Authorization Code Grant (Web Server Client)
所持
証明
バイン
ディング
【認可コード要求・発行⇒送信時】
認可サーバ
認可コード
所持
証明
TBID:Provided
ブラウザ⇒
認可サーバ
秘密鍵
公開鍵
TBID:Referred
ブラウザ⇒
クライアント
秘密鍵
公開鍵
TBID:Provided
ブラウザ⇒
クライアント
秘密鍵
公開鍵
バイン
ディング
検証
ブラウザ
クライアント
PKCE:code_verifier
ブラウザ⇒
クライアント公開鍵
バイン
ディング
検証
【認可コード行使⇒トークン払出時】
バイン
ディング
アクセストークン
TBID:Provided
クライアント⇒
認可サーバー
秘密鍵
公開鍵
TBID:Referred
クライアント⇒
リソースサーバ
秘密鍵
公開鍵
バイン
ディング
リフレッシュトークン認可コード
クライアント
認可サーバ
認可コード
所持
証明
認可コード行使⇒トークン払出:認可コード送信:認可コード要求・発行:
★認可コードのバインディングを実施するためのシグナリング(PKCE:code_ code_challenge_method, code_challenge)は省いています。
★アクセストークンのバインディングを実施するためのシグナリング(TB:Include-Referred-Token-Binding-ID)は省いています。
17© Hitachi, Ltd. 2018. All rights reserved.
3-7 Token Refresh
【リフレッシュトークン行使⇒トークン払出時】
バイン
ディング
TBID:Provided
クライアント⇒
認可サーバー
秘密鍵
公開鍵
TBID:Referred
クライアント⇒
リソースサーバ
秘密鍵
公開鍵
バイン
ディング
クライアント
認可サーバ
所持
証明
(旧)リフレッシュトークン (新)リフレッシュトークン (新)アクセストークン
★トークンリフレッシュで、リフレッシュトークンもリフレッシュされるケースを想定しています。
★アクセストークンのバインディングを実施するためのシグナリング(TB:Include-Referred-Token-Binding-ID)は省いています。
バイン
ディング
検証
リフレッシュトークン行使⇒トークン払出:
18© Hitachi, Ltd. 2018. All rights reserved.
⚫ Authorization Code Grantでの認可コードのToken Binding
- トークンの要求元と払出元が直接TLSコネクションで通信できないケースの一つ
- PKCEを本来の用途ではない用途で使うため、本来の用途で使えない
- PKCEを使ってバインディング・バインディング検証するとき、公開鍵に対応する
秘密鍵の所持証明をしていない(できない)気がする
- Web Server Clientの場合、認可コードを、ブラウザの公開鍵とバインドしている
- Token Bindingせずとも、PKCEでよい気もする
3-8 さいごに(気になる点)
19© Hitachi, Ltd. 2018. All rights reserved.
⚫ HITACHIは、株式会社 日立製作所の商標または登録商標です。
⚫ その他記載の会社名、製品名などは、それぞれの会社の商標もしくは登録商標です
他社所有商標に関する表示
© Hitachi, Ltd. 2018. All rights reserved.
株式会社 日立製作所
OAuth 2.0でHolder-of-Key Tokenを
実現する仕様について
2018/11/29
乗松 隆志
END
20
OAuthのHolder of Key Token

More Related Content

What's hot (20)

PDF
初心者向けWebinar AWSで開発環境を構築しよう
Amazon Web Services Japan
 
PDF
AWS EC2 Eメール制限解除 - 逆引き(rDNS)設定 申請手順
Amazon Web Services Japan
 
PPTX
20211109 bleaの使い方(基本編)
Amazon Web Services Japan
 
PDF
AWSからのメール送信
Amazon Web Services Japan
 
PDF
OpenID ConnectとAndroidアプリのログインサイクル
Masaru Kurahayashi
 
PDF
FIDO認証によるパスワードレスログイン実装入門
Yahoo!デベロッパーネットワーク
 
PDF
[AKIBA.AWS] VGWのルーティング仕様
Shuji Kikuchi
 
PDF
これからのネイティブアプリにおけるOpenID Connectの活用
Masaru Kurahayashi
 
PPTX
Keycloakのステップアップ認証について
Hitachi, Ltd. OSS Solution Center.
 
PPTX
適切な Azure AD 認証方式の選択の決め手
Yusuke Kodama
 
PDF
OAuth / OpenID Connectを中心とするAPIセキュリティについて #yuzawaws
Tatsuo Kudo
 
PPTX
Keycloakの実際・翻訳プロジェクト紹介
Hiroyuki Wada
 
PDF
AWS BlackBelt AWS上でのDDoS対策
Amazon Web Services Japan
 
PDF
20200722 AWS Black Belt Online Seminar AWSアカウント シングルサインオンの設計と運用
Amazon Web Services Japan
 
PPTX
KeycloakでAPI認可に入門する
Hitachi, Ltd. OSS Solution Center.
 
PDF
OpenID Connect 入門 〜コンシューマーにおけるID連携のトレンド〜
Masaru Kurahayashi
 
PDF
マイクロサービス化デザインパターン - #AWSDevDay Tokyo 2018
Yusuke Suzuki
 
PPTX
Keycloak入門
Hiroyuki Wada
 
PDF
いまどきの OAuth / OpenID Connect (OIDC) 一挙おさらい (2020 年 2 月) #authlete
Tatsuo Kudo
 
PPTX
NGINXをBFF (Backend for Frontend)として利用した話
Hitachi, Ltd. OSS Solution Center.
 
初心者向けWebinar AWSで開発環境を構築しよう
Amazon Web Services Japan
 
AWS EC2 Eメール制限解除 - 逆引き(rDNS)設定 申請手順
Amazon Web Services Japan
 
20211109 bleaの使い方(基本編)
Amazon Web Services Japan
 
AWSからのメール送信
Amazon Web Services Japan
 
OpenID ConnectとAndroidアプリのログインサイクル
Masaru Kurahayashi
 
FIDO認証によるパスワードレスログイン実装入門
Yahoo!デベロッパーネットワーク
 
[AKIBA.AWS] VGWのルーティング仕様
Shuji Kikuchi
 
これからのネイティブアプリにおけるOpenID Connectの活用
Masaru Kurahayashi
 
Keycloakのステップアップ認証について
Hitachi, Ltd. OSS Solution Center.
 
適切な Azure AD 認証方式の選択の決め手
Yusuke Kodama
 
OAuth / OpenID Connectを中心とするAPIセキュリティについて #yuzawaws
Tatsuo Kudo
 
Keycloakの実際・翻訳プロジェクト紹介
Hiroyuki Wada
 
AWS BlackBelt AWS上でのDDoS対策
Amazon Web Services Japan
 
20200722 AWS Black Belt Online Seminar AWSアカウント シングルサインオンの設計と運用
Amazon Web Services Japan
 
KeycloakでAPI認可に入門する
Hitachi, Ltd. OSS Solution Center.
 
OpenID Connect 入門 〜コンシューマーにおけるID連携のトレンド〜
Masaru Kurahayashi
 
マイクロサービス化デザインパターン - #AWSDevDay Tokyo 2018
Yusuke Suzuki
 
Keycloak入門
Hiroyuki Wada
 
いまどきの OAuth / OpenID Connect (OIDC) 一挙おさらい (2020 年 2 月) #authlete
Tatsuo Kudo
 
NGINXをBFF (Backend for Frontend)として利用した話
Hitachi, Ltd. OSS Solution Center.
 

Similar to OAuthのHolder of Key Token (20)

PDF
FAPI and Beyond: From an specification author's point of view #fapisum - Japa...
FinTechLabs.io
 
PDF
IETF102 Report Authorization
Kaoru Maeda
 
PDF
エンタープライズブロックチェーン構築の基礎
LFDT Tokyo Meetup
 
PPTX
FAPI and beyond - よりよいセキュリティのために
Nat Sakimura
 
PDF
#mailerstudy 02 メールと暗号 - SSL/TLS -
Takashi Takizawa
 
PDF
Authentication and Authorization of The Latest Keycloak
Hitachi, Ltd. OSS Solution Center.
 
PDF
IETF96 Update oauth tokbind
Kaoru Maeda
 
PDF
Tokbind-fido
Kaoru Maeda
 
PDF
Hyperledger Fabric公式サンプル fabric-samples徹底解説
LFDT Tokyo Meetup
 
PPTX
Domino v12の新機能 - 多要素認証対応 (TOTP) -
Haruyuki Nakano
 
PDF
Cld014 セキュアな io_t_システ
Tech Summit 2016
 
PPTX
Cld014 セキュアな io_t_システ
Tech Summit 2016
 
PPT
Xml Security
Satoshi Hada
 
PDF
Hyperledger Fabric 1.0 概要
LFDT Tokyo Meetup
 
PDF
WebSocket Protocol と Plack::Middleware::WebSocket
Yu Nobuoka
 
PDF
Magic Leap で WebRTC 触ってみた
NishoMatsusita
 
PDF
Gaeja20121130
Shinichiro Takezaki
 
PDF
Keycloakの動向
Yuichi Nakamura
 
PPTX
JJUG CCC.pptx
Kanta Sasaki
 
PDF
プロフェッショナルSSL/TLS 1.2章
MITSUNARI Shigeo
 
FAPI and Beyond: From an specification author's point of view #fapisum - Japa...
FinTechLabs.io
 
IETF102 Report Authorization
Kaoru Maeda
 
エンタープライズブロックチェーン構築の基礎
LFDT Tokyo Meetup
 
FAPI and beyond - よりよいセキュリティのために
Nat Sakimura
 
#mailerstudy 02 メールと暗号 - SSL/TLS -
Takashi Takizawa
 
Authentication and Authorization of The Latest Keycloak
Hitachi, Ltd. OSS Solution Center.
 
IETF96 Update oauth tokbind
Kaoru Maeda
 
Tokbind-fido
Kaoru Maeda
 
Hyperledger Fabric公式サンプル fabric-samples徹底解説
LFDT Tokyo Meetup
 
Domino v12の新機能 - 多要素認証対応 (TOTP) -
Haruyuki Nakano
 
Cld014 セキュアな io_t_システ
Tech Summit 2016
 
Cld014 セキュアな io_t_システ
Tech Summit 2016
 
Xml Security
Satoshi Hada
 
Hyperledger Fabric 1.0 概要
LFDT Tokyo Meetup
 
WebSocket Protocol と Plack::Middleware::WebSocket
Yu Nobuoka
 
Magic Leap で WebRTC 触ってみた
NishoMatsusita
 
Gaeja20121130
Shinichiro Takezaki
 
Keycloakの動向
Yuichi Nakamura
 
JJUG CCC.pptx
Kanta Sasaki
 
プロフェッショナルSSL/TLS 1.2章
MITSUNARI Shigeo
 
Ad

More from Yuichi Nakamura (9)

PDF
Implementing WebAuthn & FAPI supports on Keycloak
Yuichi Nakamura
 
PPTX
Keycloakの紹介と最新開発動向
Yuichi Nakamura
 
PPTX
About secure oss_sig_20190607
Yuichi Nakamura
 
PDF
Implementing security requirements for banking API system using Open Source ...
Yuichi Nakamura
 
PDF
OSSセキュリティ技術の会について
Yuichi Nakamura
 
PDF
Open shiftmeetup 3scalelt_3
Yuichi Nakamura
 
PDF
Keycloak開発入門
Yuichi Nakamura
 
PPTX
Keycloak入門-OpenID ConnectによるAPIセキュリティ
Yuichi Nakamura
 
PPTX
OSSセキュリティ技術の会について
Yuichi Nakamura
 
Implementing WebAuthn & FAPI supports on Keycloak
Yuichi Nakamura
 
Keycloakの紹介と最新開発動向
Yuichi Nakamura
 
About secure oss_sig_20190607
Yuichi Nakamura
 
Implementing security requirements for banking API system using Open Source ...
Yuichi Nakamura
 
OSSセキュリティ技術の会について
Yuichi Nakamura
 
Open shiftmeetup 3scalelt_3
Yuichi Nakamura
 
Keycloak開発入門
Yuichi Nakamura
 
Keycloak入門-OpenID ConnectによるAPIセキュリティ
Yuichi Nakamura
 
OSSセキュリティ技術の会について
Yuichi Nakamura
 
Ad

OAuthのHolder of Key Token

  • 1. © Hitachi, Ltd. 2018. All rights reserved. 株式会社 日立製作所 2018/11/29 乗松 隆志 OAuth 2.0でHolder-of-Key Tokenを 実現する仕様について
  • 2. 1© Hitachi, Ltd. 2018. All rights reserved. 乗松 隆志(@tnorimat) 株式会社 日立製作所 OSSソリューションセンタ 所属 ⚫ オープンソースソフトウェアへのコントリビューション活動 keycloak(https://www.keycloak.org/) - Mutual TLS Certificate Bound Access Tokensによる、Holder-of-Key Tokenの実装 - RFC 7636 Proof Key for Code Exchange (PKCE)の実装 - 各種トークンに施す署名について、さまざまな署名アルゴリズムの対応 - 共通鍵を使用したJWS Client Assertionによるクライアント認証の実装 など。 自己紹介
  • 3. © Hitachi, Ltd. 2018. All rights reserved. 1. Holder-of-Key Tokenについて 2. 実現仕様の比較 3. OAuth 2.0 Token Binding Contents 2
  • 4. 3© Hitachi, Ltd. 2018. All rights reserved. 1. Holder-of-Key Tokenについて
  • 5. 4© Hitachi, Ltd. 2018. All rights reserved. 【トークン(ex. OAuth2.0のAccess Token、HTTPのCookie、etc…)の種別】 ⚫ Bearer Token 誰でも行使できる ⇒ 第三者に漏れると悪用される可能性がある。 ⚫ Holder-of-Key Token (他の言い方もある) 行使できる人が限られる (というか、トークンの送信者がトークンを行使できる者かを、トークンの受信者が 検証できる) ⇒ 第三者に漏れても悪用できない。 (というか、悪用した場合、トークンの受信者がこれを検知できる) 【Holder-of-Key Token実現のためのアイディア】 ⚫ Proof-of-Possession (所持証明:何を所持していることを証明するのか?) ⚫ Binding(バインディング:何と何を結びつけるのか?) 1-1 Bearer Token と Holder-of-Key Token
  • 6. 5© Hitachi, Ltd. 2018. All rights reserved. 1-2 Proof-of-Possession と Binding 公開鍵 秘密鍵 所持 証明 バイン ディング 公開鍵 秘密鍵 所持 証明 バイン ディング 検証 【トークン要求・発行時】 【トークン行使時】 [Proof-of-Possession(所持証明)] 所持証明の対象 : 公開鍵暗号アルゴリズムにおける秘密鍵 所持証明の方法 : ディジタル署名 (秘密鍵による署名と、公開鍵による署名検証) [Binding(バインディング)] バインディングの対象: - 公開鍵暗号アルゴリズムにおける公開鍵 - これに対応する派生情報(ex. ハッシュ値) バインディングの方法: - トークンの中に入れる - トークンとバインドされている公開鍵の情報を返す エンドポイントを用意 バインディングの検証方法: トークンの行使者が所持証明時に提示してきた公開鍵の 情報と、トークンにバインディングされている公開鍵の 情報とが一致するかどうかを検査する。 所持証明とバインディング検証に成功したら… リソースサーバーは、アクセストークンを送信してきた クライアントが、認可サーバーからアクセストークンの発行を 受けたクライアントである、と結論づけられる。 認可サーバー リソースサーバー クライアント アクセストークン アクセストークン クライアント
  • 7. 6© Hitachi, Ltd. 2018. All rights reserved. 2. 実現仕様の比較
  • 8. 7© Hitachi, Ltd. 2018. All rights reserved. 2-1 Mutual TLS Certificate Bound Access Tokens 秘密鍵 所持 証明 バイン ディング 公開鍵 秘密鍵 バイン ディング 検証 【トークン要求・発行時】 【トークン行使時】 認可サーバー リソースサーバー クライアント アクセストークン アクセストークン クライアント X.509証明書 公開鍵 X.509証明書 所持 証明 仕様:OAuth 2.0 Mutual TLS Client Authentication and Certificate Bound Access Tokens (draft-ietf-oauth-mtls-12) ★Internet Draftであるため、まだ今後変更が見込まれます。 Holder-of-Key対象のトークン: アクセストークン 所持証明の対象: クライアントのX.509証明書内の公開鍵に対応する秘密鍵 ★自己署名でも良いことになっています。 ディジタル署名対象データ: TLS Handshakeにおいて、クライアントとサーバーとの間で 交わされたメッセージのダイジェスト ⇒秘密鍵を知らなくても実施できる攻撃である、リプレイ攻撃に 対する耐性があります。 所持証明が行われるレイヤ: TLSレイヤ バインディングとその検証が行われるレイヤ: アプリケーションレイヤ バインディングの対象: - クライアントのX.509証明書 - これに対応する派生情報(ex. ハッシュ値)
  • 9. 8© Hitachi, Ltd. 2018. All rights reserved. 2-2 Token Binding 仕様:OAuth 2.0 Token Binding (draft-ietf-oauth-token-binding-08) ★Internet Draftであるため、まだ今後変更が見込まれます。 Holder-of-Key対象のトークン: リフレッシュトークン、アクセストークン、認可コード 所持証明の対象: Token Binding IDと呼ばれる公開鍵に対応する秘密鍵 ★クライアントが、通信相手であるサーバー毎に異なる 鍵ペアを生成し使用できます。 ディジタル署名対象データ: TLSレイヤでネゴシエーション済みのパラメータ +TLSレイヤから取得するExported Keying Material(EKM) ⇒秘密鍵を知らなくても実施できる攻撃である、リプレイ 攻撃に対する耐性があります。 所持証明が行われるレイヤ: アプリケーションレイヤ バインディングとその検証が行われるレイヤ: アプリケーションレイヤ バインディングの対象: - Token Binding ID(TBID)と呼ばれる公開鍵 - これに対応する派生情報(ex. ハッシュ値) 所持 証明 バイン ディング 【トークン要求・発行時】 【トークン行使時】 認可サーバー リソースサーバー クライアント アクセストークン アクセストークン クライアント 所持 証明 TBID:Provided クライアント⇒ 認可サーバー 秘密鍵 公開鍵 TBID:Referred クライアント⇒ リソースサーバ 秘密鍵 公開鍵 TBID:Provided クライアント⇒ リソースサーバ 秘密鍵 公開鍵 バイン ディング 検証
  • 10. 9© Hitachi, Ltd. 2018. All rights reserved. Token Bindingの方ができることが多い。 *クライアントは通信相手のサーバー毎に鍵ペアを持つことができる。 *トークンを払い出すサーバーに対し、そのサーバーに対する公開鍵ではない、 別の公開鍵をバインドすることができる。(ReferredタイプのTBID) が、新しく実装が必要であるため広めるのも難しいと思われる。 * TLS:Token Bindingのネゴシエーション、EKMの提供 * Token Binding:プロトコルのメッセージ処理、所持証明とその検証 * OAuth 2.0:シグナリング、バインディングとその検証 Mutual TLS Certificate Bound Access Tokensの方は、既に広まった技術を使っており、 広めるのはToken Bindingより容易と考えるが、できることはToken Bindingより少ない。 2-3 比較
  • 11. 10© Hitachi, Ltd. 2018. All rights reserved. 3. OAuth 2.0 Token Binding
  • 12. 11© Hitachi, Ltd. 2018. All rights reserved. 3-1 Refresh Token 所持 証明 バイン ディング リフレッシュトークン クライアント 所持 証明 TBID:Provided クライアント⇒ 認可サーバー 秘密鍵 公開鍵 TBID:Provided クライアント⇒ 認可サーバー 秘密鍵 公開鍵 バイン ディング 検証 認可サーバー リフレッシュトークン リフレッシュトークン要求・発行: リフレッシュトークン行使: トークンの要求元=トークンの行使者 (=クライアント) トークンの払出元=トークンの行使先 (=認可サーバー) であることから、最もシンプルな構成になっている。
  • 13. 12© Hitachi, Ltd. 2018. All rights reserved. 3-2 Access Token 所持 証明 バイン ディング 認可サーバー リソースサーバー アクセストークン 所持 証明 TBID:Provided クライアント⇒ 認可サーバー 秘密鍵 公開鍵 TBID:Referred クライアント⇒ リソースサーバ 秘密鍵 公開鍵 TBID:Provided クライアント⇒ リソースサーバ 秘密鍵 公開鍵 バイン ディング 検証 ★アクセストークンのバインディングを実施するためのシグナリング(TB:Include-Referred-Token-Binding-ID)は省いています。 クライアント アクセストークン アクセストークン要求・発行: アクセストークン行使: トークンの要求元=トークンの行使者 (=クライアント) トークンの払出元≠トークンの行使先 (認可サーバー≠リソースサーバー) であることから、やや込み入った構成になっている。 *Token Bindingの、Referredという種類のTBIDを 使用する。 * Referredという種類のTBIDを使用するということ を示すシグナリングが必要となる。
  • 14. 13© Hitachi, Ltd. 2018. All rights reserved. 3-3 Authorization Code for Native App Client 所持 証明 バイン ディング クライアント PKCE:code_challenge クライアント⇒ 認可サーバー 公開鍵 TBID:Provided クライアント⇒ 認可サーバー 秘密鍵 公開鍵 バイン ディング 検証 ★認可コードのバインディングおよびバインディング検証をするためのシグナリング(PKCE:code_challenge_method, code_verifier)は省いています。 ブラウザ 認可コード 認可サーバー 認可コード クライアント 認可コード 認可サーバー 認可コード要求・発行: 認可コード送信: 認可コード行使: トークンの要求元(=クライアント)がトークンの払出元 (=認可サーバー)と直接TLSコネクションを張れないた め、Token Bindingの仕組みでは所持証明とバインドがで きない。 *バインディングは、RFC 7636 Proof Key for Code Exchange(PKCE)を利用する。この際の所持証明につい ては仕様では触れられていない。 *バインディング検証および所持証明は、Token Binding の仕組みを利用する。 クライアントとブラウザが同じデバイスで動作している、 という前提らしく、ブラウザが、クライアントが保持する、 クライアント⇒認可サーバーの公開鍵にアクセスしこれ を使用している。
  • 15. 14© Hitachi, Ltd. 2018. All rights reserved. 3-4 Authorization Code for Web Server Client 所持 証明 バイン ディング 所持 証明 TBID:Provided ブラウザ⇒ 認可サーバ 秘密鍵 公開鍵 TBID:Referred ブラウザ⇒ クライアント 秘密鍵 公開鍵 TBID:Provided ブラウザ⇒ クライアント 秘密鍵 公開鍵 バイン ディング 検証 PKCE:code_verifier ブラウザ⇒ クライアント公開鍵 バイン ディング 検証 ★認可コードのバインディング検証をするためのシグナリング(PKCE:code_challenge_method, code_challenge)は省いています。 クライアント 認可コード ブラウザ 認可サーバー認可サーバー 認可コード クライアント 認可コード 認可コード要求・発行: 認可コード送信: 認可コード行使: トークンの要求元(=クライアント)がトークンの払出 元(=認可サーバー)と直接TLSコネクションを張れ ないため、Token Bindingの仕組みでは所持証明と バインドができない。 ⇒ トークンの要求元をブラウザと考える。これにより、 認可サーバーとブラウザ、ブラウザとクライアントの 間では、Token Bindingの仕組みでことが足りる。 クライアントと認可サーバーの間は、他の仕組みを 必要とする。 *認可コードは、ブラウザの公開鍵とバインドされ る。 *認可コード行使時のバインディング検証は、RFC 7636 Proof Key for Code Exchange(PKCE)を利用 する。この際の所持証明については仕様では触れ られていない。
  • 16. 15© Hitachi, Ltd. 2018. All rights reserved. 3-5 Authorization Code Grant (Native App Client) バイン ディング 【認可コード要求・発行⇒送信時】 認可サーバ 認可コード ブラウザ クライアント バイン ディング 検証 【認可コード行使⇒トークン払出時】 バイン ディング アクセストークン TBID:Provided クライアント⇒ 認可サーバー 秘密鍵 公開鍵 TBID:Referred クライアント⇒ リソースサーバ 秘密鍵 公開鍵 バイン ディング リフレッシュトークン認可コード クライアント 認可サーバ 認可コード 所持 証明 認可コード行使⇒トークン払出:認可コード送信:認可コード要求・発行: ★認可コードのバインディングを実施するためのシグナリング(PKCE:code_challenge_method, code_verifier)は省いています。 ★アクセストークンのバインディングを実施するためのシグナリング(TB:Include-Referred-Token-Binding-ID)は省いています。 PKCE:code_challenge クライアント⇒ 認可サーバー 公開鍵
  • 17. 16© Hitachi, Ltd. 2018. All rights reserved. 3-6 Authorization Code Grant (Web Server Client) 所持 証明 バイン ディング 【認可コード要求・発行⇒送信時】 認可サーバ 認可コード 所持 証明 TBID:Provided ブラウザ⇒ 認可サーバ 秘密鍵 公開鍵 TBID:Referred ブラウザ⇒ クライアント 秘密鍵 公開鍵 TBID:Provided ブラウザ⇒ クライアント 秘密鍵 公開鍵 バイン ディング 検証 ブラウザ クライアント PKCE:code_verifier ブラウザ⇒ クライアント公開鍵 バイン ディング 検証 【認可コード行使⇒トークン払出時】 バイン ディング アクセストークン TBID:Provided クライアント⇒ 認可サーバー 秘密鍵 公開鍵 TBID:Referred クライアント⇒ リソースサーバ 秘密鍵 公開鍵 バイン ディング リフレッシュトークン認可コード クライアント 認可サーバ 認可コード 所持 証明 認可コード行使⇒トークン払出:認可コード送信:認可コード要求・発行: ★認可コードのバインディングを実施するためのシグナリング(PKCE:code_ code_challenge_method, code_challenge)は省いています。 ★アクセストークンのバインディングを実施するためのシグナリング(TB:Include-Referred-Token-Binding-ID)は省いています。
  • 18. 17© Hitachi, Ltd. 2018. All rights reserved. 3-7 Token Refresh 【リフレッシュトークン行使⇒トークン払出時】 バイン ディング TBID:Provided クライアント⇒ 認可サーバー 秘密鍵 公開鍵 TBID:Referred クライアント⇒ リソースサーバ 秘密鍵 公開鍵 バイン ディング クライアント 認可サーバ 所持 証明 (旧)リフレッシュトークン (新)リフレッシュトークン (新)アクセストークン ★トークンリフレッシュで、リフレッシュトークンもリフレッシュされるケースを想定しています。 ★アクセストークンのバインディングを実施するためのシグナリング(TB:Include-Referred-Token-Binding-ID)は省いています。 バイン ディング 検証 リフレッシュトークン行使⇒トークン払出:
  • 19. 18© Hitachi, Ltd. 2018. All rights reserved. ⚫ Authorization Code Grantでの認可コードのToken Binding - トークンの要求元と払出元が直接TLSコネクションで通信できないケースの一つ - PKCEを本来の用途ではない用途で使うため、本来の用途で使えない - PKCEを使ってバインディング・バインディング検証するとき、公開鍵に対応する 秘密鍵の所持証明をしていない(できない)気がする - Web Server Clientの場合、認可コードを、ブラウザの公開鍵とバインドしている - Token Bindingせずとも、PKCEでよい気もする 3-8 さいごに(気になる点)
  • 20. 19© Hitachi, Ltd. 2018. All rights reserved. ⚫ HITACHIは、株式会社 日立製作所の商標または登録商標です。 ⚫ その他記載の会社名、製品名などは、それぞれの会社の商標もしくは登録商標です 他社所有商標に関する表示
  • 21. © Hitachi, Ltd. 2018. All rights reserved. 株式会社 日立製作所 OAuth 2.0でHolder-of-Key Tokenを 実現する仕様について 2018/11/29 乗松 隆志 END 20