Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

じこしょーかい • ⼈間です • しんぶんぶん(@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級

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

No content

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

No content

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

OAuth認証と何が違うの?

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

じこしょーかい • ⼈間です • しんぶんぶん(@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級