✍️

midpoint の Flexible Authentication (SAML) を試してみる

2022/07/28に公開

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