midPoint からActive Directoryにプロビジョニングする（グループ編）

[midPoint by OpenStandia Advent Calendar 2024](https://qiita.com/advent-calendar/2024/midpoint-by-openstandia) の17日目は、[15日目の記事](https://qiita.com/wadahiro/items/d2f5822c8fbb2e883333)で構築したActive Directory（以下、AD）互換環境であるSamba4に対して、グループをプロビジョニングします。

[8日目の記事「midPoint にCSVの源泉データをインポートする（組織編）」](https://qiita.com/wadahiro/items/dc4fe8a20f4e648e01dc)で解説したように、既にmidPointに組織情報を取り込んでいるはずです。今回は、その組織情報をmidPointからADグループ（セキュリティグループ）としてプロビジョニングするように設定を追加します。


:::note info
16日目までの環境を前提としています。
:::

# リソース設定

[16日目の記事「midPoint からActive Directoryにプロビジョニングする（ユーザー編）」](https://qiita.com/wadahiro/private/b5c9fa2d69c5cae0a8b9)で、「AD」リソースは既に作成済みです。このリソース設定に対して、グループプロビジョニングの設定を追加します。

## オブジェクトタイプの追加

作成済みの「AD」リソースの詳細画面より、「スキーマ処理」メニューを開き、グループプロビジョニングのためのオブジェクトタイプの追加を行います。

基本情報の設定画面では、以下を設定します。

- **表示名**：`Group`
- **種類**：`エンタイトルメント`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/7d3487dc-e9b4-8b42-fd20-cc7f233f7488.png)

リソース・データの設定画面では、以下を設定します。

- **オブジェクトクラス**：`group`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/67e7bbae-8467-1577-8e79-9dfeb3e939e6.png)

MidPointデータの設定画面では、以下を設定します。これで「設定を保存」ボタンをクリックして保存します。

- **タイプ**：`組織`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/b598bec2-2377-52a2-dcd5-2f06c95f7aae.png)

## マッピングの設定

マッピング設定画面では、下表を参考にアウトバウンドマッピングを設定します。

| ソース              | 式       | ターゲット       |
|:--------------------|:---------|:----------------|
| name               | スクリプト     | dn         |
| name          | 現状     | sAMAccountName      |
| displayName          | 現状     | displayName      |
| (なし)       | リテラル     | groupType          |

ターゲット`dn`のスクリプト設定は以下のように`name`のオリジナル値よりcnでRDNを構成するようにしておきます。

- **コード**：`basic.composeDnWithSuffix("cn", name.orig, "ou=Groups,ou=IDM,dc=ad,dc=example,dc=com")`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/66f6b569-3658-c42b-deb2-23f31e7e2c21.png)

ターゲット`groupType`については、今回は固定値を設定します。その場合、`リテラル`を選択して、「値を表示する」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/92604a65-80b0-2a37-a64d-19fd9dbac1d0.png)

すると、リテラル値の入力ダイアログが表示されます。「値を追加」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/6c974d2a-668f-d9ea-57b3-f3ead40aedab.png)

入力フィールドが表示されるので、`-2147483646`を設定して「実行」ボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/21a15ee9-9c42-e233-bc1d-26242cecbec2.png)

:::note info
groupType属性には、グループの種類とスコープに応じて設定すべき値がAD側で規定されています。要件に応じて設定する必要があります。今回はグローバルスコープのセキュリティグループとしてプロビジョニングするために、`-2147483646`を設定しています。

- セキュリティグループ
  - グローバル：`-2147483646`
  - ドメインローカル：`-2147483644`
  - ユニバーサル：`-2147483640`
- 配布グループ
  - グローバル：`2`
  - ドメインローカル：`4`
  - ユニバーサル：`8`
:::

そうすると、値が設定されていることを示す表示「Evaluator value is set」に変わります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/05b3c940-c46a-936f-fcb8-eca573bdfa97.png)

最終的に以下の設定となります。「マッピングを保存」ボタンをクリックして保存します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/978179ff-3bca-84c9-ba01-1e0159a2ef54.png)


### 同期の設定

