midPoint におけるロールベースプロビジョニング

[midPoint by OpenStandia Advent Calendar 2024](https://qiita.com/advent-calendar/2024/midpoint-by-openstandia) の12日目は、ロールベースプロビジョニングを紹介します。[11日目の記事](https://qiita.com/wadahiro/items/2bf1231e62a298483060)では、**プロビジョニング先のリソースをアサイン** というオペレーションをトリガーとして、ユーザーをプロビジョニングしていました。しかしこの方法は、アドホックなプロビジョニングとなり、実際の運用では基本的に使われることはありません。midPoint、そしてIGAの思想としては、システムの利用権限が紐づいた抽象度の高いロールを定義しつつ、必要なユーザーに限定し（可能な限り自動で）ロールをアサインすることでプロビジョニングを行います。いわゆるロールベースプロビジョニングと呼ばれるものです。

というわけで、今回は連携先であるAdressbookへのプロビジョニングと関連付けたロールを作成し、それをユーザーにアサインすることでプロビジョングを行ってみます。

:::note info
11日目までで構築した環境が前提となります。
:::

# ロールの作成

Addressbookへのプロビジョニングと関連付けるロールを新規に作成します。画面左メニューより「ロール ＞ 新規ロール」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/ba402ce1-708e-2628-d3ea-5bf599e0f89e.png)


作成するロールの種類の選択画面が表示されます。今回はシンプルにプレーンなロールを作成して動作を確認しますので、「すべてのロール」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/cdffdba5-4333-0438-ef24-80df5728bf62.png)


## 基本情報の設定

新規ロールの画面が表示されます。基本情報では、必須属性である「名前」のみ入力しておきます。

- **名前**：`Addressbook User`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/b2c33197-ed47-77e4-4f1c-62c62a19759d.png)


## インデュースメントの設定

続けて「インデュースメント ＞ リソース」メニューをクリックして、リソースへのインデュースメント設定画面を開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/6a057209-da3a-6e83-b973-91ad524ddbfe.png)

インデュースメントについては、[3日目の記事「midPoint をデモ環境で試してみよう（その2）」](https://qiita.com/wadahiro/items/df964d32e28f3e3427d8#%E3%83%97%E3%83%AD%E3%83%93%E3%82%B8%E3%83%A7%E3%83%8B%E3%83%B3%E3%82%B0%E3%81%AE%E7%A2%BA%E8%AA%8D)で解説していました。この作成したロールに対して、リソースをアサインではなく、リソースをインデュースメントで設定しておくと、このロールそのものがプロビジョニング対象となるのではなく、このロールをアサインした対象（今回だとユーザー）がプロビジョニング対象となります。ロールを経由して間接的に対象にアサインを適用することから、Indirect Assignment（間接アサイン）とも呼ばれます。

今回はこのロールを経由してユーザーに`Addressbook User`リソースをアサインさせたいため、作成したロールのインデュースメントに`Addressbook User`リソースを設定します。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/4a69a5af-5d8e-2724-e3bf-d2d20997c1a9.png)をクリックすると、リソースへのインデュースメント設定ウィザードが開きます。「アプリケーション・リソース」の選択画面では、`Addressbook Users`リソースをクリックして選択状態にし、「次へ：リソース・オブジェクトタイプ」ボタンをクリックします。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/3cccff56-fafa-e05b-5fa3-99f850dad914.png)

「リソース・オブジェクトタイプ」の選択画面では、「種類：アカウント、用途：default」を選択し、「次へ：エンタイトルメント」ボタンをクリックします。

:::note info
Addressbook Usersリソースではオブジェクトタイプは1つしか定義されていませんが、複数のオブジェクトタイプを扱うリソースの場合は、プロビジョニング対象としたいタイプを選択します。
:::


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/260068f8-1d4d-814b-1b1e-ad88dc6d6c90.png)

「エンタイトルメント」の設定画面は、今回の`Addressbook Users`リソースではエンタイトルメントが存在しないため、何もせず「次へ：マッピング」ボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/4d514ac7-77bf-ee6b-112a-850d17922f63.png)

「マッピング」の設定画面では、このリソースに対する追加のアウトバウンドマッピングを設定することができます（例えば、このロールをアサインした場合だけある属性値を連携するなど）。今回は何も設定しないため、そのまま「設定を保存」ボタンをクリックします（このタイミングでロールが保存されます）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/b9272685-361c-8f73-ac60-a9814c099d86.png)

これでロールの作成は完了です。


# ロールアサインによるプロビジョニング確認

作成したロールをユーザーにアサインしてプロビジョニング動作を確認します。CSVにプロビジョニングさせたいユーザーの詳細画面を開き、「アサイン ＞ ロール」メニューを開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/c931cd28-e0c4-1390-295b-f6ca4b2df21e.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/6f804bd4-ba28-6405-914e-31ba124350e1.png)をクリックして、「オブジェクトの選択」ダイアログを開きます。「Addressbook User」ロールにチェックを付けて選択状態とし、「追加」ボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/74dfd6c7-8aaa-06d3-cc2f-ed8a8f4bc725.png)

