midPoint をデモ環境で試してみよう（その2）

# はじめに

[midPoint by OpenStandia Advent Calendar 2024](https://qiita.com/advent-calendar/2024/midpoint-by-openstandia) の3日目は、開発元である[Evolveum](http://evolveum.com/)社が提供するmidPointのデモ環境を、[2日目](https://qiita.com/wadahiro/items/7b68b087e6beab1374fd)の記事に引き続き紹介します。デモ環境は以下からアクセスできます。

* デモ環境URL：https://demo.evolveum.com
* デモ環境に関する公式ドキュメント：https://docs.evolveum.com/midpoint/demo/

本記事では、実際にデモ環境を触って、いくつかのユースケースの動きを紹介します。midPoint初心者の方でもイメージしやすいよう、画面キャプチャを交えながら紹介します。

:::note warn
本記事の内容は、2024年12月2日時点のデモ環境に基づいています。デモ環境は今後、midPoint本体のバージョンアップや設定変更に伴い、内容が変更される可能性がありますのでご注意ください。
:::


# デモ環境でできること

デモ環境は初期状態のmidPointではなく、デモ用のユースケースに合わせて各種設定が行われているため、初めてmidPointを使う方でも色々と動作を確認することができます。次のようなユースケースを体験できます。

- 源泉システム（HR）からのユーザー取り込み
- LDAPへのプロビジョニング
- RDBMSへのプロビジョニング
- アクセス要求とワークフロー
- アクセス権の棚卸し
- SoD：Segregation of Duties（職務分掌）
- ...


# デモ環境を使う上での注意点

2日目の記事の再掲ですが、このデモ環境は一般公開されている誰でも利用可能な共用環境ですので、いくつか注意事項があります。

- この環境は毎日（CET：Central European Timeの深夜AM1時頃（日本時間AM9時頃））、元の状態に復元されます
- この環境はすべてのユーザーで共有されているため、他の人の作業を邪魔しないよう、マナーを守って利用する必要があります
- 自身のユーザー、アカウント、ロールなどを作成するようにし、既存のユーザー、ロール、リソースを大幅に変更しないようにと、注意事項に記載があります
- この環境はヨーロッパ地域で稼働しており、日本からのアクセスでは時間がかかる場合があります


# デモ環境へのアクセスとログイン
1. https://demo.evolveum.com にアクセスします
2. 表示されるログインページに「デモ環境のログイン情報」も記載されていますが、以下の情報を使ってシステム管理者としてログインできます
    - **ユーザー名**：`administrator`
    - **パスワード**：`IGA4ever`


# 実際に操作してみよう


## HRシステムにユーザーを追加して取り込み

では実際に、HRシステムにユーザーを1件追加してmidPointに取り込んでみましょう。https://demo.evolveum.com/hr/ にアクセスすると、デモ用HRアプリが開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/206b7862-b910-1ec3-2be0-dc6d4555f170.png)

画面上の「Register user」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/c3038201-cc65-ca75-d13f-7da678e76355.png)

登録画面が開くので、適当なユーザー情報を入力します。「EmpType」には「Full Time Employee」を表す「FTE」を設定しておきます。

:::note warn
デモ環境の設定上、**「First name」「Surname」「Artname」にはマルチバイト文字列を入力しないでください**。この値からmidPointで管理するユーザー名を正規化して自動生成するロジックが設定されているため、日本語などマルチバイト文字を入力するとうまく動作しません[^1]。
加えて **「Artname」** はユーザー名（ログインID）として利用されるため、スペースを含まない値を設定してください。
また、**「Employee number」** には、既存のユーザーと重複しない値を設定してください。

[^1]:midPointのデフォルト設定では、マルチバイト文字を正規化すると空文字（""）となってしまうため注意が必要です。別の記事で別途解説予定ですが、この挙動は[PolyString Normalization Configuration](https://docs.evolveum.com/midpoint/reference/support-4.8/schema/polystring-normalization/)で変更可能です。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/b4b9e48f-0a48-ef0b-4e5a-3bb163212ff0.png)


登録したら、「Export users to csv file」をクリックしてCSVファイルを書き出します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/845aedb0-d521-129b-02a6-50d968cf0c16.png)

midPointの画面からユーザー一覧画面を参照すると、HRに登録したユーザーがすぐに取り込まれています。このデモ環境では、HRのリソースを「Live Synchronization」という種類のタスクで5秒に一度差分同期[^2]するように設定されています。そのため、CSVを書き出すと即座に反映されます。

