Lock in $30 Savings on PRO—Offer Ends Soon! ⏳

基礎からわかろうOAuth2/OpenID Connect

基礎からわかろうOAuth2/OpenID Connect

Yuki Watanabe

June 21, 2023
Tweet

More Decks by Yuki Watanabe

Other Decks in Programming

Transcript

  1. SPEAKER • 渡邉 雄貴 / Yuki Watanabe ◦ 近畿大学 理工学部

    B3 ▪ KINDAI Info-Tech HUB 役員 ▪ KC3運営委員会(NPO法人NxTEND) 理事 ◦ Webバックエンド・インフラエンジニア ▪ 長期インターンシップ・業務委託での開発 ▪ 転職型プログラミングスクール メンター
  2. SPEAKER • 渡邉 雄貴 / Yuki Watanabe ◦ SKILLS ▪

    Webバックエンド • Ruby(Rails) / Python(FastAPI, Flask) / Kotlin / TS ▪ Webフロントエンド • TS(React) / JS / HTML-CSS ▪ インフラ・その他 • Linux / AWS / Docker / DB / 認証・認可
  3. SPEAKER • 渡邉 雄貴 / Yuki Watanabe ◦ SKILLS ▪

    Webバックエンド • Ruby(Rails) / Python(FastAPI, Flask) / Kotlin / TS ▪ Webフロントエンド • TS(React) / JS / HTML-CSS ▪ インフラ・その他 • Linux / AWS / Docker / DB / 認証・認可
  4. 認証ってなに? • 認証/Authentication(Authn) ◦ サービスの利用者が本人であることを確認する ▪ What you are •

    生体認証 ▪ What you have • 所有物認証(カギやセキュリティキーなど) ▪ What you know • 知識認証(パスワード・秘密の質問) 認証・認可の違い
  5. 認証ってなに? • 認証/Authentication(Authn) ◦ サービスの利用者が本人であることを確認する ▪ What you are •

    生体認証 ▪ What you have • 所有物認証(カギやセキュリティキーなど) ▪ What you know • 知識認証(パスワード・秘密の質問) 認証・認可の違い
  6. OAuth2のしくみ • 登場人物(ロール) ◦ リソースオーナー(ユーザ) ▪ GoogleやTwitterのアカウントオーナーを指す ◦ クライアント ▪

    権限を移譲された外部サービス ◦ リソースサーバー ▪ だいたいWebAPIのこと リソースを提供する ◦ 認可サーバー ▪ OAuthサービスを提供するサーバー OAuth2とは?
  7. • 登場人物 ◦ アクセストークン ▪ 「誰の」「どのリソースに」「いつまで」 アクセスできるかと紐付けられている ▪ クライアントからリソースサーバへのアクセスに添付 •

    紐付けられた情報と矛盾がなければアクセスを許可 ▪ Bearerトークン(RFC6750) • アクセストークンさえ持っていれば誰でもアクセスできる OAuth2のしくみ OAuth2とは?
  8. • 登場人物 ◦ アクセストークン ▪ スコープ • 「何の」リソースにアクセスできるかを規定 • クライアントから認可サーバへのリクエスト時に指定する

    OAuth2のしくみ OAuth2とは? https://discord.com/api/oauth2/authorize?client_id=XXXXX &redirect_uri=http%3A%2F%2Fredirect:3000&response_type=code &scope=identify%20guilds
  9. • エンドポイント ◦ 認可エンドポイント ▪ 認可サーバによって提供 ▪ 認可コードの発行を行う ◦ トークンエンドポイント

    ▪ 認可サーバによって提供 ▪ 認可コードと引き換えにアクセストークンの発行を行う ▪ クライアントのIdentityはBasic認証で行う OAuth2のしくみ OAuth2とは?
  10. 認可コードグラント(認可コードフロー) OAuth2におけるグラントタイプ POST /token HTTP/1.1 Host: ninka.example.com Authorization: Basic <CLIENT_SECRET>

    Content-Type: application/x-www-form-urlencoded grant_type=authorization_code&code=xxx &redirect_uri=https://client.user.com/callback POST /token HTTP/1.1 Host: ninka.example.com Content-Type: application/x-www-form-urlencoded grant_type=authorization_code&code=xxx &redirect_uri=https://client.user.com/callback &client_id=123456&client_secret=<CLIENT_SECRET>
  11. 認可コードグラント(認可コードフロー) OAuth2におけるグラントタイプ HTTP/1.1 200 OK Content-type: application/json;charset=UTF-8 Cache-Control: no-cache Pragma:

    no-cache { “access_token”: “abc123”, “refresh_token”: “987zyx”, “expires_in”: 3600, “token_type”: Bearer }
  12. 認可コードグラント + PKCE • PKCE ◦ Proof Key of Code

    Exchange ▪ OAuthの拡張仕様(RFC7636)で定義 OAuth2におけるグラントタイプ
  13. 認可コードグラント + PKCE • PKCE ◦ パラメータ ▪ code_verifier •

    43-128文字、英数字+[“-” , ”.” , ”_” , “~”] ▪ code_challenge_method • plain(平文) or S256(SHA256) ▪ code_challenge • plainならcode_challengeそのまま • S256なら OAuth2におけるグラントタイプ BASE64URL-ENCODE(SHA256(ASCII(code_verifier)))
  14. • 2つの誤解 ◦ ② OAuth2を認証に使っているからって なんでも危険な訳ではない ▪ OAuth2の脆弱性 インプリシットグラントの脆弱性 •

    インプリシットグラントでは アクセストークンが直接ブラウザに落ちてくるため ここでの奪取やなりすましが起こりうる OAuth2を認証に使うということ OAuth2を認証に使う
  15. • ただし ◦ 認証に使うなら、ちゃんと認証用途に標準化された OpenID Connectを使ったほうが良い ▪ でもあんまりない • Google,

    Microsoft, Yahoo, Paypal, Amazon ……… • 我らがDiscordも提供していない OAuth2を認証に使うということ OAuth2を認証に使う
  16. OpenID Connectとは? • OpenID Connect ◦ 仕組み ▪ OAuth2 +

    IDトークン + UserInfoエンドポイント ◦ 用語の違い ▪ リソースオーナー -> エンドユーザー ▪ クライアント -> リライング・パーティ(RP) ▪ 認可サーバ -> IDプロパイダ ▪ リソースサーバ -> UserInfoエンドポイント OpenID Connect
  17. • IDトークン ◦ IdPが発行し、RPが受け取る ◦ 形式 ▪ 署名付きJWT ◦ 内容

    ▪ エンドユーザの識別ID(sub) ▪ 有効期限・発行日時 ▪ 発行者ID・受領者ID ▪ トークンの形式・署名方式・署名 IDトークン OpenID Connect
  18. • 中身 ◦ ヘッダ ▪ typクレーム:”JWT” • JWTであることを表す ▪ algクレーム:”RS256”

    • 署名方式を表す • noneは禁止 • 公開鍵は特定の場所で公開(RFC7517) IDトークン OpenID Connect
  19. • 中身 ◦ ペイロード ▪ issクレーム(issuer) • IDトークン発行者(IdPのURLなど) ◦ 正しい発行者であるかを確認

    ▪ audクレーム(audience) • IDトークンを受け取るRPのクライアントID ◦ 自分のIDトークンであるか(自分宛に発行されたものか)確認 IDトークン OpenID Connect
  20. • 中身 ◦ ペイロード ▪ subクレーム(subject) • エンドユーザのuuid(識別子) ◦ RPがエンドユーザを識別するためのもの

    ▪ iatクレーム(issued at) • JWTの発行時間(UNIX Time (sec)) ◦ 未来の日時を指していないか確認 IDトークン OpenID Connect
  21. • 中身 ◦ ペイロード ▪ expクレーム(expiration time) • IDトークンの有効期限 ◦

    RPはこの期限以降にIDトークンを受け入れてはならない ▪ nonceクレーム • 認証リクエスト時に送ったnonceがそのまま入る ◦ IdPが認可コードと紐づけて保管 ◦ 攻撃者が認可コードをすりかえることを防ぐ IDトークン OpenID Connect
  22. • 中身 ◦ 署名 ▪ f”{ヘッダ}.{ペイロード}”に対して Base64URLエンコード -> 署名 ->

    Base64URLエンコード • ここを検証することでJWTの正当性を担保 ◦ たいへんなので各自調べてください • 認証コードフローでは省略しても良い ◦ 改ざんの可能性が限りなく低いため IDトークン OpenID Connect
  23. • インプリシットフロー ◦ パブリッククライアント向けOIDCフロー ▪ 認可コードに関する処理が省かれる • nonceによって OAuth2のインプリシットフロー脆弱性を防止 •

    ハイブリッドフロー ◦ バックエンドを持つネイティブアプリ向け ▪ 認可コードとアクセストークンがアプリに送られ、 トークンは保存、認可コードはバックエンドに送られる その他のフロー OpenID Connect
  24. 参考資料 • The OAuth 2.0 Authorization Framework ◦ © 2012

    IETF Trust, Dick Hardt ◦ https://datatracker.ietf.org/doc/html/rfc6749 • The OAuth 2.0 Authorization Framework: Bearer Token Usage ◦ © 2012 IETF Trust, Michael B. Jones, Dict Hardt ◦ https://datatracker.ietf.org/doc/html/rfc6750 • The OAuth 2.0 Threat Model and Security Considerations ◦ © 2013 IETF Trust, Torsten Lodderstedt, Mark McGloin, Phil Hunt ◦ https://datatracker.ietf.org/doc/html/rfc6750
  25. 参考資料 • OpenID Connect Core 1.0 incorporating errata set 1

    ◦ © 2014 The OpenID Foundation ◦ http://openid-foundation-japan.github.io/openid-connect-core-1_ 0.ja.html • OpenID Connect Implicit Client Implementer's Guide 1.0 - draft 2 ◦ © 2015 The OpenID Foundation ◦ http://openid-foundation-japan.github.io/openid-connect-implicit- 1_0.ja.html
  26. 参考資料 • 雰囲気でOAuth2.0を使っているエンジニアが OAuth2.0を整理して、手を動かしながら学べる本 ◦ © 2019 Auth屋 • OAuth、OAuth認証、OpenID

    Connectの違いを整理して、 理解できる本 ◦ © 2019 Auth屋 • OAuth・OIDCへの攻撃と対策を整理して理解できる本 ◦ © 2020 Auth屋