アサイン予定として追加されます（緑色の部分）。この状態で「変更のプレビュー」ボタンをクリックしてプレビューでまずは確認してみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/d805cf34-18ee-7f91-5834-86b43d671341.png)

ロールアサインにより、「Addressbook Users」リソースに対してアカウントの作成が行われる予定であることを確認できます。

- 左側の「ユーザーによる変更」：直接の変更内容（今回だと画面操作で実施したロールのアサイン）
- 右側の「ポリシーに従って計算された変更」：直接の変更に伴って実施される追加の変更内容（今回だと「Addressbook Users」リソースへのプロビジョニング）

「保存」ボタンをクリックしてロールのアサインを保存します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/8a496234-6d6e-a2be-e218-59c00d6317b5.png)

プロビジョニング結果を確認します。[11日目の記事](https://qiita.com/wadahiro/items/2bf1231e62a298483060)と同様に、Addressbook用のCSVに該当ユーザーが出力されたことを確認できます。

```csvs:./addressbook/users.csv
userId,familyName,givenName,email,tel,orgId,orgName
1001,山田,太郎,taro.yamada@example.com,111,005,営業第一部
```

# まとめてロールアサインによるプロビジョニング

リソースの直接アサインとは異なり、ロールのアサインの場合は、特定のロールに対してメンバーをまとめてアサインするGUI操作も可能です。

作成したロールの詳細画面を開き、「メンバー」メニューをクリックします。すると現在このロールが直接アサインされているユーザー一覧が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/2b2639cb-934e-b9e8-85ee-3ce31b695908.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/fe34f3d1-7226-1dca-1bde-8d5c8757b731.png)をクリックすると、メンバーに追加するオブジェクトの選択ダイアログが開きます。ロールをアサインしたいユーザーを複数選択し、「追加」ボタンをクリックします。

:::note warn
このメンバー設定画面からのまとめてアサインは、「追加」ボタンをクリックしたタイミングで、**確認画面なしに即座に非同期実行タスクとして実行開始される**ため注意してください。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/44e59b21-3818-f0a4-e754-b0e6710f73ff.png)

画面上部にメンバーを追加開始した旨のメッセージが表示されます。「タスクを表示」をクリックすると、開始されたバックグラウンドタスクの詳細画面に遷移します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/60019ac1-9e7a-781e-f5fd-0ed269291678.png)

「成功」状態で終了していれば、指定したユーザーへのアサインは完了しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/2f29e5fc-6963-2af6-8908-5b1911186976.png)

プロビジョニング結果を確認します。Addressbook用のCSVに該当ユーザーが出力されたことを確認できます。

:::note info
ロールの一括アサインで処理される順番は、midPoint 4.8 では該当ユーザーのoid（midPoint内の各オブジェクトに割り当てられるUUID v4形式の内部ID）順となり、またCSVコネクターは特にソートについては意識せず末尾に追記を行う仕様のため、処理された順番で出力されます。
:::

```csvs:./addressbook/users.csv
userId,familyName,givenName,email,tel,orgId,orgName
1001,山田,太郎,taro.yamada@example.com,111,005,営業第一部
1010,山本,一郎,ichiro.yamamoto@example.com,,009,ITインフラ部
1007,渡辺,翔,sho.watanabe@example.com,,006,営業第二部
1004,高橋,美咲,misaki.takahashi@example.com,,008,IT開発部
1002,佐藤,花子,hanako.sato@example.com,,006,営業第二部
1008,小林,さくら,sakura.kobayashi@example.com,,007,総務部
1003,鈴木,次郎,jiro.suzuki@example.com,,007,総務部
1009,中村,優,yu.nakamura@example.com,,008,IT開発部
1006,伊藤,陽菜,hina.ito@example.com,,005,営業第一部
1005,田中,健一,kenichi.tanaka@example.com,,009,ITインフラ部
```

# midPointにおけるロールのモデル

今回はロールを使ってプロビジョングを行いましたが、実はmidPointではロールだけでなく組織なども、ロールの一種として定義されています。内部的なクラス情報で説明すると、下図のように「AbstractRoleType」と呼ばれるものがあり、そのサブクラスとして「ArchetypeType（アーキタイプ）」「RoleType（ロール）」、「OrgType（組織）」、「ServiceType（サービス）」が存在します。ロールとしての機能は上位の「AbstractRoleType」で規定されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/1ea66d9b-85af-0e93-2f82-1f99599adbab.png)

つまり、アーキタイプや組織、サービスのアサインによってプロビジョングさせることも可能というわけです。例えば、部署を表す組織オブジェクトに対して、今回のようなリソースへのインデュースメントを設定しておくと、特定の部署に所属している（部署がアサインされている）ユーザーにだけ、プロビジョングを行うといった所属組織に応じたプロビジョングも可能になります。


# まとめ

12日目では、ロールアサインによるプロビジョニングについて解説しました。ロールを経由したプロビジョニングとすることで、複数のユーザーをまとめてプロビジョニングもしやすくなります。また、今回はプロビジョニング先が1つのみですが、複数の連携先システムの利用権限を1つのロールに集約することで、効率良く管理することが可能となります。

次回はこの発展版として、アーキタイプを使いつつ、源泉データの取り込みと同時に自動的にプロビジョニングする例を紹介したいと思います。