目的
業務でSSOについての知識が必要になったが、雰囲気しか理解してなかったので
まとめておく
SSOって何?
- 一度の認証で複数のシステムやサービスにログインできる仕組み
SSOは何がうれしい?
- サービスごとに異なるパスワードを覚えて、ログインして...みたいなことを考えなくてよくなり
パスワード管理の負荷が軽減される。またパスワードの使いまわしをなくしセキュリティを強化できる
SSOの仕組み
登場人物
- IdP(ID Provider):認証情報を提供する側
- SP(Service Provider):IdPの提供する認証情報を利用しサービスを提供する側
SSOを実現する方法
- エージェント方式
- SPであるWebサーバに認証用のエージェントソフトをインストールする方式
- エージェントからの認証情報をもとにSSOサーバが認証を行う
- SP側の構成がかわるので社内システムやサービス提供側で実装する際の方式
エージェント方式による認証の仕組み
ユーザーがサービスAにアクセスし、ユーザーIDとパスワードを入力
サービスA上のエージェントがサービスAに代わり、SSOサーバーに対し下記2点を確認
- ユーザー本人であるか
- ユーザーがサービスAへのアクセス権限を持っているか
SSOサーバー側で認証情報を確認し内容に問題なければ、エージェントからユーザーに「認証済Cookie」を送信、サービスAの利用が可能
ユーザーが別のサービスBにアクセス
サービスB上のエージェントが、SSOサーバーに下記を確認
ユーザーがサービスBへのアクセス権限を持っているか
※ユーザー本人であることは「認証済Cookie」があるため確認しない
SSOサーバー側で情報を確認し内容に問題なければ、サービスBの利用が可能
- リバースプロキシ方式
- SPであるWebサーバの前段にリバースプロキシサーバーを設置し、リバースプロキシサーバーで認証を行う
- SP側の構成がかわるので社内システムやサービス提供側で実装する際の方式
リバースプロキシ方式による認証の仕組み
ユーザーがサービスAにアクセスしようとすると、リバースプロキシサーバー経由でのアクセスとなり、認証画面が表示されるためユーザーIDとパスワードを入力
リバースプロキシサーバー側で認証情報を確認し、内容に問題なければ、リバースプロキシサーバーからユーザーに「認証済Cookie」を送信、サービスAの利用が可能
3.ユーザーがサービスBにアクセスしようとすると、リバースプロキシサーバー経由でのアクセスとなり、リバースプロキシサーバー側で「認証済Cookie」の情報を確認できればサービスBの利用が可能
- 代理認証方式
- 代理認証用のエージェントがユーザーの代わりにIDとパスワードを送信してログインを完了させる方式。
- SP側でなく、サービス利用者側でSSOを実現する方式
代理認証方式による認証の仕組み
ユーザーの端末に導入したエージェントの認証をSSOサーバーで実施
認証に問題なければ、SSOサーバーからエージェントに対し、ユーザーが利用している各サービスのID・パスワード情報を送信
ユーザーがサービスにアクセスすると、エージェントが代理でID・パスワードを自動入力し、サービスの利用が可能
-
フェデレーション方式
- 異なるドメインのサービスでも認証情報を連携できる方法
- フェデレーション方式では、パスワードではなく「チケット」と呼ばれる情報をユーザーとIdP(Identity Provider)がやり取りし、認証を行う
- IdPとSP間で事前に信頼関係を構築し、IdPで認証された証を持って、SPへのアクセスを許可する
- SAMLやOpen ID Connectなどのプロトコルで実現される
-
透過型方式
- 比較的新しい方式らしく、あまり情報がなかった...
- 詳しい人いたら教えてほしい
参考リンク
https://hogetech.info/security/sso/federation
https://www.ogis-ri.co.jp/column/themistruct/c106480.html
https://www.hitachi-solutions.co.jp/iam/sol_signon.html
SAMLによるSSOをFlaskアプリで実装してる方がいた。
https://thinkami.hatenablog.com/entry/2024/02/12/230830
https://developer.okta.com/code/python/pysaml2/
IdP:Keycloak
SP:Flaskアプリ
という構成。
https://www.keycloak.org/
KeycloakというのはID管理のためのオープンソースソフトウェアらしい。
上記のサイトに従ってコードを動かして、Keycloakの設定もしてみたが、
Keycloakの認証画面に飛ぶ際にInvalid Redirect Uriとなって認証画面に到達できなかった。
Keycloak側の設定の問題かもしれない。
Keycloak以外のIdPでのSAML認証も試してみたい。が、あんまり日本語のドキュメントがないのがつらみ。
Azure AD(現在はMicrosoft Entra ID)でSAMLを使ったSSOについては以下が参考になりそう。
https://learn.microsoft.com/ja-jp/entra/identity/enterprise-apps/add-application-portal-setup-sso
https://youtu.be/glZuiP8mjnA?si=_fUsK0PthI7fDYSe