SSOとは、一度システム利用開始のユーザー認証 (ログイン) を行うと、複数のシステムを利用開始する際に、都度認証を行う必要がない仕組みのことです。
実現方法は、次の通りです。
- リバースプロキシサーバを使ったSSO
- ケルベロス認証
リバースプロキシサーバを使ったSSO
各サーバとリバースプロキシサーバの間にファイアウォールなど作り、その先にPC接続できるようにします。
ユーザー側はリバースプロキシサーバにユーザID・パスワードを入力し、ユーザ認証すると、リバースプロキシサーバが各サーバに代理アクセスする方式です。
プロキシサーバは一般的にHTTP(HTTPS)プロキシであることが多いため、ユーザー側もHTTP通信の前提が必要になります。
HTTP通信ということは、各サーバー・PC側もWebアプリケーションであり、すべての通信がHTTP通信で成り立つ必要があります。
ケルベロス認証
ケルベロス認証では、ケルベロスサーバが発行したチケットを持って、対象サーバにアクセスする方式です。
- ユーザーは、ユーザーIDとパスワードをケルベロスサーバに送る
- ケルベロスサーバは、本人であることを認証した場合、TGT(チケット交付チケット)をユーザーに送る
- TGTを受け取ったユーザーは、TGS(チケット交付サーバ)にアクセスする
- TGSは受け取ったTGTを元に、対象サーバにアクセスするためのチケット(サービスチケット)をユーザーに送る
- ユーザーはサービスチケットを使って、対象サーバにアクセスする
TGSとサーバは、あらかじめ信頼関係を構築している必要があります。
信頼関係を構築している理由は、TGSが偽物だった場合に認証機能が成り立たないためです。
信頼関係を構築している範囲をレルムといいます。
信頼関係を結ぶために、両者の共通鍵を利用しています。
SAML
認証情報をマークアップ言語(タグ)で表す認証方式です。
Web技術と相性が良いため、広く使われています。
ドメイン間でのSSOを実現できます。
アサーションと呼ばれるXML形式の認証情報により、認証します。
アサーションには、「認証情報」「属性情報」「認可情報」が入っています。
このアサーションを、対象サーバに提示することで、認証できます。
サービスプロバイダ(SP)は、オンラインショップサイトなどのログイン先です。
IDプロバイダ(IdP)は、SSOサーバや認証サーバのことで、ユーザIDやパスワードが登録されているサーバです。
流れとしては次の通りです。
- ユーザーがSPにアクセスする
- 未ログインの場合は、SPがIdPへのリダイレクト指示を出す
- ユーザー(ブラウザ)はリダイレクト指示を元に、IdPにアクセスする
- IdPにて、ユーザーがユーザIDやパスワードを入力する
- IdPがアサーションを生成し、SPへのリダイレクト指示を出す
- ユーザー(ブラウザ)はリダイレクト指示を元に、SPにアクセスする(アサーションも一緒に)
- SPはリクエストに入っているアサーションを検証し、本物である場合にログインが完了する。
リダイレクトとは、ページを自動転送システムのことです。
「○秒後に自動ページ遷移します」と表示されることがあるね。
リダイレクト指示が出ると、ブラウザが勝手にリダイレクト先にアクセスし直します。
SAMLのメリットは何でしょうか?
SAMLのメリットは、SPとIdPの通信は必ずユーザー(ブラウザ)を介することです。
SPとIdPが直接通信することはないため、同一のネットワークに存在している必要がありません。
SAMLのリスクはなんだろう?
もし、ブラウザに届いた時点でアサーションが改ざんされた場合、想定外のアクセスを許可してしまう恐れがあります。
アサーションを生成した段階で、発行元であるIdPの署名をつけておくことで、アサーションの改ざんの検出する必要があります。
また、SPとIdPは直接通信しないものの、信頼関係の構築は必要です。
信頼がおけるIdPが生成したアサーションでないと、正しい認証ができないからだね。