[^2]:「Live Synchronization」は、前回のタスク実行時〜今回のタスク実行時の差分をリソースから取得してmidPointに反映するタスクです。差分のみを処理するため、処理が軽量という特徴があります。このタスクを扱うには、少なくともコネクターが（リソース側も必要に応じて）そのような差分抽出に対応している必要があります。例えばCSVコネクターの場合は、コネクター内で前回同期実行時のCSVファイルをコピーしておいて、最新のCSVファイルと比較して差分を算出しています。他のリソースの例としてEntra ID場合は、Entra側では[デルタクエリ](https://learn.microsoft.com/ja-jp/graph/delta-query-overview)という差分を抽出するためのAPIを提供しており、[Microsoft Entraコネクター](https://docs.evolveum.com/connectors/connectors/com.evolveum.polygon.connector.msgraphapi.MSGraphConnector/)ではこのAPIを呼び出して差分を取得しています。このように、コネクターと必要に応じてリソース側で差分取得の実装が行われている必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/bf0d97c7-1e1a-24fb-2aeb-46fc7a6d5b6c.png)

:::note warn
もし、取り込まれていない場合は、「サーバー・タスク ＞ Live同期タスク」の「Live Synchronization: HR Resource」タスクを確認してください。CSVファイルが不正なデータの場合、エラーとなって停止している可能性があります。CSVファイルが問題の場合、修正後にこのタスクを再開させてみてください。
:::

## プロビジョニングの確認

登録したユーザーの詳細画面を開き、アサイン一覧を開いてみましょう。ユーザー登録時に「FTE」と設定したため、対応する「Full Time Employee」ロールがこのユーザーに自動的にアサインされています。このように源泉からの取り込みデータの内容にもとづいて、自動的なロールのアサインを行うこともできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/12c504ac-a35d-08fc-375b-f5f639d8f09e.png)

そして、この「Full Time Employee」ロールには、様々な設定が施されています。「Full Time Employee」の箇所がリンクになっているのでクリックすると、そのアサインの詳細画面が開きます。さらに矢印アイコン <img width="24" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/b8ba6f83-fd55-be3e-bae6-8cbc2659a911.png"> をクリックすると、このロールの詳細画面を開くことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/abbcd3d5-8360-1124-ca52-6c9599b5fb03.png)

「Full Time Employee」ロールの詳細画面で、今度は「インデュースメント」メニューを開いていみましょう。「インデュースメント」には、このロールを通じて、アサイン対象（この例ではユーザー）に間接的に適用されるリソースや別のロールが表示されます。聞き慣れない言葉ですが、これは「間接的なアサイン」や「動的なリソースのプロビジョニング」を実現する仕組みです。インデュースメントを使うことで、ロールが持つ特定のルールやリソースが、アサインされた対象に自動的に適用されるよう設定できます。

:::note info
「インデュースメント」を直訳すると「誘導」という意味になります。この言葉の通り、例えば「Full Time Employee」ロールがユーザーにアサインされると、そのロールに設定された「インデュースメント」に基づいて、他のロールやリソースが自動的に「誘導」され、ユーザーに追加適用されます。このように「誘導」のイメージを持つと理解しやすいです。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/b540fd94-980b-d847-e85d-0192203c52b8.png)

この中に、「LDAP Server (OpenLDAP)」が2つあります。データベースのようなアイコンが横にありますが、これはリソースを表しています。つまり、「Full Time Employee」ロールには、「LDAP Server (OpenLDAP)」リソースへのインデュースメントが設定されています。詳細な設定の解説はここでは割愛しますが、片方はLDAPアカウントとしてプロビジョニングするためのインデュースメントであり、もう片方は「cn=employees」というLDAPグループメンバーとして配属させるためのインデュースメントとして事前設定されています。

つまり、「Full Time Employee」ロールをmidPointのユーザーにアサインすると、結果としてLDAPに対してアカウントを作成しつつ、「cn=employees」というLDAPグループにメンバー配属される処理が自動的に行われます。

このユーザーのプロジェクション一覧を開いてみましょう。そうするとHR以外にLDAPのプロジェクションも存在することが分かります。つまり、HRのCSVファイルからmidPointにユーザーとして登録された後に、即座にLDAPにもプロビジョニングが行われています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/027a4095-9c5c-a35d-9dc9-927fc13f36ab.png)

実際にLDAPの状態を参照して、プロビジョニングされているかどうかを確認してみます。https://demo.evolveum.com/ldapadmin/ をブラウザで開くと、WebベースのLDAP管理ツールにアクセスできます。画面左側のツリーから、「ou=people」配下に登録したユーザーエントリが存在するはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/36a75aca-1318-5193-5495-5c94780805bb.png)


