プログラミング

認証と認可の素人が「OIDC」「OAuth2.0」「SAML」を1から勉強したときのまとめ

認証と言えば「一つのサーバでID/パスワードを入れる」

それ以外って何があるの?

という所からSSO・OAuth2.0・OIDC・SAMLをざっくり理解出来るところまで持っていった時の個人的まとめです

スポンサーリンク

SSO(Single Sign-On)について

「SSO」が「シングルサインオン」の略とは聞くものの実際に説明しろと言われたらよく分からないやつ。

ログインと言ったらID/パスワードを入れてシステムの認証を行うものという認識。

だが、色々システムがあると毎回ID/パスワードを求められてしんどい・・・

そういった時にシングルサインオンの出番。

 

SSOのメリットについて調べてみたらこんな感じ。

  • 利便性
    • SSOは、ユーザーが複数のシステムにアクセスする際の認証手続きを簡略化します。一度ログインすれば、他のシステムへのアクセスも追加の認証が不要です。
  • セキュリティ
    • SSOはセキュリティを強化する要素でもあります。ユーザーは1つのセキュアな認証システムを通じて認証され、他のシステムへのアクセスにはトークンやセッションなどが使用されます。
  •  パスワードの簡略化
    • ユーザーは1つの認証手続きで複数のシステムにアクセスできるため、異なるシステムごとに異なるパスワードを記憶する必要がありません。これはセキュリティの向上にもつながります。
  •  中央管理
    • SSOシステムは、アクセス権の管理を効率的に行うことができます。1つの場所でユーザーアカウントとアクセス権を管理することで、セキュリティを維持しやすくなります。
  •  ログアウトの一元化
    • ユーザーは1つのログアウト操作で全ての関連するシステムからログアウトできます。

SSO(Single Sign-On)を実現するためのアプローチ

SSOを採用してるシステムが良さそうだとは分かった。

じゃあよく聞くOAuth、SAML、OIDCってなんなのか?これらはすべて「SSOを実現するための方法」になる。

SSOを実現するための方法は大まかに以下に分かれる。

  • SAML (Security Assertion Markup Language)
  • OpenID Connect
  • OAuth 2.0
  • LDAP (Lightweight Directory Access Protocol)
  • Kerberos

SSO(Single Sign-On)簡潔まとめ

ユーザーが複数のシステムやアプリケーションに一度の認証でアクセスできる仕組み

ユーザ目線から言うといちいちID/パスワード入力をしなくて済むから楽で便利。

OAuth、SAML、OIDC等のよく聞くワード、これらはすべて「SSOを実現するための方法」

OAuth について

実際にSSOを実現する方法を見ていく。まずはOAuthについて

一番分かりやすい OAuth の説明 / @TakahikoKawasaki(川崎 貴彦)

  • OAuth以前
    • 認証情報を提供するする場合、セキュリティ問題があった。(提供するアプリでどのような管理をするか不明)
    • 同じ認証情報を使うとアプリごとの権限制限が出来なかった。
  • OAuthの登場で「特定のサービスまたはリソースアクセストークン」を発行できるようになった
    • -> トークン単位で認可判定が出来るようになった

OAuth2.0 の違いとOIDCへの繋がり

OAuth 2.0 全フローの図解と動画 / @TakahikoKawasaki(川崎 貴彦)

OAuthがOAuth2.0になって何が変わったの?というと以下。

  • アクセストークン発行の要求とその応答を「標準化」したものがOAuth2.0
  • OAuth 2.0 はアクセストークンを発行するための処理フローを定めている。

OAuthをカスタムやらして正しいくない使い方をしてたりしてたのを2.0で標準化することによって規格を定めた。

現状はOAuthと省略されて言われたらOAuth2.0の事を言ってる確率が高い。

 

そしてOIDCへ

OIDCはOAuthの仕組みに加えて「ID トークン」も発行できるようにした。

OIDC(Open ID Connect) について

OpenIDの概要 / NRI

NRIの資料。OAuth2.0とOIDCの説明。かなりまとまって理解もしやすい。

  • OpenID 2.0(ID連携)
    ID情報(認証結果と属性情報)を安全にサービス間でやりとりするための仕様
  • OAuth 2.0(API連携)
    あるサービスのAPIアクセスの許可を、別のサービスに安全に与えるための方法