[16日目の記事「midPoint からActive Directoryにプロビジョニングする（ユーザー編）」](https://qiita.com/wadahiro/private/b5c9fa2d69c5cae0a8b9)と同様に、同期の設定をしておきます。

以下の表の内容で設定します。「Unmatched」に対する設定はしないでおきます（安全のため、AD側にだけ存在するグループを削除しないように）。

| 状況       | アクション           | 設定意図                                                                 |
|:-----------|:--------------------|:-------------------------------------------------------------------------|
| Linked     | 同期                 | 既にLinked状態のグループに対して、リコンシリエーションタスクの実行時に差分があれば反映する          |
| Unlinked  | 紐づけ    | 名寄せ処理にて、ADのグループと一致するmidPoint側のデータを発見した場合に、紐づけを行う                         |
| Deleted    | 同期                    | リコンシリエーションタスク実行時にAD側でグループが削除されたことを検知した場合は、再びADにグループをプロビジョニングする   |


### Correlationの設定

[16日目の記事「midPoint からActive Directoryにプロビジョニングする（ユーザー編）」](https://qiita.com/wadahiro/private/b5c9fa2d69c5cae0a8b9)と同様に、名寄せの設定をしておきます。

#### 名寄せ用のインバウンドマッピングの追加

再度マッピングの設定画面を開き、以下の内容でインバウンドマッピングを追加します。

:::note info
今回は簡易のため`cn`を使っていますが、異なるOUにもプロビジョニングを行う場合は、`cn`では一意に名寄せできないケースも想定されるため注意してください。
:::

- **ソース**：`cn`
- **式**：`現状`
- **To resource attribute**：`name`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/bcfaf6ef-57b6-46e1-da53-4ddb183765e0.png)

追加したインバウンドマッピングの詳細画面で、以下の設定を行い名寄せ専用とします。

- **Use for**：`相関`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/c205f2d8-6fe6-e060-24f9-6882df3d9dbc.png)

#### Correlationの設定

Correlationの設定画面を開き、ルールを追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/9da4f6ad-3f6f-b229-830b-f84d2bbc985d.png)

ルールの詳細設定画面を開き、「アイテム」に先ほど追加した名寄せ用のインバウンドマッピングのアイテムである`name`を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/70612758-7802-77fb-eec2-3f004a4c6b4b.png)


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

「AD」リソース設定に「Group」オブジェクトタイプの追加設定ができましたので、プロビジョニングさせてみます。

## リソースアサイン追加によるプロビジョニング

[16日目の記事「midPoint からActive Directoryにプロビジョニングする（ユーザー編）」](https://qiita.com/wadahiro/private/b5c9fa2d69c5cae0a8b9)と同様に、まずは簡易的な確認方法として、リソースを直接アサインして動作確認をします。

[8日目の記事「midPoint にCSVの源泉データをインポートする（組織編）」](https://qiita.com/wadahiro/items/dc4fe8a20f4e648e01dc)でmidPointに取り込んだ適当な組織の詳細画面から「アサイン ＞ リソース」メニューを開きます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/1591e94e-3a78-00c0-a02b-4bcec716df91.png)


アサインの追加操作を行い「オブジェクトの選択」ダイアログを表示します。「AD」リソースにチェックを入れて、「種類」では`エンタイトルメント`、「用途」では`default`を選択して、「追加」ボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/5e424544-dfa2-8460-e608-9f632a1c0220.png)

その後、「変更のプレビュー」ボタンをクリックしてみましょう。リソースの設定が正しければ、ADへのプロビジョニング処理のプレビューが表示されます。「保存」ボタンをクリックして保存します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/9b2690fb-61d7-4e26-c4ae-f894073aa6da.png)

該当組織のプロジェクションを確認しておきます。「AD」リソースのプロジェクションが追加されていることが分かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/c387e7c9-8827-b1ce-2018-760a5f70c46f.png)

DN箇所をクリックしてプロジェクションの詳細画面も確認しておきます（この時、裏でコネクターを通じてLDAP検索が行われます）。以下のように、プロビジョニングされたADグループの属性を確認することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/dec19841-c9e0-11ae-2e00-d185f94e1a45.png)

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

