SAML 2.0
SAML(Security Assertion Markup Language)2.0は、当事者間で認証・認可データを交換するためのXMLベースのフレームワークです。Authrimはエンタープライズシステムとの統合のため、Identity Provider(IdP)とService Provider(SP)の両方の役割をサポートします。
概要
- 標準: SAML 2.0 Core Specification
- ステータス: 完全実装
- 役割: IdP(Identity Provider)とSP(Service Provider)
ユースケース
- エンタープライズSSO: エンタープライズ認証システム(AD FS、Okta、Azure AD)と統合
- レガシーアプリケーションサポート: SAMLのみをサポートするアプリケーションと接続
- フェデレーション: 組織間の信頼関係を確立
- 規制遵守: 標準ベースの認証要件を満たす
実装状況
完全実装済み
| 機能 | IdP | SP | 備考 |
|---|---|---|---|
| SSO(シングルサインオン) | Yes | Yes | SP起点とIdP起点 |
| SLO(シングルログアウト) | Yes | Yes | LogoutRequest/LogoutResponse |
| HTTP-POSTバインディング | Yes | Yes | 主要バインディング |
| HTTP-Redirectバインディング | Yes | Yes | Deflate + Base64エンコーディング |
| メタデータ生成 | Yes | Yes | XMLメタデータドキュメント |
| XML署名(RSA-SHA256) | Yes | Yes | 署名と検証 |
| NameIDフォーマット | Yes | Yes | Email、Persistent、Transient |
| 属性マッピング | Yes | Yes | プロバイダーごとに設定可能 |
| セッション統合 | Yes | Yes | SessionStore DO |
| リプレイ保護 | Yes | Yes | SAMLRequestStore DO |
| JITプロビジョニング | - | Yes | 自動ユーザー作成 |
未実装
| 機能 | 理由 |
|---|---|
| アサーション暗号化 | 設計判断:署名のみ |
| アーティファクトバインディング | SOAPバックチャネルの複雑さ |
| ECPプロファイル | モバイル固有;スコープ外 |
エンドポイント
IdPエンドポイント
| エンドポイント | メソッド | 説明 |
|---|---|---|
/saml/idp/metadata | GET | IdPメタデータドキュメント |
/saml/idp/sso | GET/POST | シングルサインオンサービス |
/saml/idp/slo | GET/POST | シングルログアウトサービス |
SPエンドポイント
| エンドポイント | メソッド | 説明 |
|---|---|---|
/saml/sp/metadata | GET | SPメタデータドキュメント |
/saml/sp/acs | POST | アサーションコンシューマーサービス |
/saml/sp/slo | GET/POST | シングルログアウトサービス |
/saml/sp/init | GET | SP起点SSO開始 |
SSOフローの図解
SP起点SSO
- ユーザーがSPの保護されたリソースにアクセス
- SPがAuthnRequestと共にIdPにリダイレクト
- IdPがユーザーを認証(未ログインの場合)
- IdPがアサーション付きSAMLレスポンスを生成
- IdPがSPのACS URLにリダイレクト
- SPがレスポンスを検証しアクセスを許可
IdP起点SSO
- ユーザーがIdPポータルにログイン
- ユーザーがSPアプリケーションを選択
- IdPがアサーション付きSAMLレスポンスを生成
- IdPがSPのACS URLにリダイレクト
- SPがレスポンスを検証しアクセスを許可
実装ガイド
1. SAMLプロバイダーの登録(Admin API)
POST /api/admin/saml/providersAuthorization: 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メタデータを取得:
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/ssoContent-Type: application/x-www-form-urlencoded
SAMLRequest=<base64_encoded>&RelayState=<optional>属性マッピング
Authrimはユーザークレームを SAML属性にマッピング:
| SAML属性 | ユーザークレーム | 例 |
|---|---|---|
email | email | [email protected] |
displayName | name | John Doe |
firstName | given_name | John |
lastName | family_name | Doe |
groups | groups | [“admin”, “users”] |
カスタム属性マッピングはプロバイダーごとに設定できます。
NameIDフォーマット
| フォーマット | URI | 説明 |
|---|---|---|
urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress | メールアドレス | |
| Persistent | urn:oasis:names:tc:SAML:2.0:nameid-format:persistent | 不透明な永続ID |
| Transient | urn:oasis:names:tc:SAML:2.0:nameid-format:transient | 一時識別子 |
| Unspecified | urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified | 任意のフォーマット |
セキュリティ機能
署名検証
すべてのSAMLアサーションはRSA-SHA256で暗号署名されます:
- XMLを正規化
- SignedInfoを作成
- RSA鍵で署名
- Signature要素を追加
リプレイ攻撃防止
- リクエストID追跡: 各AuthnRequest IDを保存
- InResponseTo検証: レスポンスは保存されたリクエストを参照する必要あり
- アサーションID追跡: アサーションIDを保存しリプレイを防止
- 時間検証: NotBefore/NotOnOrAfter条件を強制
- クロックスキュー許容: 60秒の時間差を許容
設定
プロバイダー設定オプション
| フィールド | タイプ | 説明 |
|---|---|---|
name | string | 表示名 |
type | ”sp” | “idp” | プロバイダータイプ |
entity_id | string | SAMLエンティティID |
metadata_url | string | メタデータ取得URL |
acs_url | string | アサーションコンシューマーサービスURL |
slo_url | string | シングルログアウトURL |
name_id_format | string | NameIDフォーマット |
sign_assertions | boolean | SAMLアサーションに署名 |
sign_authn_requests | boolean | 署名付きリクエストを要求 |
attribute_mappings | array | クレームと属性のマッピング |
SAMLステータスコード
| ステータスコード | 説明 |
|---|---|
Success | 認証成功 |
Requester | リクエストエラー(無効な形式) |
Responder | IdPエラー(内部エラー) |
AuthnFailed | 認証失敗 |
RequestDenied | ポリシーによりリクエスト拒否 |
テスト
SAML Tracerでテスト
- SAML Tracerブラウザ拡張機能をインストール
- SSOフローを開始
- SAMLリクエスト/レスポンスを検査
SimpleSAMLphpでテスト
docker run -p 8080:80 \ -e SIMPLESAMLPHP_SP_ENTITY_ID=https://test-sp.example.com \ cirrusid/simplesamlphp制限事項
- 暗号化: アサーション暗号化はサポートなし(署名のみ)
- アーティファクトバインディング: 未実装(HTTP-POSTが大部分のユースケースをカバー)
- SOAPバインディング: サポートなし
- ECPプロファイル: サポートなし