コンテンツにスキップ

SAML 2.0

SAML(Security Assertion Markup Language)2.0は、当事者間で認証・認可データを交換するためのXMLベースのフレームワークです。Authrimはエンタープライズシステムとの統合のため、Identity Provider(IdP)とService Provider(SP)の両方の役割をサポートします。

概要

ユースケース

  • エンタープライズSSO: エンタープライズ認証システム(AD FS、Okta、Azure AD)と統合
  • レガシーアプリケーションサポート: SAMLのみをサポートするアプリケーションと接続
  • フェデレーション: 組織間の信頼関係を確立
  • 規制遵守: 標準ベースの認証要件を満たす

実装状況

完全実装済み

機能IdPSP備考
SSO(シングルサインオン)YesYesSP起点とIdP起点
SLO(シングルログアウト)YesYesLogoutRequest/LogoutResponse
HTTP-POSTバインディングYesYes主要バインディング
HTTP-RedirectバインディングYesYesDeflate + Base64エンコーディング
メタデータ生成YesYesXMLメタデータドキュメント
XML署名(RSA-SHA256)YesYes署名と検証
NameIDフォーマットYesYesEmail、Persistent、Transient
属性マッピングYesYesプロバイダーごとに設定可能
セッション統合YesYesSessionStore DO
リプレイ保護YesYesSAMLRequestStore DO
JITプロビジョニング-Yes自動ユーザー作成

未実装

機能理由
アサーション暗号化設計判断:署名のみ
アーティファクトバインディングSOAPバックチャネルの複雑さ
ECPプロファイルモバイル固有;スコープ外

エンドポイント

IdPエンドポイント

エンドポイントメソッド説明
/saml/idp/metadataGETIdPメタデータドキュメント
/saml/idp/ssoGET/POSTシングルサインオンサービス
/saml/idp/sloGET/POSTシングルログアウトサービス

SPエンドポイント

エンドポイントメソッド説明
/saml/sp/metadataGETSPメタデータドキュメント
/saml/sp/acsPOSTアサーションコンシューマーサービス
/saml/sp/sloGET/POSTシングルログアウトサービス
/saml/sp/initGETSP起点SSO開始

SSOフローの図解

SP起点SSO

  1. ユーザーがSPの保護されたリソースにアクセス
  2. SPがAuthnRequestと共にIdPにリダイレクト
  3. IdPがユーザーを認証(未ログインの場合)
  4. IdPがアサーション付きSAMLレスポンスを生成
  5. IdPがSPのACS URLにリダイレクト
  6. SPがレスポンスを検証しアクセスを許可

IdP起点SSO

  1. ユーザーがIdPポータルにログイン
  2. ユーザーがSPアプリケーションを選択
  3. IdPがアサーション付きSAMLレスポンスを生成
  4. IdPがSPのACS URLにリダイレクト
  5. SPがレスポンスを検証しアクセスを許可

実装ガイド

1. SAMLプロバイダーの登録(Admin API)

Terminal window
POST /api/admin/saml/providers
Authorization: Bearer <admin_token>
Content-Type: application/json
{
"name": "Corporate SSO",
"type": "sp",
"entity_id": "https://sp.corp.example.com",
"metadata_url": "https://sp.corp.example.com/saml/metadata",
"acs_url": "https://sp.corp.example.com/saml/acs",
"slo_url": "https://sp.corp.example.com/saml/slo",
"name_id_format": "urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress",
"sign_assertions": true,
"sign_authn_requests": true,
"attribute_mappings": [
{ "saml_attribute": "email", "user_claim": "email" },
{ "saml_attribute": "displayName", "user_claim": "name" },
{ "saml_attribute": "groups", "user_claim": "groups" }
]
}

2. IdPメタデータの取得

外部SPを設定するには、IdPメタデータを取得:

Terminal window
GET /saml/idp/metadata

以下を含むXMLメタデータを返します:

  • エンティティID
  • SSOエンドポイント(POSTとRedirect)
  • SLOエンドポイント
  • 署名証明書(X.509)

3. 外部SPの設定

メタデータを使用して外部SPを設定:

  • IdPエンティティID
  • SSO URL
  • SLO URL(オプション)
  • 署名検証用IdP証明書

SP起点SSOフロー

SP起点フローの場合、以下にリダイレクト:

GET /saml/idp/sso?SAMLRequest=<base64_deflate_encoded>&RelayState=<optional>

またはPOST:

POST /saml/idp/sso
Content-Type: application/x-www-form-urlencoded
SAMLRequest=<base64_encoded>&RelayState=<optional>

属性マッピング

Authrimはユーザークレームを SAML属性にマッピング:

SAML属性ユーザークレーム
emailemail[email protected]
displayNamenameJohn Doe
firstNamegiven_nameJohn
lastNamefamily_nameDoe
groupsgroups[“admin”, “users”]

カスタム属性マッピングはプロバイダーごとに設定できます。

NameIDフォーマット

フォーマットURI説明
Emailurn:oasis:names:tc:SAML:1.1:nameid-format:emailAddressメールアドレス
Persistenturn:oasis:names:tc:SAML:2.0:nameid-format:persistent不透明な永続ID
Transienturn:oasis:names:tc:SAML:2.0:nameid-format:transient一時識別子
Unspecifiedurn:oasis:names:tc:SAML:1.1:nameid-format:unspecified任意のフォーマット

セキュリティ機能

署名検証

すべてのSAMLアサーションはRSA-SHA256で暗号署名されます:

  1. XMLを正規化
  2. SignedInfoを作成
  3. RSA鍵で署名
  4. Signature要素を追加

リプレイ攻撃防止

  1. リクエストID追跡: 各AuthnRequest IDを保存
  2. InResponseTo検証: レスポンスは保存されたリクエストを参照する必要あり
  3. アサーションID追跡: アサーションIDを保存しリプレイを防止
  4. 時間検証: NotBefore/NotOnOrAfter条件を強制
  5. クロックスキュー許容: 60秒の時間差を許容

設定

プロバイダー設定オプション

フィールドタイプ説明
namestring表示名
type”sp” | “idp”プロバイダータイプ
entity_idstringSAMLエンティティID
metadata_urlstringメタデータ取得URL
acs_urlstringアサーションコンシューマーサービスURL
slo_urlstringシングルログアウトURL
name_id_formatstringNameIDフォーマット
sign_assertionsbooleanSAMLアサーションに署名
sign_authn_requestsboolean署名付きリクエストを要求
attribute_mappingsarrayクレームと属性のマッピング

SAMLステータスコード

ステータスコード説明
Success認証成功
Requesterリクエストエラー(無効な形式)
ResponderIdPエラー(内部エラー)
AuthnFailed認証失敗
RequestDeniedポリシーによりリクエスト拒否

テスト

SAML Tracerでテスト

  1. SAML Tracerブラウザ拡張機能をインストール
  2. SSOフローを開始
  3. SAMLリクエスト/レスポンスを検査

SimpleSAMLphpでテスト

Terminal window
docker run -p 8080:80 \
-e SIMPLESAMLPHP_SP_ENTITY_ID=https://test-sp.example.com \
cirrusid/simplesamlphp

制限事項

  • 暗号化: アサーション暗号化はサポートなし(署名のみ)
  • アーティファクトバインディング: 未実装(HTTP-POSTが大部分のユースケースをカバー)
  • SOAPバインディング: サポートなし
  • ECPプロファイル: サポートなし

参照