続いて、画面左側のツリーから、「ou=groups」配下にある「cn=employees」をクリックしてみましょう。そうすると、このLDAPグループのメンバーに、登録したユーザー（uid=hokusai,ou=people,dc=example,dc=com）が設定されていることが分かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/0bcf02c2-76a0-c5ea-1564-6485b45bc8e9.png)


## 登録したユーザーによるシステム利用

システム利用の前にパスワードを変更します。登録したユーザーには自動生成されたパスワードが登録されているのですが、それを通知する手段まではデモ環境では実装されていません。そのため、ここではシステム管理者からパスワードを強制変更します。

### パスワードの変更

登録したユーザーの詳細画面より、「パスワード」メニューを開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/dded3e09-c8a4-dc4b-46e0-950d9ac7458d.png)

「変更」ボタンをクリックすると入力フィールドが表示されるので、新しいパスワードを設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/04efb942-a658-8b7c-ea34-ca165db95299.png)

「保存」ボタンをクリックしてもよいですが、「変更のプレビュー」ボタンをクリックすると、この変更により何がどう反映されるか確認することができます。画面右上の![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/e496129d-7e48-f0e0-cd61-271744c240bb.png)ボタンをクリックすると、変更内容の詳細を展開表示できます。以下のキャプチャ画像のように、「Addressbook」と「LDAP Server (OpenLDAP)」リソースにパスワード変更が反映される予定であることを確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/eb2bedee-3bbf-ccf9-ce45-3a110dfe59a9.png)

「保存」ボタンをクリックして新しいパスワードを保存します。


### デモWebサイトにアクセス（アクセス許可前）

https://demo.evolveum.com/library/ のデモWebサイトを開きます。このサイトは、LDAPを利用した認証・認可設定が行われており、Basic認証が求められます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/43ca0f3a-3d1f-4d54-4878-ab1d2b8a4952.png)

登録したユーザー名とパスワードを入力しても、再度認証ダイアログが表示され、まだアクセスできません。実はこのWebサイトでは、LDAPグループ **「cn=library,ou=groups,dc=example,dc=com」** に所属するメンバーでないとアクセスできないように認可設定が行われています[^3]。

[^3]:https://github.com/Evolveum/midpoint-kubernetes/blob/2121552a4d48ed82401a6f4d1a759f08a6aa914d/midpoint-live-demo/kustomize-base/renaissance-demo-config/apache/httpd.conf#L281C36-L281C74 で設定されています。

### アクセス権のロールをアサイン

登録したユーザーの詳細画面を開き、「アサイン ＞ ロール」メニューを開きます。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/94e86ea2-d09b-1d64-5794-42de784e0449.png)アイコンをクリックすると、「オブジェクトの選択」ダイアログがポップアップ表示します。ここで「library:access」ロールにチェックを入れて「追加」ボタンをクリックします。このロールが先のWebサイトへのアクセス権に対応しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/28e9edac-efa3-e294-30c8-ba49d85a2ee3.png)

「library:access」ロールが追加予定の状態になっています（まだ保存されていません）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/a4530945-a11a-e1b1-38c9-fc6f592f8fc6.png)

「変更のプレビュー」ボタンをクリックして変更内容を確認します。右上の「高度」をクリックして変更内容を参照すると、このロールアサイン追加により、LDAPグループ「cn=library,ou=groups,dc=example,dc=com」のメンバー追加が行われる予定であることが分かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/9367ae7a-36fd-694b-e485-95263b89291f.png)

「保存」ボタンをクリックして保存します。

### LDAPの確認

https://demo.evolveum.com/ldapadmin/ にアクセスし、「ou=groups」配下の「cn=library」を開きます。「member」に想定通りユーザーが追加されていることを確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/b0982f54-7357-2c18-b00d-e95d0aa16f48.png)

### デモWebサイトにアクセス（アクセス許可後）

https://demo.evolveum.com/library/ のデモWebサイトを再度開きます。今度は認証に成功し、以下のような画面にアクセスできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/4c2830c6-16d1-c96a-1341-c1c445c354ae.png)

:::note warn
認証にまだ失敗する場合は、最初の認証施行から10分ほど経過してから再度アクセスしてみてください。Webサイト側でLDAPの結果をキャッシュする機能が効いているため、その間はまだ失敗します。
:::

## アクセス要求とワークフロー

