midPointにおける「フルフィルメント（プロビジョニング）」実践編（CSV/LDAPへの出力）

# はじめに
前日[10日目の記事](https://qiita.com/zakiyamac09/private/3258218ceff10e6c21d2)では、midPoint上のフルフィルメント（プロビジョニング）を簡単な実例と共に紹介しました。
midPointアドベントカレンダー11日目となる今回は、CSVとLDAPへのプロビジョニングの手順をより詳しく解説していきたいと思います。


# CSVへのプロビジョニング
## リソース定義の新規作成
画面左のメニューから「リソース」⇒「新規リソース」を選択します。
ここでは、リソース名と利用するコネクターを選択します。今回はCSVへの出力のため、コネクターは「CsvConnector」を選択します。

![Screenshot_2019-11-27 新規リソース.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316808/302fa24c-a685-ff80-d020-f6eb37a1a66e.png)

## 設定
指定したコネクタの詳細設定を行います。ここの設定項目は利用するコネクタ種類によって変わってきます。CSVの設定では、必須項目である「File path」「Unique attribute name」を設定します。「File path」は出力先のCSVのファイルパスを、「Unique attribute name」はCSVで利用する一意の属性名を定義します。

![Screenshot_2019-11-27 新規リソース_設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316808/6160e537-8963-0abd-feee-f56de55cb78e.png)

その他にも設定可能な項目がありますが、必須項目以外では以下を設定します。

|表示名|詳細|設定例|
|---|---|---|
|multivalueDelimiter|マルチバリューを区切る文字の指定|;|
|encoding|エンコード形式を指定|utf-8|
|fieldDelimiter|区切り文字の指定|,|

※ その他の項目については、[こちら](https://wiki.evolveum.com/display/midPoint/CSVFile+Connector+Migration#CSVFileConnectorMigration-ConnectorConfiguration)を参照してください。

設定後、「保存と接続テスト」ボタンを押下して、エラーがなければ次に進みます

## スキーマ（Schema）
出力先に指定したCSVのオブジェクトクラスが表示されます。リソースがLDAPなどの場合はLDAP側で設定されたオブジェクトクラスが表示されます。CSVにはオブジェクトクラスが存在しないため、「AccountObjectClass (Default Account)」のみが表示されます。ここは変更せずに「次」へ進みます。

![Screenshot_2019-11-27 リソース'resource-csv'の編集.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316808/bb695cda-4609-803f-a792-a645ea507b07.png)

## スキーマ処理（Schema handling）
ここでは、midPoint内部DBのカラムとプロビジョニング先の属性（カラム）のマッピングの設定を行います。「オブジェクトタイプの追加」を押下し、設定画面を開いてください。
開いた画面ではオブジェクトタイプを追加します。
必須項目である「オブジェクトクラス」はリソースに合わせて定義されているオブジェクトクラスを指定しますが、今回のCSV連携ではオブジェクトクラスの概念は無いため、「AccountObjectClass」のみを指定します。

![Screenshot_2019-11-28 リソース'resource-csv'の編集.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316808/7d6c0488-282e-20d9-29e8-7220035a6b82.png)

その他の設定項目は以下のように設定します。

|表示名|詳細|設定値|
|---|---|---|
|種類（Kind）|操作するリソースオブジェクトの種類|アカウント|
|用途（Intent）|リソースオブジェクトの意図。今回は種類がアカウントなので、defaultならデフォルトアカウントの意|default|
|属性（Attributes）|後述|後述の表を参照|

※ 各項目の詳細は[こちら](https://wiki.evolveum.com/display/midPoint/Resource+Schema+Handling#ResourceSchemaHandling-TheDefinition)を参照してください。
※ 設定値の詳細については、[こちら](https://wiki.evolveum.com/display/midPoint/Kind%2C+Intent+and+ObjectClass)を参照してください。

### 属性（Attributes）
属性の編集では、リソースのアカウント属性とmidPointのマッピングを設定します。今回はプロビジョニング設定のため、アウトバウンド・マッピングを設定しますが、リソースからアカウントを同期する場合は、インバウンド・マッピングも設定します。

![Screenshot_2019-11-28 リソース'resource-csv'の編集_スキーマ設定1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316808/add0cf70-d255-39b9-9d39-5a3f0fc0608c.png)

|属性名|ソース|
|---|---|
|ri:empno|$focus/name|
|ri:firstname|$focus/givenName|
|ri:lastname|$focus/familyName|

※ マッピングの詳細は[こちら](https://wiki.evolveum.com/display/midPoint/Mapping)を参照してください。

設定例：
![Screenshot_2019-11-28 リソース'resource-csv'の編集_属性設定例.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316808/da4ed61a-143f-354d-687e-2d3e85d08c0b.png)

## 同期（Synchronization）
ここでは、アカウントが作成または削除されたなどの同期イベントが検出された場合に、どのようなリアクションをするかを設定します。「同期オブジェクトの追加」を押下し、設定画面を開いてください。

![Screenshot_2019-12-02 リソース'resource-csv'の編集_同期一覧.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316808/502fcdbf-379e-4e87-fe20-96352ad3a698.png)

開いた画面では、同期設定を行います。入力項目は以下のように設定します。

|表示名|詳細|設定値|
|---|---|---|
|名前（Name）|同期オブジェクトの名称|任意|
|種類（Kind）|操作するリソースオブジェクトの種類|アカウント|
|用途（Intent）|リソースオブジェクトの意図。今回は種類がアカウントなので、defaultならデフォルトアカウントの意|default|
|オブジェクトクラス|現在設定中の定義が適用されるオブジェクトクラスを指定。今回はCSVのため指定は不要|なし|
|フォーカス|リソースオブジェクトに対応するフォーカルタイプを指定。アカウントであればUserTypeを指定|UserType|
|相関（Correlation）|後述|後述のコードを参照|
|リアクション|個々の同期状況にmidPointが、どのように反応するかを設定|後述の表を参照|

※ 各項目の詳細は[こちら](https://wiki.evolveum.com/display/midPoint/Synchronization+Configuration#SynchronizationConfiguration-ObjectSynchronizationDefinition)を参照してください。

### 相関（Correlation）
相関では相関関係式を使用して、新しいアカウントと現行のユーザを結び、オブジェクトの状況を判別します。
相関式と確認式の詳細は[こちら](https://wiki.evolveum.com/display/midPoint/Correlation+and+Confirmation+Expressions)を参照してください。
今回のフィルター句への入力値は以下のようになります。

```
<q:equal xmlns:org="http://midpoint.evolveum.com/xml/ns/public/common/org-3">
    <q:path>employeeNumber</q:path>
    <expression >
        <path>$shadow/attributes/empno</path>
    </expression>
</q:equal>
```

### リアクション
|状況|同期|アクション|
|---|---|---|
|Linked|True|未定義|
|Unlinked|未定義|紐づけ|
|Deleted|未定義|リンクの解除|
|Unmatched|未定義|フォーカスの追加|

※ 各アクションの意味は[こちら](https://wiki.evolveum.com/display/midPoint/Synchronization+Configuration#SynchronizationConfiguration-Built-InActions)を参照してください。

## 能力（Capabilities）
リソースオブジェクトが保持する機能を表示します。変更の必要はないため「完了」を押下し、リソース定義の設定を完了します。


# LDAPへのプロビジョニング
## リソース定義の新規作成
画面左のメニューから「リソース」⇒「新規リソース」を選択します。
ここでは、リソース名と利用するコネクターを指定します。今回はLDAPへの出力のため、コネクターは「LdapConnector」を選択します。

![Screenshot_2019-11-29 リソース'OpenLDAP'の編集.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316808/08285f7f-32a0-9f8a-ca99-82aba4056c4b.png)

## 設定
指定したコネクタの詳細設定を行います。ここの設定項目は利用するコネクタ種類によって変わってきます。LDAPの設定では、以下の項目を設定します。
※ 接続情報は一例なので、環境に合わせた設定をお願いします。

|表示名|詳細|設定例|
|---|---|---|
|Host|LDAPサーバのホスト名またはIPアドレス|localhost|
|Bind DN|LDAPサーバにバインドする際のDN|cn=admin,dc=example,dc=com|
|Bind password|LDAPサーバにバインドする際に使用するパスワード|password|
|Base context|明示的なベースDNが指定されていない場合に使用するベースDN区切り文字の指定|ou=midpoint,dc=example,dc=com|
|Password hash algorithm|サーバーに送信される前に、指定されたアルゴリズムでパスワードをハッシュ|SSHA|
|VLV sort attribute|ページングにVLVが使用され、リクエストで明示的な並べ替え属性が指定されていない場合、結果の並べ替えに使用されるLDAP属性の名前|uid|
|VLV ordering rule|VLV要求で使用するLDAP順序付けルール。 一部のLDAPサーバでは、順序付け規則の明示的な指定が必要|2.5.13.3|
|Operational attributes|運用属性|memberOf<br>createTimestamp|

※ その他の項目については、[こちら](https://wiki.evolveum.com/display/midPoint/LDAP+Connector+Migration#LDAPConnectorMigration-ConnectorConfiguration)を参照してください。

設定後、「保存と接続テスト」ボタンを押下して、エラーがなければ次に進みます

## スキーマ（Schema）
出力先に指定したLDAPのオブジェクトクラスが表示されます。変更の必要はないため「次」へ進みます。

![Screenshot_2019-11-29 リソース'OpenLDAP'の編集_スキーマ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316808/05472997-7d5e-3ab9-b351-278bf15b28c9.png)

## スキーマ処理（Schema handling）
ここでは、midPoint内部DBのカラムとプロビジョニング先の属性（カラム）のマッピングの設定を行います。「オブジェクトタイプの追加」を押下し、設定画面を開いてください。
開いた画面ではオブジェクトタイプを追加します。
必須項目である「オブジェクトクラス」はリソースに合わせて定義されているオブジェクトクラスを指定します。今回のLDAP連携では「inetOrgPerson」のみを指定します。

![Screenshot_2019-11-29 リソース'OpenLDAP'の編集_スキーマ処理.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316808/d2b24671-7b90-4d3b-6e61-d466814d7472.png)

その他の設定項目は以下のように設定します。

|表示名|詳細|設定値|
|---|---|---|
|種類（Kind）|操作するリソースオブジェクトの種類|アカウント|
|用途（Intent）|リソースオブジェクトの意図。今回は種類がアカウントなので、defaultならデフォルトアカウントの意|default|
|属性（Attributes）|後述|後述の表を参照|

※ 各項目の詳細は[こちら](https://wiki.evolveum.com/display/midPoint/Resource+Schema+Handling#ResourceSchemaHandling-TheDefinition)を参照してください。
※ 設定値の詳細については、[こちら](https://wiki.evolveum.com/display/midPoint/Kind%2C+Intent+and+ObjectClass)を参照してください。

### 属性（Attributes）
属性の編集では、リソースのアカウント属性とmidPointのマッピングを設定します。今回はプロビジョニング設定のため、アウトバウンド・マッピングを設定しますが、リソースからアカウントを同期する場合は、インバウンド・マッピングも設定します。

![Screenshot_2019-11-29 リソース'OpenLDAP'の編集_スキーマ処理_属性編集.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316808/d0ae7c53-72c8-f70a-f949-df2dd091f554.png)

|属性名|ソース|
|---|---|
|ri:dn|$focus/name|
|ri:entryUUID|なし|
|ri:cn|$focus/fullName|
|ri:sn|$focus/familyName|
|ri:givenName|$focus/givenName|
|ri:uid|$focus/name|

※ マッピングの詳細は[こちら](https://wiki.evolveum.com/display/midPoint/Mapping)を参照してください。

## 同期（Synchronization）
ここでは、アカウントが作成または削除されたなどの同期イベントが検出された場合に、どのようなリアクションをするかを設定します。「同期オブジェクトの追加」を押下し、設定画面を開いてください。

![Screenshot_2019-12-02 リソース'OpenLDAP'の編集_同期.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316808/650456f9-3bc1-f5b2-cfbf-02cf5541dce4.png)

開いた画面では、同期設定を行います。入力項目は以下のように設定します。

|表示名|詳細|設定値|
|---|---|---|
|名前（Name）|同期オブジェクトの名称|任意|
|種類（Kind）|操作するリソースオブジェクトの種類|アカウント|
|用途（Intent）|リソースオブジェクトの意図。今回は種類がアカウントなので、defaultならデフォルトアカウントの意|default|
|オブジェクトクラス|現在設定中の定義が適用されるオブジェクトクラスを指定|inetOrgPerson|
|フォーカス|リソースオブジェクトに対応するフォーカルタイプを指定。アカウントであればUserTypeを指定|UserType|
|相関（Correlation）|後述|後述のコードを参照|
|リアクション|個々の同期状況にmidPointが、どのように反応するかを設定|後述の表を参照|

※ 各項目の詳細は[こちら](https://wiki.evolveum.com/display/midPoint/Synchronization+Configuration#SynchronizationConfiguration-ObjectSynchronizationDefinition)を参照してください。

### 相関（Correlation）
相関では相関関係式を使用して、新しいアカウントと現行のユーザを結び、オブジェクトの状況を判別します。
相関式と確認式の詳細は[こちら](https://wiki.evolveum.com/display/midPoint/Correlation+and+Confirmation+Expressions)を参照してください。
今回のフィルター句への入力値は以下のようになります。

```
<q:equal xmlns:org="http://midpoint.evolveum.com/xml/ns/public/common/org-3" xmlns="">
    <q:path >c:name</q:path>
    <expression xmlns="">
        <path>$shadow/attributes/uid</path>
    </expression>
</q:equal>
```

### リアクション
|状況|同期|アクション|
|---|---|---|
|Linked|True|未定義|
|Unlinked|未定義|紐づけ|
|Deleted|未定義|フォーカスの削除|
|Unmatched|未定義|フォーカスの追加|

※ 各アクションの意味は[こちら](https://wiki.evolveum.com/display/midPoint/Synchronization+Configuration#SynchronizationConfiguration-Built-InActions)を参照してください。

## 能力（Capabilities）
リソースオブジェクトが保持する機能を表示します。変更の必要はないため「完了」を押下し、リソース定義の設定を完了します。


# サーバータスクの作成
サーバータスクでは、各種同期の設定を行います。様々な同期がありますが、今回は、Live同期、リコンシリエーションを作成します。以下の手順でCSV、LDAP共に作成してください。
同期種別の詳細については、[こちら](https://wiki.evolveum.com/display/midPoint/Synchronization+Flavors)を参照してください。

## Live同期

|項目名|説明|設定値|
|---|---|---|
|タスク名|タスクの名前|任意|
|タイプ|同期タイプの選択|Live同期|
|リソース参照（Resource reference）|どのリソースをタスクの対象とするか|作成したリソース名|
|種類（Kind）|処理するオブジェクトの種類|アカウント|
|用途（Intent）|処理するオブジェクトの用途|default|
|オブジェクトクラス|処理するオブジェクトのクラス|CSVまたはLDAPで指定したオブジェクトクラス|

![Screenshot_2019-11-29 csv_live_sync.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316808/40d30d85-be99-6ee7-cad5-15b99742ad8f.png)

## リコンシリエーション

|項目名|説明|設定値|
|---|---|---|
|タスク名|タスクの名前|任意|
|タイプ|同期タイプの選択|リコンシリエーション|
|リソース参照（Resource reference）|どのリソースをタスクの対象とするか|作成したリソース名|
|種類（Kind）|処理するオブジェクトの種類|アカウント|
|用途（Intent）|処理するオブジェクトの用途|default|
|オブジェクトクラス|処理するオブジェクトのクラス|CSVまたはLDAPで指定したオブジェクトクラス|

![Screenshot_2019-12-02 新しいタスク.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316808/762253b9-cfba-b1d5-ff21-723d417e4248.png)


# プロビジョニングの動作確認
## ユーザの追加とアサイン
プロビジョニングの動作を確認するため、新たにユーザ追加し、リソースへアサインします。
※ここでは簡単な動作検証のため、ユーザに直接リソースをアサインする方式を使用しています。

画面左のメニューから「ユーザー」⇒「新規ユーザー」を選択します。「名前」「氏名」「名」「姓」を入力し、保存します。


![Screenshot_2019-12-09 新規ユーザーを作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316808/b3a9acc9-92bd-4415-2c62-6fb81929f667.png)

「アサイン」タブ⇒「リソース」を選択し、左下の「新規割り当て」を押下します。

![Screenshot_2019-12-09 ユーザー 'test01'の編集_リソース.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316808/0865f89e-ae6f-a14c-ef80-5bba077c57b3.png)

別ウィンドウで表示されたリソースから対象のリソースを選択し、パラメーターの種類に「アカウント」用途に「default」を選択して「追加」を押下します。

![Screenshot_2019-12-09 ユーザー 'test01'の編集_リソースの選択.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316808/1c15ee8b-90c1-d717-ed7f-5c22ce1772fe.png)

リソースを追加が出来ましたら、「保存」を押下します。

![Screenshot_2019-12-09 ユーザー 'test01'の編集_保存.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316808/47c8b930-6a23-c97a-3060-f0f35cc34408.png)


アサインしたユーザ「test01」がCSV・LDAPにプロビジョニングされているかを確認します。前項で作成したLive同期をCSV、LDAP共に実行します。

![Screenshot_2019-12-02 タスク詳細_csv_live.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316808/b096048e-d96e-5fe8-de03-c8eddaeb5ecf.png)


Live同期の実行が完了したら、正常にプロビジョニングされているかを確認します。

![LDAP_ユーザ追加_トリミング.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316808/5e2d15f9-e6d3-47d3-8e51-0e882e4edec8.jpeg)

```resources.csv
empno,firstname,lastname
test01,ユーザ01,テスト
```

## ユーザの更新
アサインしたユーザの変更がCSV・LDAPにプロビジョニングされるかを確認します。
「test01」の「氏名」を「テストユーザ02」、「名」を「ユーザ02」に変更します。

![Screenshot_2019-12-09 ユーザー 'test01'の編集_名称変更.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316808/f3dd04bc-5701-d68d-5e9d-452edf7deffe.png)

ユーザの変更を取得するため、CSV・LDAPのリコンシリエーションタスクを実行します。タスクが実行されると、ユーザの情報が更新されます。

![Screenshot_2019-12-02 タスク詳細_ldap_rec.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316808/facb6910-cd08-05dc-d7ab-0d69e1b9dc26.png)

更新後、以下のようにプロビジョニングされます。

![LDAP_ユーザ変更_トリミング.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316808/c85206f8-42fd-cc74-e2b8-3571bdd7aed3.jpeg)

```resources.csv
empno,firstname,lastname
test01,ユーザ02,テスト
```

## ユーザの削除
最後にユーザを削除し、アサインしたユーザがCSV・LDAP上で削除されるかを確認します。ユーザの一覧から、対象のユーザをチェックし、右の「▼」から削除を選択します。

![FireShot Capture 002 - ユーザー一覧_削除 - idm.example.com.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316808/72e557c6-8162-2610-c7d0-6d2bcd01acc7.jpeg)

ここでもリコンシリエーションタスクを実行します。タスクが実行されると、ユーザの情報が削除されます。

![LDAP_ユーザ削除_トリミング.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316808/bf49afa9-b04e-c633-dd73-c20b590c5517.jpeg)

```resources.csv
empno,firstname,lastname
```


# まとめ
以上が、midPoint上でのプロビジョニング動作の確認となります。今回はアカウントを直接リソースへアサインしていますが、[6日の記事](https://qiita.com/zakiyamac09/items/f95a013a06152248a2b6#%E3%83%AD%E3%83%BC%E3%83%AB%E3%83%99%E3%83%BC%E3%82%B9%E3%83%97%E3%83%AD%E3%83%93%E3%82%B8%E3%83%A7%E3%83%8B%E3%83%B3%E3%82%B0)でご紹介したロールを元に自動でリソースをアサインする方法もございます。RDBへのプロビジョニング方法と合わせて、明日の記事でご紹介する予定ですので、ご期待ください。


# 参考
[midPoint Wiki](https://wiki.evolveum.com/display/midPoint/Home)
※ マニュアルも兼ねたwikiサイト

[GitHub - Evolveum/midpoint](https://github.com/Evolveum/midpoint)
※ ソースコード管理はこちらで行われています