midpoint の Flexible Authentication (SAML) を試してみる
midpoint の Flexible Authentication について
midpoint4.1からFlexible Authentication の機能が追加されました。
Flexible Authentication は midpoint で様々な認証方式を実現するための機能です。
midpointには以下の認証モジュールが組み込まれており、これらを組み合わせることが可能です。
- フォームログイン
- HTTPヘッダー
- Basic認証
- 秘密の質問
- メールOTP
- LDAP
- SAML(Security Assertion Markup Language)
- OIDC(OpenID Connect)
Flexible Authentication の基本構成について
Flexible Authenticationには3つの構成要素があります。図で表現してみました。
- Authentication Channel(認証チャネル)
- Authentication Sequence(認証シーケンス)
- Authentication Module(認証モジュール)
認証シーケンスは複数の認証モジュールを組み合わせて作成することができます。
認証チャネルというURLサフィックス単位で認証方式(認証シーケンス)を設定することができます。
認証シーケンス内の認証モジュールには現時点でSUFFICIENT(十分)のみが動作します。
v4.5では認証シーケンス内の認証モジュールのどれか1つが成功すると認証完了と判断します。
将来的には以下の3つの条件を組み合わせた認証シーケンスを設定できるように検討されているようです。
- REQUISITE
- REQUIRED
- SUFFICIENT
REQUISITEやREQUIREDが利用できるようになれば、複数の認証方式を強制させることができそうです。
Flexible Authentication の設定について
それでは、midpointに認証シーケンスの作成と認証チャネルへの設定を実施してみます。
これらの設定はSecurity Policyに記載します。
Security Policyのサンプルがあるので、こちらを利用して行きます。
今回はSAMLの認証モジュールを使って、Keycloakで認証を行ってみたいと思います。
1.Keycloakの準備
まずはIdP側の準備をします。Keycloakは8180のポートで起動させます。
midpoint レルムを作成します。
SAMLクライアント(sp_midpoint)の登録をします。
クライアント署名が必須をOFFにし、
有効なリダイレクトURIを
http://localhost:8080/midpoint/auth/default/mySamlSso/SSO/alias/sp_midpoint
と設定します。
アサーション・コンシューマー・サービスのPOSTバインディングURL と ログアウト・サービスのPOSTバインディングURL に以下を設定します。
http://localhost:8080/midpoint/auth/default/mySamlSso/SSO/alias/sp_midpoint
マッパーの設定を以下のように設定し、AttrtibuteStatementのuidにKeycloakのusernameをのせて、midpointに渡す設定します。
テスト用のユーザーも作成しておきます。
2.midpoint の Default Security Policy の設定
続いてmidpoint側の設定をしていきます。
[リポジトリ・オブジェクト]-[すべてのオブジェクト]を選択します。
タイプから[セキュリティ・ポリシー]を選択し、[Default Secutiy Policy]を選択します。
サンプルのセキュリティ・ポリシーを設定し、保存します。
3.midpoint のSAML2認証モジュールの設定
まずは認証モジュールの設定を行います。サンプルの13〜72行目がSAML2認証モジュールの設定になります。
今回は以下のように設定します。
<saml2 id="3">
<name>mySamlSso</name>
<description>My internal enterprise SAML-based SSO system.</description>
<serviceProvider>
<entityId>sp_midpoint</entityId>
<signRequests>false</signRequests>
<identityProvider>
<entityId>http://localhost:8180/auth/realms/midpoint</entityId>
<metadata>
<xml>PG1kOkV〜〜〜〜〜VzY3JpcHRvcj4=</xml>
</metadata>
<linkText>Keycloak</linkText>
<authenticationRequestBinding>urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST</authenticationRequestBinding>
<nameOfUsernameAttribute>uid</nameOfUsernameAttribute>
</identityProvider>
</serviceProvider>
</saml2>
<xml>
タグにはKeycloakのメタデータをBase64でエンコードした値を設定します。
<nameOfUsernameAttribute>
タグにはSAMLのアサーションで渡される属性名を設定します。
4.midpoint の認証チャネルの確認
userの認証チャネルと認証シーケンスの設定がサンプルの84〜106行目に記載があります。
http://localhost:8080/midpoint
のようにパスの設定をしなかった場合はuser認証チャネルとなります。
orderの昇順に認証モジュールが順番に動作します。
以下の場合ですとログインフォームに失敗するとSAML2の認証モジュールが動くようになります。
<module id="12">
<name>mySamlSso</name>
<order>30</order>
<necessity>sufficient</necessity>
</module>
<module id="13">
<name>internalLoginForm</name>
<order>20</order>
<necessity>sufficient</necessity>
</module>
5.midpoint のテスト用ユーザー作成
midpoint側にもテスト用ユーザーを作成します。
テスト用ユーザーにはEnd userロールを割り当て、ログイン可能な状態にします。
6.SAMLの動作確認
midpointのログイン画面(http://localhost:8080/midpoint)にアクセスします。
はじめにログインフォームが表示されるので、何も入力せずに[サインイン]ボタンを押すと、IdPへのリンクの画面が表示されます。
リンクを押下すると以下の認証要求がIdPに対して送られるので、Keycloak側での認証が完了するとmidpointのセルフダッシュボード画面をみることができます。
<saml2p:AuthnRequest xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol"
AssertionConsumerServiceURL="http://localhost:8080/midpoint/auth/default/mySamlSso/SSO/alias/sp_midpoint"
Destination="http://localhost:8180/auth/realms/midpoint/protocol/saml"
ID="ARQ1d92c50-2cde-4002-af71-35d21ed8bee7"
IssueInstant="2022-07-27T16:05:09.914Z"
ProtocolBinding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"
Version="2.0"
>
<saml2:Issuer xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion">sp_midpoint</saml2:Issuer>
</saml2p:AuthnRequest>
※ログアウト関連については、調べていますがまだうまくできていません。
感想
midpoint単体であらゆる認証方式に対応できること、そしてフェデレーションにも対応できることで、よりKeycloakとの連携もしやすくなったと感じました。今度はOIDCについても試してみようと思います。
Discussion