「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。

-[[戻る>Financial API (FAPI)]]
* 目次 [#zce5c6fe]
#contents

*概要 [#mec56743]
-[[Financial API (FAPI)]]の「Read and Write API用セキュリティ・プロファイル」
-金融データへのトランザクション・アクセスに適した[[OAuth]]プロファイル
--OpenID Connect(OIDC)を使用して顧客(ユーザ)を識別
--トークンを使用して、エンドポイントから保護データを読取
--エンドポイントは、JSONデータを提供するREST API

※ ドラフト 4 を参考にして作成。その後、ドラフト 6 を再度完読して加筆・修正。

*要約 [#sab53ee8]
-送信者・受信者・メッセージ認証を強化

-以下の攻撃に対するコントロールを規定
--認可要求の改ざん
--コードインジェクション
--状態インジェクション
--トークン要求フィッシング
--認可応答の改ざん

**フロー [#y974f9a7]
このプロファイルを簡単に説明すると、以下のようになる。

***response_type [#s32102a0]
***[[response_type>OAuth 2.0 Multiple Response Type Encoding Practices]] [#s32102a0]
-code id_token
--[[Confidentialクライアント>#b1fc3c02]]
--Nativeの[[Publicクライアント>#e482f66f]]の場合、S256の[[OAuth PKCE]]

-code id_token token~
SPA系の[[Publicクライアント>#e482f66f]]の場合
--8.3.3. Identity provider (IdP) mix-up attackの可能性がある。
--故に、Implicit Flow より [[Hybrid Flow>OpenID Connect#l565139a]]

***[[response_mode>OAuth 2.0 Form Post Response Mode]] [#e6694cf0]
-[[JARM>#j3ade667]]であればHybrid Flowでなくてもいい。
-このため、ネイティブ系の[[Publicクライアント>#e482f66f]]もサポート可能

***request or request_uri [#h3bfbf17]
-パラメタを要求。
-[[Requestオブジェクト>#ha94c6d8]]

**[[IDトークン>OpenID Connect#ofb73c59]] [#g7df69b2]

***[[JWT]]形式 [#r36d5748]
-[[JWS]]署名
--ES256(ECDSA using P-256 and SHA-256, Recommended+)
--PS256(RSASSA-PSS using SHA-256 and MGF1 with SHA-256, Optional)

-[[JWE]]暗号化~
アルゴリズムの指定は無し。

***追加クレーム [#c33d2245]
-[[acrとamr>OpenID Connect - IDトークン#l52144f8]]
-[[at_hashとc_hash>OpenID Connect - IDトークン#c007540d]]
-更に、[[切り離された署名のためのs_hash>#i246cd31]]。

***切り離された署名 [#i246cd31]
-認可レスポンスが改ざんされていないことを検証。

-s_hash~
クライアントは、
--[[at_hashとc_hash>OpenID Connect - IDトークン#c007540d]]に加え、
--s_hash

>の値を検証する。

--値
---state 値のASCII表現のオクテットのハッシュの左端の半分をbase64urlエンコーディング
---ハッシュはIDトークンのJOSEヘッダのalgパラメタで使用されるアルゴリズム。

--例:algがHS512の場合
---state値をASCIIエンコードし、
---SHA-512でハッシュ化し、
---左端の256ビットを切り出し、
---base64urlエンコードする。

-この代替に「[[JARM>#j3ade667]]」と言う仕様もある。

**通信 [#ob9374f1]

***SSL/TLS [#l35b4184]
-TLSバージョン1.2以降
-TLSサーバ証明書チェック
-暗号スイート
--TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
--TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
--TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
--TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384

***redirect_uri [#r65c6593]
(完全一致)

**認証 [#k8da384f]

***ユーザ [#l0c98773]
[[LoA 3>LoA(Level of Assurance)#kdf5a643]]
-特定される⾝元識別情報の信⽤度が「相当程度ある」。
-パスワードだけではなく、2要素以上を用いてユーザー認証をする。

***クライアント認証 [#vdf3136c]

-認可エンドポイント~
[[Requestオブジェクト>#ha94c6d8]]

-Tokenエンドポイント(以下の何れかが必要)
--[[JWT Client Assertion>OpenID Connect#y7bdab62]](private_key_jwt)
--「[[MTLS>#yc3529a9]]」(「[[OAUTB>#b8a7bd37]]」の場合は?以下のように書かれているため、「[[MTLS>#yc3529a9]]」を使用するのかも。
>FAPIクライアントが「[[MTLS>#yc3529a9]]」または「[[OAUTB>#b8a7bd37]]」を使用する場合、認証コードはTLSチャネルにバインドされます。

**トークン種類 [#x210d002]
[[記名式トークン(Proof-of-possession Token)>トークン#b38de47f]]

***対象 [#aa43405a]
-code
-token
--access_token
--refresh_token

***紐付け(トークン・バインディング) [#i309b755]
紐付け(トークン・バインディング)のために以下の何れかをサポートする必要がある。~
(記名は、Resource Owner単位ではなくてClient単位)
-[[MTLS>#yc3529a9]]
-[[OAUTB>#b8a7bd37]]

*役割 [#a2170501]

**Authorization Server [#zf702573]
先ずは、「[[FAPI Part 1 (Read Only API Security Profile)>FAPI Part 1 (Read Only API Security Profile)#abd50397]]」に準拠。

***認証・認可 [#u62c1062]
-[[LoA 3>LoA(Level of Assurance)#kdf5a643]]

***[[クライアント認証>#vdf3136c]] [#tf6a9f9c]

***redirect_uri [#fabee59b]
-事前登録が必要
-認可リクエストに必須
-完全一致が必要

***code, token [#mbd264d4]
-[[記名式トークン>#x210d002]]
--code
--token
---access_token
---refresh_token

-[[IDトークン>#g7df69b2]]

**Client [#ide28df2]
先ずは、「[[FAPI Part 1 (Read Only API Security Profile)>FAPI Part 1 (Read Only API Security Profile)#abd50397]]」に準拠。

-[[Confidentialクライアント>#b1fc3c02]]をサポートする。
-また、[[Publicクライアント>#e482f66f]]をサポートすべき。

***共通 [#g0db887f]
-[[Requestオブジェクト>#ha94c6d8]]

-[[切り離された署名のためのs_hash>#i246cd31]]

-紐付け(トークン・バインディング)のために以下の何れかをサポートする必要がある。
--[[MTLS>#yc3529a9]]
--[[OAUTB>#b8a7bd37]]

***Confidentialクライアント [#b1fc3c02]
-[[クライアント認証>#vdf3136c]]が必要。
--[[Authorization Code>OAuth#yfeb403d]]を使用して、
--+Tokenエンドポイントに[[クライアント認証>#vdf3136c]]
---[[JWT Client Assertion>OpenID Connect#y7bdab62]](private_key_jwt)
---[[MTLS>#yc3529a9]]

-[[JWS]] & [[JWE]]の[[IDトークン>#g7df69b2]]の要求が必要%%推奨される%%。

***Publicクライアント [#e482f66f]
-[[クライアント認証>#vdf3136c]]は不要。

-この代替として、
--SPA系は、Hybrid Flowをサポート
--Nativeは、S256の[[OAuth PKCE]]をサポート
---「ハッシュ関数」には、「S256」を使用する。
---「[[アプリケーション間通信>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E9%96%93%E9%80%9A%E4%BF%A1]]」には、「Claimed Https Scheme URI Redirection」を使用する。

-[[Requestオブジェクト>#ha94c6d8]]

-[[acrクレーム>OpenID Connect#ja81c8fa]]で[[LoA 3>LoA(Level of Assurance)#kdf5a643]]以上での認証を要求し、[[acrとamr>OpenID Connect - IDトークン#l52144f8]]を検証する。

-各カギは、
--SPA系は、クライアント端末ごとになる。
--Nativeは、インストール(インスタンス)毎になる。

**Resource Server [#fbfccde7]
先ずは、「[[FAPI Part 1 (Read Only API Security Profile)>FAPI Part 1 (Read Only API Security Profile)#abd50397]]」に準拠。

***[[記名式トークン>#x210d002]] [#c582f76f]
-[[MTLS>#yc3529a9]]
-[[OAUTB>#b8a7bd37]]

*[[Requestオブジェクト>JWT Secured Authorization Request (JAR)]] [#ha94c6d8]
-[[Publicクライアント>#e482f66f]]の場合、必須。
[[Publicクライアント>#e482f66f]]ダケと思っていたが、[[Confidentialクライアント>#b1fc3c02]]でも必要である模様。

-F-API2では、request_uriを[[Clientではなく、Authorization Serverがホストする。>JWT Secured Authorization Request (JAR)#s5ba22a4]]

--これにより、Clientが指定したrequest_uriへの要求をサポートする必要が無い。
--[[Requestオブジェクト>JWT Secured Authorization Request (JAR)]]の機密性のためにURIのエントロピーに依存しない。
--request_uriは、以下の何れか。
--request_uri形式は、以下の何れかだが、URNになるのが既定と考える。
---URL
---URN([[Requestオブジェクト>JWT Secured Authorization Request (JAR)]]がAuthorization Serverに保管される場合)
--なお、[[Requestオブジェクト>JWT Secured Authorization Request (JAR)]]には、すべてのパラメタを同梱する(※ expクレームを含める必要がある)。
--OAuth2の認可リクエスト仕様で要求されている場合は、一致した重複を更に送信しても良い。
---URN ([[Requestオブジェクト>JWT Secured Authorization Request (JAR)]]がAuthorization Serverに保管される場合)
--パラメタ
---[[Requestオブジェクト>JWT Secured Authorization Request (JAR)]]には、すべてのパラメタを同梱する(※ expクレームを含める必要がある)。
---仕様で要求されている場合、一致した重複を更に送信しても良い。

**[[Request>JWT Secured Authorization Request (JAR)#od26debf]] [#e104c14f]
**登録 [#t71592fd]

***[[Request>JWT Secured Authorization Request (JAR)#od26debf]] [#e104c14f]
どうも、この([[specの>#w0534ff5]])コンテキストからすると、
-このリクエストは認可リクエストではなく、[[Requestオブジェクト>JWT Secured Authorization Request (JAR)]]の登録リクエストっぽい。~
-また、この[[Requestオブジェクト>JWT Secured Authorization Request (JAR)]]の登録エンドポイントは、[[Discoveryで公開>OpenID Connect - Discovery#x1d64798]]される。

>
 POST https://as.example.com/ros/ HTTP/1.1
 Host: as.example.com
 Content-Type: application/jws
 Content-Length: 1288
 
 eyJhbGciOiJSUzI1NiIsImtpZCI6ImsyYmRjIn0.ew0KICJpc3MiOiA
 (... abbreviated for brevity ...)
 zCYIb_NMXvtTIVc1jpspnTSD7xMbpL-2QgwUsAlMGzw

なので、request_uriの形式は、URNになるのが既定と考える。
※ クライアント認証は、JWT中のissに対応した署名検証で行う。

**Response [#h1b6a7de]
***Response [#h1b6a7de]

***正常 [#s8b86aad]
-正常
 HTTP/1.1 201 Created
 Date: Tue, 2 May 2017 15:22:31 GMT
 Content-Type: application/json
 
 {
     'iss':'https://as.example.com/', // AuthZのID
     'aud':'s6BhdRkqt3', // ClientID
     'request_uri':'urn:example:MTAyODAK', // urn(暗号ランダム値)
     'exp':1493738581 // 有効期限(存続期間は短く、好ましくは一回限
 }

***異常 [#y542a19a]
-Authorization Required~
-異常
--Authorization Required~
401 Unauthorized HTTP error~
署名検証が失敗した場合。

-Invalid Request~
--Invalid Request~
400 Bad Request HTTP error~
[[Request>JWT Secured Authorization Request (JAR)#od26debf]]が無効

-Method Not Allowed~
--Method Not Allowed~
405 Method Not Allowed HTTP error~
POST要求を使用しなかった場合

-Request Entity Too Large~
--Request Entity Too Large~
413 Request Entity Too Large HTTP error~
要求サイズが上限を超える場合。

-Too Many Requests~
--Too Many Requests~
429 Too Many Requests HTTP error~
ある期間にClientからの要求数が上限を超えた場合。

*考察 [#vebd7c4e]

**[[プロファイルの識別方法>FAPI Part 1 (Read Only API Security Profile)#m07867a9]] [#ja1cc4e3]
**プロファイル [#oe3f07bf]

***[[プロファイルの識別>FAPI Part 1 (Read Only API Security Profile)#m07867a9]] [#ja1cc4e3]

***[[他のプロファイルの抑止>FAPI Part 1 (Read Only API Security Profile)#cb29b358]] [#y7c4e2df]

**[[Publicクライアント>#e482f66f]]のClient側実装 [#l62c0fa8]
-[[Publicクライアント>#e482f66f]]の場合、AuthZ実装も大変だが、Client実装が大変。
-特に、JavaやJavaScriptで[[JWT]]検証処理等を実装する必要が出てくる。
-このためか、[[JWE]]が[[Publicクライアント>#e482f66f]]のFlowで求められていない。

*関連仕様 [#i8ef7e99]
**関連仕様 [#i8ef7e99]
ただし[[OAuth]]2 / [[OIDC>OpenID Connect]]を除く。

**[[FAPI Part 1 (Read Only API Security Profile)]] [#kf1316fd]
**[[JWT Secured Authorization Request (JAR)]] [#icf72f77]
**[[JWT Secured Authorization Response Mode for OAuth 2.0 (JARM)]] [#j3ade667]
***[[FAPI Part 1 (Read Only API Security Profile)]] [#kf1316fd]
***[[JWT Secured Authorization Request (JAR)]] [#icf72f77]
***[[JWT Secured Authorization Response Mode for OAuth 2.0 (JARM)]] [#j3ade667]

**トークン・バインディング [#c724c394]
***MTLS: [[OAuth 2.0 Mutual TLS Client Authentication and Certificate Bound Access Tokens]] [#yc3529a9]
***OAUTB: [[OAuth 2.0 Token Binding]] [#b8a7bd37]
***[[OAuth 2.0 Token Binding]] [#c724c394]
-MTLS: [[OAuth 2.0 Mutual TLS Client Authentication and Certificate Bound Access Tokens]]

-OAUTB: [[OAuth 2.0 Token Binding]]

*参考 [#w0534ff5]
-Financial Services – Financial API - Part 2: Read and Write API Security Profile~
http://openid.net/specs/openid-financial-api-part-2.html
>FAPI Read and Writeセキュリティ・プロファイル

-Financial API 実装の技術課題 - Qiita > FAPI Part 2~
https://qiita.com/TakahikoKawasaki/items/48a9d22205f77db59726#fapi-part-2



----
Tags: [[:IT国際標準]], [[:認証基盤]], [[:クレームベース認証]], [[:OAuth]]


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS