midPoint のアーキタイプを使用した自動プロビジョニング（Birthright）

[midPoint by OpenStandia Advent Calendar 2024](https://qiita.com/advent-calendar/2024/midpoint-by-openstandia) の13日目は、アーキタイプを使用した自動プロビジョニング（Birthright）を解説します。

[12日目の記事](https://qiita.com/wadahiro/private/e192f80e904be1dcf4e8)では、ロールアサインによるプロビジョニングについて解説しました。しかしながらmidPointやIGAの思想では、手動操作を極力排除し、ルールベースでプロビジョニングを自動化することが基本とされています。例えば、HRシステムから取り込んだユーザー（つまり社員）の場合、社内ルールとして利用可能なシステムが決まっているはずです。そのため、それらのシステムに対して自動的にプロビジョニングを行うのが理想的です。

そこで今回の記事では、HRシステムからユーザーを取り込んだタイミングで、AddressbookのCSVに自動的にプロビジョニングするように設定を追加します。その自動化のために、midPointの**アーキタイプ**と呼ばれる機能を使用します。

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

# アーキタイプとは

アーキタイプは、midPointで管理するオブジェクトタイプ（ユーザー、ロール、組織、サービスなど）をカテゴリごとにまとめて、共通する設定やポリシーを適用するためのテンプレート機能です。これにより、例えば「社員」や「派遣社員」など、特定のカテゴリをアーキタイプとして定義し、それに属するオブジェクトに対して必要な権限やルールを自動適用できます。公式ドキュメントでの説明は下記にあります。

https://docs.evolveum.com/midpoint/reference/support-4.8/schema/archetypes/

以下はよく利用されるアーキタイプの例です。

- ユーザー：正社員、派遣社員、ビジネスパートナー、顧客、インターンなど
- 組織：会社、部門、部、課、チーム、プロジェクト、タスクフォースなど
- ロール：ビジネスロール、アプリケーションロール、プロジェクトロールなど
- サービス：アプリケーション、デバイスなど

アーキタイプは要件に合わせて自由に作成することが可能です。

また、重要なポイントとして、[12日目の記事](https://qiita.com/wadahiro/private/e192f80e904be1dcf4e8)でも触れていましたが、アーキタイプはロールの一種として働きます。つまり、アーキタイプをユーザーにアサインすることで間接的にリソースをアサインし、プロビジョニングすることが可能です。

# Birthright

もう1つ重要なポイントとして、アーキタイプは **Birthright** を定義するのにぴったりという点です。IGA界隈ではBirthrightという言葉がよく使われます。そのまま訳すと「生得権」や「生まれながら持つ権利」となりますが、IGA/IDM用に日本語で表現すると「デフォルト権限」といったほうがしっくりくるかもしれません。要は、ユーザーが源泉システムなり画面操作などでIGA/IDMシステムに登録された時から、最初から持っている権限のことです。アーキタイプを使うと以下のことが実現できるため、Birthrightの定義に使えるというわけです。

- 源泉システムからの取り込み時に、リソース設定で自動アサインするアーキタイプの指定が可能
- 画面操作でユーザー作成時に特定のアーキタイプを指定して作成を可能にするUIカスタマイズが可能（例：派遣社員を画面から手動登録するUIを定義すると、そのUIから作成すると自動的に派遣社員アーキタイプがユーザーにアサインされる）
- アーキタイプはロールの一種であり、インデュースメントを設定しておくことでデフォルトの権限を設定可能

というわけで今回は、アーキタイプを新規に作成しつつ、Addressbook Usersリソースにプロビジョニングする設定を紐づけ、HRシステムからの取り込み時に自動的にユーザーにこのアーキタイプをアサインすることで、取り込みと同時にプロビジョニングを行います。


# 準備

最初からユーザーをmidPointに取り込みなおしたいので、以下のどちらかでユーザーを削除したクリーンな状態にします。

- A：midPointの管理画面からユーザーを削除する
- B：`docker compose down -v`で環境を破棄し（`./addressbook/users.csv`はヘッダ行の状態にしておく）、`docker compose up -d`で再構築しつつ、`HR recon orgs`リコンシリエーションタスク[^1]を実行して組織だけ再取り込みしておく

[^1]:[8日目の記事](https://qiita.com/wadahiro/items/dc4fe8a20f4e648e01dc)で作成したタスクです。特に言及していませんでしたが、[5日目の記事で紹介した「Post-Initial Import化」](https://qiita.com/wadahiro/items/a239a743af5404a7325f#post-initial-import%E5%8C%96)がされている想定です。

:::note warn
Aの場合、ユーザーを削除すると該当ユーザーとプロジェクションでリンク済みのリソースからも、データが削除される点に注意してください。特に、連携先だけではなく、源泉システムであるHRシステムからも削除されてしまいますので、`./hr/users.csv`には別途データを入れ直す必要があります。
:::


# アーキタイプの作成

大部分は[12日目の記事](https://qiita.com/wadahiro/private/e192f80e904be1dcf4e8)で実施したロールの場合と同じです。

## アーキタイプの新規作成とリソースへの関連付け

画面左メニューの「アーキタイプ ＞ 新規アーキタイプ」をクリックして、アーキタイプの新規作成画面を開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/7fd1ca81-a427-b94f-039e-08096a885d4e.png)

今回は源泉システムであるHRシステムから取り込んで作成するユーザーには、「Employee」アーキタイプを適用する仕様とします。「基本情報」では以下の設定を行います。

- **名前**：`Employee`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/062ed9bf-55c3-d9bd-7ba8-f9d8cfa53cdc.png)

続けて「インデュースメント ＞ リソース」メニューを開きます。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/5b0d0970-50f8-4ac7-31f6-becc50b4008c.png)をクリックして、リソースのインデュース設定のウィザードを開きます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/fb2c9045-6568-ba22-e5f2-692416720075.png)

アプリケーション・リソースの設定画面では、「Addressbook Users」を選択して次に進みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/ee0e8d13-3935-b75b-161a-79dddd734ec5.png)

