Upgrade to Pro — share decks privately, control downloads, hide ads and more …

NとZの違い

Yuto Takamune
December 26, 2020

 NとZの違い

認証と認可ってわかりにくいよね。認可の略称はAuthN、認証の略称はAuthZ。一文字しか変わらない。たとえばOIDCはOAuthにアイデンティティレイヤーを付与したものって言われてるけど、そもそもアイデンティティレイヤーって何?ってなっちゃう。そこら辺をいい感じに説明したくてこの資料を作ったんだ。あとはOAuth認証だね。OAuth認証なんてものは存在してはいけないんだけど、なぜかOAuthにユーザープロフィール取得APIを組み合わせたものがOAuth認証なんて呼ばれてる。声を大にして言いたい。OAuthは認可のプロトコルであり、認証のプロトコルではないんだ。

Yuto Takamune

December 26, 2020
Tweet

More Decks by Yuto Takamune

Other Decks in Research

Transcript

  1. NとZの違い
    〜認証と認可ってわかりにくいよね。認可の略称はAuthN、認証の略称はAuthZ。⼀⽂字しか変わらない。たと
    えばOIDCはOAuthにアイデンティティレイヤーを付与したものって⾔われてるけど、そもそもアイデンティティ
    レイヤーって何?ってなっちゃう。そこら辺をいい感じに説明したくてこの資料を作ったんだ。あとはOAuth認
    証だね。OAuth認証なんてものは存在してはいけないんだけど、なぜかOAuthにユーザープロフィール取得APIを
    組み合わせたものがOAuth認証なんて呼ばれてる。声を⼤にして⾔いたい。OAuthは認可のプロトコルであり、
    認証のプロトコルではないんだ。〜
    ただの⾼三 しんぶんぶん(@shinbunbun_)

    View full-size slide

  2. じこしょーかい
    • ⼈間です
    • しんぶんぶん(@shinbunbun_)
    • 3/14に最寄駅が増えた⾼校に通ってる3年⽣
    • 春から会津⼤学へ進学予定
    • 中3の11⽉にプログラミング始めた
    • ⾼1の春にセキュマネ、⾼2の春に応⽤情報受かった
    • ⾼三の春に情報処理安全確保⽀援⼠をとろうとしたものの、コロナにより試験中⽌で敢えなく断念
    • 普段はNuxt.jsとかNode.jsとか使ってWeb開発してる
    • 研究分野はSelf-sovereign identit(SSI)、Decentralized Identity(DID)、Verifiable Credentials (VC)など
    • 1⽉からR&Dインターンで主にVCに関する研究開発をする予定
    • LINE API実践ガイド LINEログイン章執筆
    • SGG運営メンバー。やたがいくんと⼆⼈でSGGアイデンティティ同好会的なものをやってる。
    • LTスライド⽂字だけになりがち
    • 漢検3級

    View full-size slide

  3. 先⽣!認可と認証って何が違うんですか!?

    View full-size slide

  4. ⼀⾔で説明するとこうなる
    • これ認可 • これ認証
    ※厳密には⼊館証を使った認証はAuthenticationではなくCertificationにあたる場合が多いですが、理解
    を助けるためにここではこの例を使ってます。どちらも⽇本語では「認証」になります。

    View full-size slide

  5. もうちょっとちゃんと説明
    • 認可(Authorization)
    • お前誰か知らんけどとりあえず
    ⼊館証持ってるから許可するわ
    →⼊館証を持っていれば「誰で
    も」⼊館を許可する
    →Bearerトークンを持っている相
    ⼿に対して特定リソースへのアク
    セスを許可する(OAuth2.0)
    • 認証(Authentication)
    • ⼊館証を⾒て「お前はようかんだ
    な」と確認する
    • →相⼿が「誰」かを確認する
    ※純粋な認証にリソースは関係ない
    ※厳密には⼊館証を使った認証はAuthenticationではなくCertificationにあたる場合が多いですが、理解
    を助けるためにここではこの例を使ってます。どちらも⽇本語では「認証」になります。

    View full-size slide

  6. OAuth2.0ってなぁに?
    • 権限の「認可」を⾏うためのプロトコル
    • 認証のプロトコルではない
    • 例えば、Google Driveから時間割表の写真をとってきて時間割
    botに登録したいとき(そんな機能ないが)

    View full-size slide

  7. もっとちゃんと説明すると・・・

    View full-size slide

  8. ※This is 認可コードグラント

    View full-size slide

  9. OAuth2.0ってなぁに?
    • Bearerトークンとは
    • いわゆる持参⼈トークン
    • ユーザーに関する情報は⼀切なく、そのトークンを持参した⼈にリソー
    スへのアクセス権を与えるというもの
    • 先の例で挙げた、「認可」の⽅の⼊館証のようなもの
    • 持参⼈払い⼩切⼿(bearer check)が語源(らしい)
    • ⼩切⼿⾦額の受取⼈を記名せず単に持参⼈に⽀払う旨記載された⼩切⼿(コトバ
    ンクより抜粋)
    • 最終的に時間割botが受け取ったものはこのBearerトークンのみ
    • つまり、トークンの対象が「誰か」という「認証」は⼀切⾏っていない
    • 権限認可時のログインがあるためみんな混乱しがちだが、そこで⾏われ
    ているのはあくまでユーザーとGoogle間の認証であり、クライアント
    アプリケーション(ここでは時間割bot)は関与していない

    View full-size slide

  10. OAuth認証とは
    • OAuth2.0の認可フローで取得した「Bearerトークン」を使って
    プロフィール取得APIを叩き、ユーザープロフィールを取得す
    ることで、疑似的に「認証のようなもの」をしている実装のこ
    とが「OAuth認証」と呼ばれている
    • OAuthはあくまで認可のプロトコルであり、認証に関する仕様
    は⼀切存在しない
    • OAuth認証なんてものは規格にない

    View full-size slide

  11. OAuth認証の何がダメなんですか? ①
    • インプリシットグラントではアクセストークンの⼊れ替えがで
    きてしまう
    • ⼀発アウト。レッドカード。退場。
    • 認可コードグラントでも、Authorizationヘッダーのリクエスト
    にstateパラメータを含めるなどのちゃんとした実装をしないと、
    CSRF攻撃を受ける可能性がある
    • OAuthにおけるCSRFは、攻撃者が正規の⼿段で⼊⼿したRedirect URI
    と認可コードを被害者に実⾏させるという形で⾏われる
    • OAuthを単純に認可の⽬的のみで使⽤していた場合は被害を限定的に
    抑えられるが、認証に使ってしまった場合、被害者は攻撃者のセッ
    ションでログインすることになってしまうため、被害が⼤きくなって
    しまう可能性がある

    View full-size slide

  12. OAuth認証の何がダメなんですか? ②
    • 何らかの⼿段で被害者のセッションがAuthorization Response
    のリダイレクト前で停⽌され、認可コードを盗まれた場合
    • stateパラメータを実装していても、認可コードとセッションは紐づい
    てないため、Authorization Responseで攻撃者の正規セッションに被
    害者の認可コードをのせられてしまったら検知できない
    • そうすると、攻撃者は被害者のセッションでログインできてしまう

    View full-size slide

  13. ふえぇ:;(∩´﹏`∩);:
    じゃあどうやって認証を実装すれば良いのよさ・・・

    View full-size slide

  14. そんなあなたにOpenID Connect(OIDC)
    • (Identity, Authentication) + OAuth 2.0 = OpenID Connect
    • 初めから認証のために作られたプロトコル
    • 仕様でちゃんと認証としての使い⽅が定められている
    • LINEログインなどで使⽤されている

    View full-size slide

  15. 例えば、ログインボタンを押したらユーザーのプロフィールを表
    ⽰するというアプリケーションの場合・・・

    View full-size slide

  16. ※LINEログインの場合(省略版)

    View full-size slide

  17. OAuth認証と何が違うの?

    View full-size slide

  18. OIDCのトークンはID Token
    • トークンレスポンス • デコードしたID Token

    View full-size slide

  19. OIDCしゅごい
    • ID TokenはBearerトークンと違って、トークンにユーザープロ
    フィールが含まれている
    • →トークンとユーザー認証情報が紐づいている
    • →トークンの対象が「誰か」という認証ができる

    View full-size slide

  20. セキュリティ
    • nonceパラメータを使えばリプレイアタックを防げる
    • nonceパラメータにより認可コードとセッションが紐づいた状態にな
    るため、 Authorization Responseで攻撃者の正規セッションに被害者
    の認可コードをのせられても検知が可能
    • きちんと認証に使うことができる
    • ただし、state、nonceなどの検証はきちんと⾏うべし

    View full-size slide

  21. OAuth認証なんか今すぐやめてOpenID
    Connectを使おう
    (どうしても使うんならちゃんとした
    セキュリティを)

    View full-size slide

  22. 宣伝
    • LINE API実践ガイド
    • LINE API Expertをはじめとし
    た有識者たちが各LINE APIに
    ついてハンズオン形式で執筆し
    た本
    • 僕はLINEログイン章を担当
    • OpenID Connectに関する解説
    も交えながら書いているので興
    味がある⽅はぜひ

    View full-size slide

  23. じこしょーかい
    • ⼈間です
    • しんぶんぶん(@shinbunbun_)
    • 3/14に最寄駅が増えた⾼校に通ってる3年⽣
    • 春から会津⼤学へ進学予定
    • 中3の11⽉にプログラミング始めた
    • ⾼1の春にセキュマネ、⾼2の春に応⽤情報受かった
    • ⾼三の春に情報処理安全確保⽀援⼠をとろうとしたものの、コロナにより試験中⽌で敢えなく断念
    • 普段はNuxt.jsとかNode.jsとか使ってWeb開発してる
    • 研究分野はSelf-sovereign identit(SSI)、Decentralized Identity(DID)、Verifiable Credentials (VC)など
    • 1⽉からR&Dインターンで主にVCに関する研究開発をする予定
    • LINE API実践ガイド LINEログイン章執筆
    • SGG運営メンバー。やたがいくんと⼆⼈でSGGアイデンティティ同好会的なものをやってる。
    • LTスライド⽂字だけになりがち
    • 漢検3級

    View full-size slide