これが合わさって「OpenID 2.0 + OAuth2.0 = OIDC」という式になる。

  • OAuth 2.0ではトークンの授受・利用を定義する一方、トークンの形式については仕様のスコープ外としている
  • OIDCでは?
    • JWTを使って改ざん防止 -> 電子署名

 

OIDCの簡単なフローとOIDCのある世界で出来ること。一番最初に見るとOIDCの事を理解しやすい。

多分わかりやすいOpenID Connect / 武井 宜行

OIDCのIDトークンとは

Auth0 を使って ID Token と Access Token の違いをざっくり理解する / 佐藤直哉

IDトークンが分かれば OpenID Connect が分かる / @TakahikoKawasaki(川崎 貴彦)

audクレーム

クライアントは自身のためのトークンかどうか調べることが可能です。
この「クライアント側で audクレーム のチェックを行う」ことは仕様として決められています。(参考 )

【OAuth 2.0 / OIDC】アクセストークンとIDトークンの違い + OIDC誕生の歴史 / yyh-gl’s Tech Blog

OIDC のstateとnonceの違い

OpenID Connectのstateとnonceの違いがわからなかった / @m28

  • stateはOAuth 2.0由来のパラメータ
  • nonceはOpenID Connect由来のパラメータ

stateパラメータの役割は?

CSRF防止

OAuthやOpenID Connectで使われるstateパラメーターについて / 武井 宜行

nonceパラメータの役割は?

リプレイアタック防止

OpenID Connectで使われるnonceパラメーターについて / 武井 宜行

stateでリプレイアタック防止ができる?

stateパラメータはユーザーのログイン状態としか紐づいてないので、nonceがわりにならない

OIDCのnonceの役目は何? / Nevermoe’s Blog

 

SAML(Security Assertion Markup Language) について

SAMLとは / 日立ソリューションズ

これもSSOを実現するための方法の一つだがOIDCより歴史が古い。そして企業内や企業間で使われるのであまり馴染みがない。

SAMLとOIDCの違い

  • OIDCはresponseがIDトークン(JWT)で軽量でより汎用的に
  • SAMLはresponseがXMLでtoBメイン

OIDCのIDトークンは、 SAMLのセキュリティ・アサーション (XML) を参考にしつつ、JSONをベースとするJWTを使う。

SAMLにはIdP InitiatedとSP Initiated の起点の違いが存在する

【図解】分かりやすいSAML認証の仕組みとシーケンス,メリット ~kerberosとの違い,Assertionや証明書,meta-data,relaystateについて~ / SEの道標

OAuthを認証で使った際になりすましとそれを防ぐには

OAuthを認証に使う危険性
本章では、OAuthを認証に使うことの危険性について説明します。これはある特性の条件下で発動します。Implicitフローを使っている。アクセストークンの発行元を検証しない。プロファイル情報APIによって得たユーザー情報を認証ユーザーとしている。この3つの条件が重なった時に、OAuth認証による危険性が発動します。

  1. Implicitフローを使っている。
  2. アクセストークンの発行元を検証しない。
  3. プロファイル情報APIによって得たユーザー情報を認証ユーザーとしている

この3つの条件が重なった時になりすましは起こる。

OAuth認証によるなりすましを防ぐためには、3つの方法があります。

  • アクセストークンの発行元を検証すること。
  • 認可コードフローを使うこと。
  • 最後にOpenID Connectを使うことです。

OAuth認証における乗っ取りはどのように起こるのか? 危険性が高まる3つの条件と、なりすましを防ぐ3つの対策 / 武井宜行

認可コードフローを使えばアクセストークンの置換はできない
OIDCを使えばアクセストークンの発行元を検証することが標準になっている。

OIDCはなんだか良さそう。

分かりにくい用語: Idp(あいでぃーぴー)

Identity Providerの略。認証情報を提供する側。

  •  例: スマホアプリAにログインするためにOIDCを使ってGoogleの情報で認証情報をスマホアプリAに連携する場合
    • Google側を「Idp」と呼ぶ。

