MS_FAPIPart2 - NetDevInfraWGinOSSConsortium/NetDevInfraWiki GitHub Wiki
- 戻る(Financial API (FAPI))
- FAPI Part 1 (Read Only API Security Profile)
- FAPI Part 2 (Read and Write API Security Profile)
- CIBA
- 金融データへのトランザクション・アクセスに適した OAuth プロファイル
- OpenID Connect(OIDC)を使用して顧客(ユーザ)を識別
- トークンを使用して、エンドポイントから保護データを読取
- エンドポイントは、JSONデータを提供する REST API
※ ドラフト 4 を参考にして作成。その後、ドラフト 6 を再度完読して加筆・修正。
- 送信者・受信者・メッセージ認証を強化
- 以下の攻撃に対するコントロールを規定
- 認可要求の改ざん
- コードインジェクション
- 状態インジェクション
- トークン要求フィッシング
- 認可応答の改ざん
このプロファイルを簡単に説明すると、以下のようになる。
| クライアント種別 | response_type |
|---|---|
| Confidential | code id_token |
| Public(Native) |
code id_token(JARM) |
| Public(SPA) |
code id_token token(Hybrid Flow) |
-
code id_token- Confidential クライアント
- Native の Public クライアントの場合、S256 の OAuth PKCE
-
code id_token token(SPA 系の Public クライアント)-
8.3.3. Identity provider (IdP) mix-up attackの可能性がある。 - 故に、Implicit Flow より Hybrid Flow
-
JARMであれば Hybrid Flow でなくてもいい。
(OAuth 2.0 Form Post Response Modeも参照)
- パラメタを要求。
- Request オブジェクト(JWT Secured Authorization Request (JAR))
補足(なぜ
code id_tokenなのか): Hybrid Flow のcode id_tokenは
一見冗長だが、認可レスポンスの改ざんを検知するために選ばれている。
- 認可レスポンスに
id_token(署名済み JWT)が含まれる。id_tokenの中にc_hash(codeのハッシュ)、
s_hash(stateのハッシュ)が入っている。- Client は署名を検証し、受け取った
code/stateと突き合わせる。これにより「ブラウザ上で
codeをすり替えられた」ことを検知できる。
FAPIが指摘する「メッセージ自体の認証が無い」問題への直接の答えである。
JWT形式
-
JWS署名
- ES256(ECDSA using P-256 and SHA-256, Recommended+)
- PS256(RSASSA-PSS using SHA-256 and MGF1 with SHA-256, Optional)
- JWE暗号化:アルゴリズムの指定は無し。
補足(
RS256が禁止されている): JWAではRS256が
Recommended だが、FAPI ではPS256/ES256のみに制限される。
方式 FAPI RS256RSASSA-PKCS1-v1_5 不可 PS256RSASSA-PSS(確率的署名) 可 ES256ECDSA(楕円曲線) 可 PKCS#1 v1.5 は形式的な安全性証明が無く、
パディング関連の実装ミスが歴史的に多い。
PSS は安全性証明があるため、高保証プロファイルではこちらが選ばれる。
ES256 は署名が短く高速という利点もある。
-
acrとamr(OpenID Connect - ID トークン) -
at_hashとc_hash - 更に、切り離された署名のための
s_hash
認可レスポンスが改ざんされていないことを検証する。
s_hash: クライアントは、at_hash と c_hash に加え、s_hash の値を検証する。
- 値
-
state値の ASCII 表現のオクテットのハッシュの左端の半分を
base64url エンコーディング - ハッシュは ID トークンの JOSE ヘッダの
algパラメタで使用されるアルゴリズム。
-
- 例:
algが HS512 の場合-
state値を ASCII エンコードし、 - SHA-512 でハッシュ化し、
- 左端の 256 ビットを切り出し、
- base64url エンコードする。
-
この代替に「JARM」と言う仕様もある。
- TLS バージョン 1.2 以降
- TLS サーバ証明書チェック
- 暗号スイート
TLS_DHE_RSA_WITH_AES_128_GCM_SHA256TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256TLS_DHE_RSA_WITH_AES_256_GCM_SHA384TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
完全一致
LoA 3(LoA(Level of Assurance))
- 特定される身元識別情報の信用度が「相当程度ある」。
- パスワードだけではなく、2 要素以上を用いてユーザー認証をする。
- 認可エンドポイント: Request オブジェクト
- Token エンドポイント(以下の何れかが必要)
-
JWT Client Assertion(
private_key_jwt) -
紐付け(トークン・バインディング)
FAPI クライアントが「mTLS」または「OAUTB」を使用する場合、
認証コードは TLS チャネルにバインドされる。
-
JWT Client Assertion(
補足(
client_secretが使えない): FAPI では
client_secret_basic/client_secret_post(共有秘密による認証)が
禁止されている。使えるのは次の 2 つのみ。
方式 内容 private_key_jwtクライアントが秘密鍵で署名した JWT を提示。AS は公開鍵で検証 tls_client_auth(mTLS)クライアント証明書で TLS 相互認証 共有秘密は「AS 側にも同じ値が保管される」ため、
AS が侵害されるとクライアントになりすませる。
公開鍵方式なら、AS は公開鍵しか持たないので、この問題が無い。
記名式トークン(Proof-of-possession Token)
- 対象:
code、token - 紐付け(トークン・バインディング): mTLS / OAUTB
移行メモ(最新化:OAUTB は終了した): Token Binding(OAUTB) は
ブラウザ ベンダの支持が得られず、
Chrome が 2018年に実装を撤回して事実上終了した。現在の記名式トークンの選択肢は次の 2 つである。
方式 RFC 特徴 mTLS RFC 8705 クライアント証明書に紐づける。サーバー間通信向き DPoP RFC 9449 アプリ層で署名。証明書基盤が不要。SPA / モバイル向き FAPI 2.0 では mTLS と DPoP の両方が認められている。
証明書の配布・更新の運用負荷を避けたい場合、DPoP が現実的な選択になる。
- 認証・認可、クライアント認証、
redirect_uri(完全一致)、code/tokenの扱い
- 共通要件のほか、Confidential / Public で個別の要件がある。
- 記名式トークンの検証。
- 登録リクエスト / 認可リクエストで JARを使用する。
- 仕様の流れは JAR → PAR(RFC 9126)。
補足(JAR から PAR への流れ): JAR は「リクエストを署名した JWT に
まとめてブラウザ経由で送る」方式だが、URL 長の制限という実務的な問題があった。PAR(Pushed Authorization Requests、RFC 9126) は、
- Client がバックチャネルで認可リクエストを AS に POST する。
- AS が短い
request_uriを返す。- ブラウザは
request_uriだけを持って認可エンドポイントへ。という方式で、
- URL が短くなる
- リクエストがブラウザを一切通らない(改ざん・盗聴の余地が消える)
という二重の利点がある。
FAPI 2.0 では PAR が必須になっている。
- プロファイルの識別 / 他のプロファイルの抑止
- FAPI Part 1 (Read Only API Security Profile)
- JWT Secured Authorization Request (JAR)
- JWT Secured Authorization Response Mode for OAuth 2.0 (JARM)
- OAuth 2.0 Token Binding
-
FAPI 1.0 - Advanced(旧 Part 2)
https://openid.net/specs/openid-financial-api-part-2-1_0.html -
FAPI 2.0 Security Profile
https://openid.net/specs/fapi-security-profile-2_0-final.html -
RFC 9126 - OAuth 2.0 Pushed Authorization Requests
https://datatracker.ietf.org/doc/html/rfc9126 -
RFC 8705 - OAuth 2.0 Mutual-TLS Client Authentication
https://datatracker.ietf.org/doc/html/rfc8705 -
RFC 9449 - OAuth 2.0 Demonstrating Proof of Possession (DPoP)
https://datatracker.ietf.org/doc/html/rfc9449
Tags: 移行, IT国際標準, 認証基盤, クレームベース認証, OAuth, セキュリティ