デモ環境でもロールのアクセス要求のシナリオも試せます。IGAとしては、ユーザーの所属組織や属性情報などから、必要な権限を極力自動的に付与することが望ましいとされています。しかしながら、自動的に権限を付与できないケースも存在します（例えば、プロジェクトといった人事組織には存在しない組織グループへの参加など）。

### アクセス要求

HRに新規登録したユーザーでmidPointにログインします。先ほど強制設定したパスワードでログインできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/617e2cd5-c054-8e8d-93d6-670090b584df.png)

画面左メニューにある「アクセス要求」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/5aebf012-b53e-a84b-090c-044cd5c31f45.png)

アクセス要求のウィザード画面が開きます。「自分自身」を選択して、「次へ：リレーション」ボタンをクリックして進みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/37d5673e-4ced-4d0e-161b-db83b2c2cc5f.png)

「デフォルト」を選択して「次へ：ロールカタログ」ボタンをクリックして進みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/48c5da9b-7f4f-979a-2838-1cc30f16a3c5.png)

要求したいロールの選択画面となるので、「Patron」ロールの「カートに追加」ボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/0670876a-29dc-9fc1-abec-fe6c1036d944.png)

カートに追加後、「次へ：ショッピングカート」ボタンをクリックして先に進みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/dd95668c-4641-82d9-3885-eab74190df9e.png)

申請前の確認画面になります。「要求の送信」ボタンをクリックすると、アクセス要求が出されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/55ec52e6-f9ac-a76f-60af-55bd70ba394a.png)

申請を出すと、ホーム画面に戻ります。ダッシュボード内になる「リクエスト」パネルに、今申請を出したアクセス要求が登録されていることが分かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/2f98684e-1d4c-ce10-0c3e-3cc8385caca2.png)

### ワークフロー

続いて、承認者でログインしてワークフローの承認を行います。要求を出した「Patron」ロールの承認者は「francis」に設定されていますので、このユーザーでmidPointにログインします。`francis` / `IGA4ever`でログインできます。

ログインすると、ホーム画面の「私の作業アイテム」に承認が必要な作業アイテムが登録されていることが分かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/b738709c-a449-5ab7-0d34-8ac0d7d534b0.png)

また、画面左のメニューの「ケース」からも、自分が担当のものが1件あることが分かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/63aabcda-68b1-bcc9-a4b4-ee2f59054b1e.png)

「私の作業アイテム」から名前のリンク箇所をクリックして、その作業アイテムの詳細画面を開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/55823de6-e0f2-d495-d2dd-1fb3001b8bb5.png)

詳細画面から「承認」ボタンをクリックして、ワークフローの承認を行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/99c519fe-cc0a-4da5-1b3d-2afebd4776a0.png)

ワークフロー承認に伴う処理（今回の場合はロールのアサイン）がバックグラウンドタスクとして実行されたことがメッセージで表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/8049f899-7b29-0826-ed13-a8a9ed85561f.png)

### 結果確認

作成したユーザーでログインした状態でホーム画面を表示すると、「私のアクセス権」パネルに「Patron」ロールが追加されていることを確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/ea2a91b0-4bd7-9f5d-5f4b-ad91c84ab0fb.png)

### 監査ログによる確認

midPointが自動的に記録する監査ログでも確認してみましょう。アクセス要求による処理の監査ログとして、以下のように記録されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/54e03fee-0615-3e28-0b20-1a5cf3a116b3.png)

また、承認者による操作の監査ログとして、以下のように記録されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/5053ab3f-8189-56f6-7960-4416befa9409.png)



# その他のユースケースについて

英語にはなりますが、デモ環境に関する公式ドキュメント：https://docs.evolveum.com/midpoint/demo/ があります。こちらの「Walkthrough」セクションでは、他のユースケースの操作についても解説されています。興味のあるシナリオがあれば、是非試してみてください。


# おわりに

midPointのデモ環境を利用することで、特に何も準備することなく、midPointの基本的な操作をお手軽に体験できます。興味を持たれた方は、是非ローカル環境などにもmidPointをインストールして、ご自身のユースケースに合わせたセットアップを行い、より深く触ってみてください。OSSであるmidPointの良いところは、ソフトウェア/サービス利用のコストをかけず、最速でお手軽に試せるところかなと思います。ベンダーとの調整事も不要で、期限もなく自由に試すことができます。次回以降の記事では、ローカル環境へのセットアップ方法も紹介する予定ですので、お楽しみに！

何か質問やフィードバックがあれば、コメントで教えていただければ幸いです。