[16日目の記事「midPoint からActive Directoryにプロビジョニングする（ユーザー編）」](https://qiita.com/wadahiro/private/b5c9fa2d69c5cae0a8b9)と同様に、ロールを作成して「AD」リソースとインデュースメントを設定し、組織にはそのロールをアサインすることでプロビジョニングさせることができます。

既に16日目の記事まで読まれた方であれば簡単に設定と動作確認ができるはずなので、ここでは省略します。注意点として、「AD」リソースへのインデュースメントを設定する際に、「種類」には`エンタイトルメント`を指定するくらいです。

## アーキタイプ経由の自動プロビジョニング

[16日目の記事「midPoint からActive Directoryにプロビジョニングする（ユーザー編）」](https://qiita.com/wadahiro/private/b5c9fa2d69c5cae0a8b9)と同様に、アーキタイプにリソースをインデュースメントで設定し、組織がHRシステムよりmidPointに取り込まれたタイミングでプロビジョニングさせることができます。このように設定することで、**組織改正と連動してADのセキュリティグループを作成・更新・削除を自動的に行うことが可能**になります。

:::note info
実際には、組織改正の内容と完全に連動するのではく、セキュリティグループは物理削除せず残す運用をしたり、組織階層のレベルに応じて一定期間（31日間など）は残すといった運用をされるケースが考えられます。このあたりは企業ごとにルールが異なる部分であり、一般的なIDM/IGAプロダクトでは中々対応に苦労する箇所です。midPointの場合は、複雑な組織改正時のルールにも対応できるように、かなりの部分がカスタマイズ可能になっています。
:::

今までの記事では組織に対するアーキタイプは作成していませんでしたので、このタイミングで作成して自動プロビジョニングの設定を追加します。

### アーキタイプの作成

既に[13日目の記事「midPoint のアーキタイプを使用した自動プロビジョニング（Birthright）」](https://qiita.com/wadahiro/items/fdff99cd782c1d0b1557)でアーキタイプの作成と、リソースへの関連付け方法について解説していますので、詳細な手順はそちらを参照してください。

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

HRシステムから取り込む組織データ用のアーキタイプとして、今回は「Company Org」というアーキタイプを定義することにします。アーキタイプの作成画面で、以下のようにします。

- **名前**：`Company Org`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/2769aab2-d0a7-eeaa-06a4-b1125e4be862.png)

「インデュースメント ＞ リソース」メニューを開き、リソースの追加を行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/3e5010fa-5ed8-8eac-00d8-570896898949.png)

「AD」リソースを指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/31a7257c-620a-10f4-d60b-0e52e37d4518.png)

「種類：エンタイトルメント、用途：default」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/9a6e07b8-4192-c42a-33a0-6344f5769b75.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/8090d0a5-d0d1-25d1-2c16-ea64be10668e.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/f319639c-5190-351f-1e91-ceee2a696053.png)

#### Assignment Relationの設定

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

以下の<assignment>〜</assignment>を<archetype>〜</archetype>のどこかに挿入してください。これで「保存」ボタンをクリックして保存します。

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

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

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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/30b93176-7d29-3aa7-18f5-eb018154de78.png)

「基本属性」をクリックしてオブジェクト・タイプの設定ウィザードを開始し、そのまま「MidPointデータ」の設定画面まで進めます。「アーキタイプ」の設定が可能ですので設定します。「選択」ボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/64f0caf3-880c-eda8-c917-54e52aae0f0c.png)

オブジェクトの選択ダイアログが表示されるので、作成したアーキタイプである「Company Org」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/760b1fb4-6222-d3d1-4eea-63c0fc3899dc.png)

アーキタイプが設定された状態になるので、これで「設定を保存」ボタンをクリックして保存します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/5384820e-7c84-deda-a438-50b681277122.png)

### アーキタイプの自動付与による自動プロビジョニングの確認

まだADにグループプロビジョニングしていない適当な組織の詳細画面を開き、「オプション」より「リコンサイル」にチェックを付けて、「変更のプレビュー」ボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/1e97b7c0-e0b4-52fe-d748-d9d6f99c7de3.png)

