SAMLとはなにか、OAuthやOpenID Connectと何がちがうのか
結論
- SAMLはSSOやID連携に使われる認証のプロトコルであり、企業のIdPへのログインにより社員が各種ツールにアクセスできるようなSSOを実現するのに使われる。
- OAuthはリソースへのアクセスを制御する認可のプロトコルであり、例えばアプリが電話帳にアクセスする際に使われる。
- OpenID ConnectもSSOに使われる認証のプロトコルであり、OAuthを拡張したもの。あるサービスにログインすればその企業の他のサービスにもアクセスできるようなSSOを實現するのに使われる。
SAMLとは何か
Security Assertion Markup Languageの略称。
OASISによって策定された、異なるインターネットドメイン間でのユーザー認証を実現するXMLベースの標準規格。
SAMLを使うことで、対応するクラウドサービスやアプリケーションでSSOやID連携を可能にする。
また、ユーザーの属性情報なども付与することができるため、例えば企業がクラウドサービス内のどの機能を許可するかなどの認可も行える。
SSOを可能にすることで煩雑なパスワード管理をなくし、推測されやすい危険なパスワードが設定されることを避けられる。
また、企業が社員の認証情報を管理できるという利点もある。
SAMLの仕組み
サービスプロバイダ(SP)を起点とする場合と、アイデンティティプロバイダ(IdP)を起点とする場合の2通りがある。
SPを起点とする場合
- ユーザーがSPにアクセスする
- SPはユーザーに対して認証リクエストを行う
- ユーザーはIdPに認証依頼を行う
- IdPは入力されたID/パスワードでユーザーを認証し、認証トークンを発行する
- ユーザーは認証トークンをSPに渡す
- SPは認証トークンを確認して正規のユーザーであれば認証する
IdPを起点とする場合
- ユーザーはIdPに認証依頼を行う
- IdPは入力されたID/パスワードでユーザーを認証し、認証トークンを発行する
- ユーザーは認証トークンとともにをSPにアクセスする
- SPは認証トークンを確認して正規のユーザーであれば認証する
SSOを実現するための他の仕組み
SAMLやOpenID Connectはフェデレーション方式と呼ばれる。
他にたとえば以下のような方式がある。
- 証明書認証方式
- エージェント方式
- リバースプロキシ方式
詳細は省くが、フェデレーション方式は他に比べてスケーリングしやすそうという印象。
OAuth, OpenID ConnectとSAMLの違い
OAuth2.0はリソースに対する認可を制御するものであるのに対して、 OpenID ConnectやSAMLはフェデレーション認証の業界標準。
つまり、OAuthと、OpenID ConnectおよびSAMLは、使われる状況が異なる。
OAuthは、例えば新しいアプリを使い始めたときに既存の電話帳から連絡先を自動的に取得するみたいなときに使われる。ユーザーが認証情報を共有しなくても、アプリケーションがユーザーに代わってリソースにアクセスできる。これはIdPがユーザーの承認のもとにSPにトークンを発行できるようにすることで実現される。
OpenID ConnectはOAuth2.0をベースに構築されていて、IDトークンと呼ばれる追加のJWTを使用し、OAuth2.0では任意としている部分を標準化している。組織がユーザーを認証することに特化しており、消費者向けWebサイト等でユーザーのログインを可能にするために使われることが多い。例えばGoogleアカウントでYouTubeなどの複数のアプリにサインインできるというようなことに使われる。
SAMLはOAuthとは独立していて、JWTではなくXMLのSAMLフォーマットを使用する。企業ユーザーのSSOを実現するために使われることが多い。例えば企業のイントラネットやIdPにログインした後、SalesforceやBoxなどに認証情報を再入力せずにアクセスできるようになる。
備考
今回、本当は個人のAWSアカウントにSAML認証によってGoogleアカウントでログインするということをやりたかった。
調べてみたところ、それを実現するには有料のGoogle WorkspaceをIdPとして設定する必要があるらしい。
なんで個人ではできないんだろうと思ったが、そもそもSAMLが上記の通り「企業が社員のユーザー認証を管理」
みたいな状況で使われるものだからっぽい。
とりあえず納得。
ちなみにGoogle Workspaceがあれば、AWS SSOを設定することでSAMLログインが可能になる模様。
参考リンク
Discussion