SAML認証について
はじめに
こんにちは、リレーブログ!
今回のテーマはSAML認証です。
セキスペでも頻出の奴ですね(ちょうど令和4年度春試験にも出ていました)。
それでは書いていこうと思います!
SAML認証とは
SAML認証とは文字通りSAML(Security Assertion Markup Language)を使用した認証方式です。SAMLとはIDやパスワードなどの認証情報を安全に交換するためのXML仕様のことで、OASISによって策定されました。
SOAPをベースとしており、複数のドメインにまたがるSSO(シングルサインオン)やID連携に利用されています。
SSOについては以前にもリレーブログのテーマになっていました。
今回はこの記事内にもあるSAML認証について深堀していく形です。
SAMLの形式
まずSAMLでは認証・認可される対象の事をサブジェクトと呼びます。これは人間以外(会社など)も当てはまる場合があります。
またSAMLで扱う情報はアサーションと呼ばれ、サブジェクトに対するステートメントの形式で記述されます。ステートメントは以下の3つです。
- 認証ステートメント:認証の手段や認証された日時などが記述される
- 属性ステートメント:サブジェクトに対する属性情報(名前やクレジットカードの上限など)が記述される
- 認可決定ステートメント:認可情報が記述される
次に示すのはアサーションの一例(のステートメントの部分)です。
<saml:Assertion ID="id0987654321_" IssueInstant="2022-04-23T20:00:12.345Z" Version="2.0"> <saml:AuthnStatement AuthnInstant="2022-04-23T20:00:10.345Z"> <saml:AuthnContext> <saml:AuthnContextClassRef> urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport </saml:AuthnContextClassRef> </saml:AuthnContext> </saml:AuthnStatement> <saml:AttributeStatement> <saml:Attribute Name="FirstName"> <saml:AttributeValue xsi:type="xs:string"> Taro </saml:AttributeValue> </saml:Attribute> </saml:AttributeStatement> <saml:AuthzDecisionStatement Decision="Permit" Resource="https://www.example.com"> <saml:Action> Read </saml:Action> </saml:AuthzDecisionStatement> </saml:Assertion>
上から認証、属性、認可決定ステートメントです。
認証ステートメント(AuthnStatement)
- AuthnInstant:認証が行われた時刻
- AuthnContextClassRef:認証方法を示すAuthnContextClassを識別するURI
上記の場合、2022年4月23日20時00分10秒345に認証されHTTPSでパスワード認証が使われたことを示しています。
属性ステートメント(AttributeStatement)
- Name:属性の名前
- AttributeValue:属性の値
上記の場合、サブジェクトのFirstNameという属性がTaroであることを示しています。
認可決定ステートメント(AuthzDecisionStatement)
- Decision:アクセス要求に対する結果
- Resource:アクセス権限が求められているリソースのURI
- Action:求められているアクション
上記の場合、https://www.example.com に対するReadが認可されたことを示しています。
なおAuthzDecisionStatementはSAML2.0の時点で仕様凍結されています。
代わってより高度で柔軟なアクセス制御が可能なXACML(eXtensible Access Control Markup Language)がOASISによって標準化されています。
これらはアサーション部分を切り出したものです。 実際の認証ではこれらの他にもより多くの情報がやり取りされます。
SAMLによるSSO
SAMLによるSSOではユーザのアカウント情報の管理及び認証を行うIdP(Identity Provider)と、IdPを信頼しユーザにサービスを提供するSP(Service Provider)で構成されます。
IdPとSP間でSAMLRequestとSAMLResponseを送受信するために次のような方法が取られます。
- SOAPバインディング:SOAPでアサーションを送信
- HTTP Redirectバインディング:アサーションをHTTP リダイレクトメッセージで送信
- HTTP POSTバインディング:アサーションをHTTP POSTメソッドで送信
- HTTP Artifactバインディング:ArtifactをHTMLフォームコントロール又はURLのクエリ文字列で送信
Artifactとはアサーションを参照するための値です。アサーションのサイズが大きいことから、アサーションそのものではなくArtifactを用いるようにしたのがHTTP Artifactバインディングです。
次に示すのはSAML2.0によるSSOシステムの認証手順例です。
- ユーザがSPにアクセス要求
- SPはSAMLRequestメッセージを発行してIdPにユーザをリダイレクトさせ認証確認
- 認証済みの場合は5に進む
- ユーザはIdPにIDとパスワードを送信し、IdPは初期認証を実施し成功したら次に進む
- IdPは、アサーションを生成し、ディジタル署名を付したSAMLResponseメッセージを発行してSPにリダイレクトする
- SPはSAMLResponseメッセージのディジタル署名やアサーションの内容を検証する
- 問題がなかった場合、SPはユーザにサービスを提供する。その後、このユーザはIdPとID連携をしている他のSPにも再度認証を受けずにアクセス可能となる
まとめ
簡単にですがSAML認証ついてまとめました。
時間がなくてまとめられませんでしたが、SAML認証のライブラリにも勿論脆弱性はあります(CVE-2021-28091など)。
何にでも言えることですが、ライブラリ等を過信しすぎず脆弱性管理をしっかりしないとインシデントの原因になってしまいます。
あたりまえですけど仕組みをしっかり理解して適切に運用することが大切ですね!
参考文献
Security Assertion Markup Language (SAML) V2.0 Technical Overview
Assertions and Protocols for the OASIS Security Assertion Markup Language (SAML) V2.0
情報処理教科書 情報処理安全確保支援士 2022年版