- SAML(Single Assertion Markup Language) は、XML形式のセキュリティ関連メッセージを交換するためのルールを定義する標準
- 主に3つ以上の独立したエンティティ間でのメッセージ交換に使われる
- 一般的なシナリオは、異なる会社が作った2つのソフトウェアシステムとユーザーが関わるケース
- 2つのシステムはユーザーに関する情報を交換する必要がある
- カスタム統合を行うこともできるが、保守が難しい
- SAMLはシステム間で同じルールに従わせることで、複雑な統合作業を単純化する
SAMLメッセージ形式
- SAMLメッセージはXML形式で構成される
- メッセージの構文を定義し、メッセージ内容を安全に処理する方法を示す
<Response> タグを受け取ったら <Assertion> タグを探すべきであること、などが分かる
- デジタル署名がどのようなものか、またセキュリティ問題を避けるためにメッセージをどう処理すべきかについての指針を提供する
SAMLの柔軟性
- SAMLは柔軟性を重視して設計されている。原則としてSAMLで多くのことができるが、その柔軟性が複雑さにつながる
- SAML仕様には数多くの例外事項があり、多くの if や例示が含まれていて、エッジケースを増やしている
- SAMLは古いため、一部の人々はその柔軟性を活用する
- 実運用環境、特にレガシーシステムでは、SAMLが通常とは異なる動作をすることがある
- ほとんどの場合、SAMLの小さなサブセットだけに集中したほうが楽になる
SAMLの実際の用途
- SAMLは主に Single Sign-On(SSO) に使われる
- SAMLはいくつか変わったタイプのSSOを定義しているが、一般的には Web Browser SSO Profile を使う
- エンドユーザーはまず集中管理されたシステムで認証し、その後、使いたいソフトウェアアプリケーションにアクセスする
- ユーザーはアプリケーションに直接認証するわけではない
- たとえば Okta を使ってメールにアクセスしたことがあるなら、Web Browser SSO Profile を使っていたということ
SSOに関係するエンティティ
- SSOには3つの主体が関わる:
- ユーザー: アプリケーションを使いたい人
- サービスプロバイダー(SP): アプリケーションそのもの
- IDプロバイダー(IDP): ユーザーが認証に使う中央サービス
- 各顧客のIDPはデータベースとみなせる。人に関するデータを追跡している
- 企業はしばしばIDプロバイダーを使って従業員を部署に割り当て、さまざまな権限を付与する
- SAMLでユーザーをログインさせるたびに、IDPから情報を取得する必要がある。SSOでは主にIDPにユーザーIDの確認を求める
- IDPとの事前設定された信頼関係が必要
- SAML SSOを使うすべての顧客は、アプリケーション内で独自の設定が必要
- ただし、IDPと直接メッセージをやり取りするわけではない。SAML SSOでは、サービスプロバイダーとIDプロバイダーはユーザーのブラウザーを介して通信する
SAMLエンティティ間の相互作用の仕組み
- 一般的なSAML SSOプロセス:
- ユーザーがWebブラウザーでアプリケーションの一部にアクセスしようとする
- ユーザーに有効なセキュリティコンテキストがあるか確認する
- ユーザーに有効なセキュリティコンテキストがないため、ログインページを表示する
- ユーザーが何らかの情報(例: メールアドレス)を入力すると、それを適切なログイン方法を決めるために使う
- ユーザーをIDPのWebアドレスへリダイレクトし、ユーザーのブラウザーを通じてSAMLメッセージをIDPに渡す
- IDPはユーザーに資格情報を求めるメッセージを表示する。ユーザーは正常に認証される
- IDPは、ユーザーの認証に関する情報を伝えるSAMLメッセージとともに、ユーザーを再びアプリケーションへリダイレクトする
- SAMLメッセージを処理し、ユーザーに対するセキュリティコンテキストを設定すべきだと判断する
- ユーザーにアプリケーションの目的の部分へのアクセス権を与える
- IDプロバイダー側からSAML SSOプロセスを開始することもできる
- この場合、認証リクエストを送らずに認証レスポンスを受け取ることになる
- SAML SSOサポートを実装する際は、IDP開始のSSOに備える必要がある
SAMLで交換されるメッセージ
- SAML SSOでは主に2種類のメッセージが重要になる
- サービスプロバイダーからIDPへ行くメッセージを SAML リクエスト(request) と呼ぶ
- IDPからサービスプロバイダーへ戻るメッセージを SAML レスポンス(response) と呼ぶ
- SAMLリクエスト自体はそれほど複雑ではない。XMLをHTTPリダイレクトで送れば十分
<AuthnRequest> タグにIDを含めることで、IDPが元のリクエストに対応する <Response> を返せるようにする
<Issuer> タグで包んだデータもIDPに送り、自分が誰なのかを伝える
- SAMLレスポンスはより厄介。通常はPOSTで送信される
<Response> は概念的にはいくつかの <Assertion> タグを包む
<Assertion> は、ユーザーに関するクレーム(誰なのか、IDPでどのように認証したか、など)を包む
- Assertion を処理して、ユーザーをログインさせるかどうかを判断する
注意事項
- ここでは多くの詳細、とくにセキュリティ上重要な内容を省略している
- SAMLに個人的な関心があったり、仕事上深く調べる理由があったりしない限り、SAMLベースのログインを自分で実装することは勧めない。時間の無駄
- SAMLをできるだけ早く設定したいなら、私たちはSAMLを抽象化したオープンソースの SSOReady を提供している。多くの時間と苦労を節約できるはず
まだコメントはありません。