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

NとZの違い

4e4410453964b11bc6077c72334bf8ec?s=47 Yuto Takamune
December 26, 2020

 NとZの違い

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

4e4410453964b11bc6077c72334bf8ec?s=128

Yuto Takamune

December 26, 2020
Tweet

Transcript

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

  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級
  3. 先⽣!認可と認証って何が違うんですか!?

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

  5. もうちょっとちゃんと説明 • 認可(Authorization) • お前誰か知らんけどとりあえず ⼊館証持ってるから許可するわ →⼊館証を持っていれば「誰で も」⼊館を許可する →Bearerトークンを持っている相 ⼿に対して特定リソースへのアク

    セスを許可する(OAuth2.0) • 認証(Authentication) • ⼊館証を⾒て「お前はようかんだ な」と確認する • →相⼿が「誰」かを確認する ※純粋な認証にリソースは関係ない ※厳密には⼊館証を使った認証はAuthenticationではなくCertificationにあたる場合が多いですが、理解 を助けるためにここではこの例を使ってます。どちらも⽇本語では「認証」になります。
  6. OAuth2.0ってなぁに? • 権限の「認可」を⾏うためのプロトコル • 認証のプロトコルではない • 例えば、Google Driveから時間割表の写真をとってきて時間割 botに登録したいとき(そんな機能ないが)

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

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

  10. OAuth2.0ってなぁに? • Bearerトークンとは • いわゆる持参⼈トークン • ユーザーに関する情報は⼀切なく、そのトークンを持参した⼈にリソー スへのアクセス権を与えるというもの • 先の例で挙げた、「認可」の⽅の⼊館証のようなもの

    • 持参⼈払い⼩切⼿(bearer check)が語源(らしい) • ⼩切⼿⾦額の受取⼈を記名せず単に持参⼈に⽀払う旨記載された⼩切⼿(コトバ ンクより抜粋) • 最終的に時間割botが受け取ったものはこのBearerトークンのみ • つまり、トークンの対象が「誰か」という「認証」は⼀切⾏っていない • 権限認可時のログインがあるためみんな混乱しがちだが、そこで⾏われ ているのはあくまでユーザーとGoogle間の認証であり、クライアント アプリケーション(ここでは時間割bot)は関与していない
  11. OAuth認証とは • OAuth2.0の認可フローで取得した「Bearerトークン」を使って プロフィール取得APIを叩き、ユーザープロフィールを取得す ることで、疑似的に「認証のようなもの」をしている実装のこ とが「OAuth認証」と呼ばれている • OAuthはあくまで認可のプロトコルであり、認証に関する仕様 は⼀切存在しない •

    OAuth認証なんてものは規格にない
  12. None
  13. OAuth認証の何がダメなんですか? ① • インプリシットグラントではアクセストークンの⼊れ替えがで きてしまう • ⼀発アウト。レッドカード。退場。 • 認可コードグラントでも、Authorizationヘッダーのリクエスト にstateパラメータを含めるなどのちゃんとした実装をしないと、

    CSRF攻撃を受ける可能性がある • OAuthにおけるCSRFは、攻撃者が正規の⼿段で⼊⼿したRedirect URI と認可コードを被害者に実⾏させるという形で⾏われる • OAuthを単純に認可の⽬的のみで使⽤していた場合は被害を限定的に 抑えられるが、認証に使ってしまった場合、被害者は攻撃者のセッ ションでログインすることになってしまうため、被害が⼤きくなって しまう可能性がある
  14. OAuth認証の何がダメなんですか? ② • 何らかの⼿段で被害者のセッションがAuthorization Response のリダイレクト前で停⽌され、認可コードを盗まれた場合 • stateパラメータを実装していても、認可コードとセッションは紐づい てないため、Authorization Responseで攻撃者の正規セッションに被

    害者の認可コードをのせられてしまったら検知できない • そうすると、攻撃者は被害者のセッションでログインできてしまう
  15. ふえぇ:;(∩´﹏`∩);: じゃあどうやって認証を実装すれば良いのよさ・・・

  16. そんなあなたにOpenID Connect(OIDC) • (Identity, Authentication) + OAuth 2.0 = OpenID

    Connect • 初めから認証のために作られたプロトコル • 仕様でちゃんと認証としての使い⽅が定められている • LINEログインなどで使⽤されている
  17. 例えば、ログインボタンを押したらユーザーのプロフィールを表 ⽰するというアプリケーションの場合・・・

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

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

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

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

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

    きちんと認証に使うことができる • ただし、state、nonceなどの検証はきちんと⾏うべし
  23. OAuth認証なんか今すぐやめてOpenID Connectを使おう (どうしても使うんならちゃんとした セキュリティを)

  24. 宣伝 • LINE API実践ガイド • LINE API Expertをはじめとし た有識者たちが各LINE APIに

    ついてハンズオン形式で執筆し た本 • 僕はLINEログイン章を担当 • OpenID Connectに関する解説 も交えながら書いているので興 味がある⽅はぜひ
  25. じこしょーかい • ⼈間です • しんぶんぶん(@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級