🕵️‍♀️

あれ、認証・認可についてちゃんと説明できるっけ。。

2021/03/01に公開

はじめに

  • なぜこんな記事を書こうと思ったかというと、認証・認可について僕がなあなあになっている気がしたので、改めて自分の中で整理したかった為です。

認証 (Authentication)

あるウェブサイトにユーザがログインした際に誰なのかを確認することを指します。
本人確認をイメージすると分かりやすいかもです。

認可 (Authorization)

認証したユーザに対して、リソースのアクセス権限をどこまで与えるか決定することです。

フェデレーテッドログイン

これは、例えばあるサービスがあった場合にそのサービス以外が管理するIDを利用してログインする方法です。

実装パターン

以下に実装パターンをいくつか紹介しますが、だいたい今はOAuth 2.0かOpenID Connect(別記事で書きます。)ですねw

シングルサインオン

シングルサインオンは、各システム間のアカウント管理を別々に行わず、一度認証したら全システムが全て有効になるような仕組みです。
また、シングルサインオンにはいくつか方法があります。
一つ例にあげるのであれば、あるサービスがあった時、そのサービスが認証サーバにユーザIDとパスワードを利用しアクセスしにいく方法があります。

kerberos認証

kerberos認証は、はじめにユーザIDとパスワードを使って認証し、以降は身元証明書(チケット)を使って認証する方法です。
もう少し詳しく説明すると、ユーザがサービスを使用するときは、まずチケット保証サーバ(TGS)へのアクセストークンであるTGT(Ticket Granting Ticket)セッションキーを取得します。
その後、TGTセッションキーをチケット保証サーバに送り、クライアントからサーバにアクセスするためのチケットセッションキーをもらいます。
そして、ユーザはこのチケットセッションキーをサービスに送るということで認証をする仕組みとなります。

SAML

  • SAML(Security Assertion Markup Language)は、HTTP/SOAPを前提としたシングルサインオンの仕組みです。

  • この仕組み、奥深いので実装方法については、HTTP POST /Redirect バインディングに絞り説明します。

  • 特徴としては、クッキーを使ってセッションを管理するウェブの仕組みに準拠しており、ドメインをまたぐサービス間でシングルサインオンができます。

構成要素

ユーザ

ブラウザを操作している人

認証プロバイダー (IdP)

ID管理をするサービス

サービスプロバイダー (SP)

ログインしたいサービス

HTTP POST /Redirect バインディングによる実装

下記のような流れで認証/認可を行います。

  • 1.ユーザはログインされていない状態で、ユーザがSPにアクセスします。

  • 2.SPはブラウザにRedirectのhttp status(3XX)を返します。

  • 3.IdPはユーザが認証の要件を満たすログインコンテキストをIdpに持ってるかを判断します。
    もしなければ、ユーザに正しいID/Passwordを提供するようにブラウザから要求します。

  • 4.ユーザはID/Passwordを入力し、IdPでそのユーザに対するセキュリティコンテキストが作成されます。

  • 5.IdPはユーザのセキュリティコンテキストを表すSAMLアサーションを作成します。

  • 6.ブラウザは5で取得したSAMLアサーションをSPに送信するHTTPリクエストを発行します。

  • 7.ユーザがリソースにアクセスする権限があるかチェックをし、通ればリソースをブラウザに返します。

引用

OAuth2.0

構成要素

認可サーバ

ユーザ情報を持つウェブサービス。
ユーザは、この認可サーバのアカウントを持っています。

リソースサーバ

ユーザが許可した権限で自由にアクセスできる対象。

クライアント

ユーザが新たに利用したいサービスやアプリケーション

認証フロー

いくつかフローがあるのですが、今回は抜粋して通常のフローのみに絞り説明します。

Authorization Code

通常のフローです。
今回はPKCEは置いておきます。

流れとしては、認可サーバに認可リクエストを送信し、認可コードを受けとります。
その認可コードを再度、認可サーバに送信してアクセストークンと交換するようなフローになります。

  • アクセストークン発行までのやり取り
    図1.png

  • リソース返却までのやり取り
    図2.png

参考文献

https://dev.classmethod.jp/articles/authentication-and-authorization/
http://docs.oasis-open.org/security/saml/Post2.0/sstc-saml-tech-overview-2.0-cd-02.html
https://blog.cybozu.io/entry/4224

Discussion