リソース・オブジェクトタイプの設定画面では、「権限：アカウント、用途：default」を選択して次に進みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/fe23b581-a230-e256-cd2a-edc224c176ef.png)

エンタイトルメントの設定画面では、特に選ぶものがないためそのまま次に進みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/3fbe4973-0637-3696-d66b-16773f3c7f20.png)

マッピングの設定画面では、特に追加のマッピングはないためそのまま「設定画面を保存」をクリックして保存します（このタイミングでアーキタイプが保存されます）。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/0c905c7e-6a42-5aed-e1ff-6609319f0525.png)


## Assignment Relationの設定

作成したアーキタイプを適用可能（アサイン可能な）なオブジェクトタイプを設定します。ユーザーにEmployeeアーキタイプを適用（アサイン）するため、`UserType`を設定する必要があります。残念ながらmidPoint 4.8では、この設定を行う専用UIは用意していませんので、作成したアーキタイプの詳細画面より、「RAWデータの編集」ボタンをクリックしてRaw更新で設定します。

以下の`<assignment>〜</assignment>`を`<archetype>〜</archetype>`のどこかに挿入してください。

```xml
    <assignment>
        <identifier>holderType</identifier>
        <assignmentRelation>
            <holderType>UserType</holderType>
        </assignmentRelation>
    </assignment>
```

以下のような感じです。これで保存します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/6c1ee396-89af-9e2b-eb9d-a5784a18e154.png)



# HR Usersリソースの設定変更

HR Usersリソースからユーザーが取り込まれた際に作成したアーキタイプをアサインするように、リソース設定を変更します。

HR Usersリソースの詳細画面を開き、「スキーマ処理」メニューから「Account」オブジェクトタイプをクリックして、オブジェクト・タイプのウィザードを開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/2f65aa48-134a-b5ea-95ef-edadb81285c1.png)

「基本属性」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/c6cf8994-1f8a-920a-ac23-24544b733916.png)

基本情報の設定画面はそのままで次に進みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/930ef2d4-3154-a639-7766-6c7ed6ad7daa.png)

リソース・データの設定画面もそのままで次に進みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/2b1463eb-3ee9-3785-1882-84b4ac7da8aa.png)

MidPointデータの設定画面で、「アーキタイプ」の設定が可能ですので設定します。「選択」ボタンをクリックします。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/ddfafe34-1441-b62c-c8c2-39184bcfdfda.png)

「オブジェクトの選択」ダイアログが表示され、設定可能なアーキタイプ一覧が表示されます。先の「Assignment Relationの設定」を実施しておくと、ここで「Employee」が見えるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/04babc94-2b8e-ba05-7732-51db392f9581.png)

`Employee`をクリックすると、ダイアログが閉じてアーキタイプの選択状態になります。これで「設定を保存」ボタンをクリックして保存します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/39094e79-1c11-7017-e37e-3381a6cc5071.png)


# HR import orgs タスクの実行（必要な場合）

ユーザーのインポート時に所属組織が既にmidPointに取り込まれている前提で現状は設定を行っているため、もし組織がまだ未取り込みの場合は、先に`HR recon orgs`リコンシリエーションタスク[^1]を実行して組織をインポートしておきます。

タスクの実行完了後、組織が存在することを確認しておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/2b907b83-87fe-0856-3e51-a7eea4798921.png)


# HR import users タスクの実行

`HR import users`インポートタスクを実行します。設定がうまくされていれば、HRシステムのCSVファイルからユーザーがmidPointに取り込まれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/8f306897-d311-78af-5f6e-ecc9f4bde497.png)

と同時に、AddressbookのCSVファイルを開くと、取り込んだユーザーがプロビジョニングされています。

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

監査ログでも確認しておきます。このように、オブジェクト追加（ユーザーの作成）とリソースの追加（CSVへのユーザーの追加）が行われていることが分かります。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/1e0c5cba-d9e3-6ce3-6030-041963b847a6.png)


# まとめ

13日目の記事では、アーキタイプの作成とその自動適用（アサイン）方法について解説しました。また、アーキタイプはロールの一種でもあり、プロビジョニング用の設定（リソースをインデュースメントで設定）を行うことで、ユーザーのインポートと同時に連携先にプロビジョニングできることを紹介しました。これらの仕組みを利用することで、IGAでよく言われる**Birthright**と呼ばれる、いわゆるユーザーのデフォルト権限を表現することが可能です。

アーキタイプはmidPointでIGAをやっていく際には非常に役に立つ機能ですので、是非使い方をマスターして活用していただければと思います。

次回は、このアーキタイプとも関連する話で、**オブジェクトテンプレート**というmidPointの機能について解説したいと思います。