SaaS やアプリを SP(Service Provider) として SAML SSO に対応させる際の実装の勘所をまとめます。OIDC に比べ XML 署名の扱いが難所です。
メタデータの交換
SAML は IdP と SP が互いのメタデータ XML を交換することで信頼関係を結びます。
- SP メタデータ:EntityID、ACS(Assertion Consumer Service)URL、署名証明書
- IdP メタデータ:EntityID、SSO URL、IdP の署名証明書
多くの IdP は「メタデータ URL」を提供するので、SP 側はそれを取り込むのが確実です。
ログインの流れ(SP-initiated)
- ユーザーが SP にアクセス → SP が AuthnRequest を生成し IdP へリダイレクト
- IdP が認証(+MFA)
- IdP が SAML Response(アサーション) を SP の ACS に POST
- SP がアサーションを検証してログイン確立
アサーション検証で必須のチェック
ここを省くと認証を迂回されます。
- 署名検証:IdP の証明書でアサーション(と Response)の XML 署名を検証
- Issuer:信頼する IdP の EntityID か
- Audience(Recipient):自分の EntityID/ACS URL 宛か
- 条件(Conditions):
NotBefore/NotOnOrAfterの時刻が有効か - InResponseTo:自分が送った AuthnRequest の ID と一致するか(リプレイ防止)
- 再利用防止:同じアサーション ID を使い回されていないか
XML 署名の落とし穴
SAML は XML Signature Wrapping(XSW) という署名迂回攻撃が知られています。署名対象の要素を取り違えると、攻撃者が細工したアサーションを通してしまいます。
- 対策:自前実装を避け、実績ある SAML ライブラリを使う。検証対象の要素(署名された Assertion 本体)を厳密に特定する。
OIDC との比較
新規開発で選べるなら、XML 署名の複雑さがない OpenID Connect のほうが実装は容易です。既存 SaaS 連携で SAML 必須のケースに SP 実装が必要になります(SAML vs OIDC)。
まとめ
SAML SP 実装の肝は「メタデータで信頼を結ぶ」「アサーションの署名・宛先・時刻・InResponseTo を必ず検証」「自前の XML 署名検証を避ける」。トークン検証一般の注意は JWT検証の落とし穴 も参考になります。