OAuthだと?

  • 「認可サーバ」と呼ぶ。

分かりにくい用語: RP(りらいんぐぱーてぃー)

Relying Partyの略。認証情報を受け取ってユーザに提供する側。

  •  例: スマホアプリAにログインするためにOIDCを使ってGoogleの情報で認証情報をスマホアプリAに連携する場合
    • スマホアプリAを「RP」と呼ぶ。

OAuthだと?

  • 「クライアント」と呼ぶ。

SAMLだと?

  • 「SP(Service Provider)」と呼ぶ。

まとめ

ここまで調べてようやくシングルサインオンの概念。そしてOIDCのフローを少し理解することが出来た。

むずかしい・・・

参考

OAuth 2.0 全フローの図解と動画 / @TakahikoKawasaki(川崎 貴彦)
https://qiita.com/TakahikoKawasaki/items/200951e5b5929f840a1f

OAuth認証における乗っ取りはどのように起こるのか? 危険性が高まる3つの条件と、なりすましを防ぐ3つの対策 / 武井宜行
https://logmi.jp/tech/articles/325889

SP-Initiated と IdP-Initiated の動作の違いを Fiddler を見ながら確認してみる / @Shinya-Yamaguchi(Shinya Yamaguchi)
https://qiita.com/Shinya-Yamaguchi/items/434fab8c39e806e69a88

 

OpenIDの概要 / NRI
https://www.mhlw.go.jp/content/10800000/000537444.pdf

一番分かりやすい OpenID Connect の説明 / @TakahikoKawasaki(川崎 貴彦)
https://qiita.com/TakahikoKawasaki/items/498ca08bbfcc341691fe

図解 OpenID Connect による ID 連携 / @TakahikoKawasaki(川崎 貴彦)
https://qiita.com/TakahikoKawasaki/items/701e093b527d826fd62c

IDトークンが分かれば OpenID Connect が分かる / @TakahikoKawasaki(川崎 貴彦)
https://qiita.com/TakahikoKawasaki/items/8f0e422c7edd2d220e06

RustでOIDC Providerもどきを実装してテストスイートを通してみる / Y.Matsuda
https://zenn.dev/ymtdzzz/articles/13e18cdf6b9ee8

OIDCを用いたID連携における “確認済みメールアドレス” の使い方と注意点 / ritou
https://zenn.dev/ritou/articles/50366b09381e8d

OIDCでSAMLのIdP-initiatedなんとかみたいなことをやりたいみなさん / ritou
https://zenn.dev/ritou/articles/9366cc534860e5

多分わかりやすいOpenID Connect / 武井 宜行
https://tech-lab.sios.jp/archives/8651

OpenID Connectで使われるnonceパラメーターについて / 武井 宜行
https://tech-lab.sios.jp/archives/13087

OAuthやOpenID Connectで使われるstateパラメーターについて / 武井 宜行
https://tech-lab.sios.jp/archives/8492

OpenID Connectのstateとnonceの違いがわからなかった / @m28
https://qiita.com/m28/items/10c3a1de1bdcfda874b1

30分でOpenID Connect完全に理解したと言えるようになる勉強会
https://speakerdeck.com/d_endo/30fen-deopenid-connectwan-quan-nili-jie-sitatoyan-eruyouninarumian-qiang-hui

【OAuth 2.0 / OIDC】アクセストークンとIDトークンの違い + OIDC誕生の歴史 / yyh-gl’s Tech Blog
https://tech.yyh-gl.dev/blog/id_token_and_access_token/

OIDCのnonceの役目は何? / Nevermoe’s Blog
https://www.nevermoe.com/2021/10/28/oidc%E3%81%AEnonce%E3%81%AE%E5%BD%B9%E7%9B%AE%E3%81%AF%E4%BD%95%EF%BC%9F/

 

SAMLとは / 日立ソリューションズ
https://www.hitachi-solutions.co.jp/iam/sp/saml.html

【図解】分かりやすいSAML認証の仕組みとシーケンス,メリット ~kerberosとの違い,Assertionや証明書,meta-data,relaystateについて~ / SEの道標
https://milestone-of-se.nesuke.com/product/oss/saml/

コメント

タイトルとURLをコピーしました