リコンサイルにより「HR Orgs」リソースに設定したアーキタイプの自動付与が再計算され「Company Org」アーキタイプへのアサインが追加されると同時に、そのアーキタイプに設定したインデュースメント設定に従い、「AD」リソースに対してグループプロビジョニングが発生する予定であることが分かります。「保存」ボタンをクリックします。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/50303c1d-0748-41e6-67cb-e7b40cded833.png)

組織のプロジェクションを確認すると、ADにグループとしてプロビジョニングされていることが分かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/7f181433-818f-686f-cead-32915c6a70b7.png)

### HR recon orgs タスクの実行

最後に、`HR recon orgs`タスクを実行して、残りの組織にも「Company Org」アーキタイプを適用し、「AD」リソースにグループのプロビジョニングを実施しておきます。

`HR recon orgs`タスクの詳細画面を開き、「今すぐ実行」ボタンをクリックして開始します。タスクが「成功」で「終了」で完了したことを確認し、コンソールより`docker compose exec ad bash -c "ldapsearch -D cn=Administrator,cn=Users,dc=ad,dc=example,dc=com -w p@ssw0rd -b ou=Groups,ou=IDM,dc=ad,dc=example,dc=com dn"
`と実行してLDAP検索し、グループがプロビジョニングされたことを確認しておきます。



```console
$ docker compose exec ad bash -c "ldapsearch -D cn=Administrator,cn=Users,dc=ad,dc=example,dc=com -w p@ssw0rd -b ou=Groups,ou=IDM,dc=ad,dc=example,dc=com dn"
# extended LDIF
#
# LDAPv3
# base <ou=Groups,ou=IDM,dc=ad,dc=example,dc=com> with scope subtree
# filter: (objectclass=*)
# requesting: dn
#

# 011, Groups, IDM, ad.example.com
dn: CN=011,OU=Groups,OU=IDM,DC=ad,DC=example,DC=com

# 002, Groups, IDM, ad.example.com
dn: CN=002,OU=Groups,OU=IDM,DC=ad,DC=example,DC=com

# 004, Groups, IDM, ad.example.com
dn: CN=004,OU=Groups,OU=IDM,DC=ad,DC=example,DC=com

# 006, Groups, IDM, ad.example.com
dn: CN=006,OU=Groups,OU=IDM,DC=ad,DC=example,DC=com

# 003, Groups, IDM, ad.example.com
dn: CN=003,OU=Groups,OU=IDM,DC=ad,DC=example,DC=com

# 005, Groups, IDM, ad.example.com
dn: CN=005,OU=Groups,OU=IDM,DC=ad,DC=example,DC=com

# 008, Groups, IDM, ad.example.com
dn: CN=008,OU=Groups,OU=IDM,DC=ad,DC=example,DC=com

# 001, Groups, IDM, ad.example.com
dn: CN=001,OU=Groups,OU=IDM,DC=ad,DC=example,DC=com

# Groups, IDM, ad.example.com
dn: OU=Groups,OU=IDM,DC=ad,DC=example,DC=com

# 010, Groups, IDM, ad.example.com
dn: CN=010,OU=Groups,OU=IDM,DC=ad,DC=example,DC=com

# 007, Groups, IDM, ad.example.com
dn: CN=007,OU=Groups,OU=IDM,DC=ad,DC=example,DC=com

# 009, Groups, IDM, ad.example.com
dn: CN=009,OU=Groups,OU=IDM,DC=ad,DC=example,DC=com

# search result
search: 2
result: 0 Success

# numResponses: 13
# numEntries: 12
```

# まとめ

17日目では、midPointからADへのグループプロビジョニングの設定ついて解説しました。基本的な設定の流れはユーザーと同じなので、既に16日目までを読み進めた方であればサクッと設定、動作確認ができたのではないかと思います。

さて、ここまでADに対して、ユーザーとグループをプロビジョニングしました。しかしこれだけでは、midPointを中心としたエンタイトルメント管理まではまだできておりません。作成したADグループのメンバーには誰も登録されておりません。

次回は、ユーザーとグループのメンバーシップ関係をADにプロビジョニングする部分を解説します。これでようやく、エンタイトルメント管理ができる状態になります。お楽しみに！