midPointにおける「エンタイトルメント管理」「ポリシーとロール管理」実践編

# はじめに
midPointアドベントカレンダー7日目は[昨日の記事](https://qiita.com/zakiyamac09/private/f95a013a06152248a2b6)で紹介された「エンタイトルメント管理」「ポリシーとロール管理」について、実際のmidPointでの設定方法をご紹介します。具体的には、ポリシーに基づきロールがユーザに自動でアサインされるように設定をする方法をご紹介します。

また、PeopleレイヤとResourceレイヤの考え方に基づき、リソース(プロビジョニング先システム)のアクセス権限を管理する設定もご紹介します。

ポリシーやロール、Peopleレイヤ、Resourceレイヤなどの詳細は[昨日の記事](https://qiita.com/zakiyamac09/private/f95a013a06152248a2b6)をご参照ください。

今回、midPointは[midPointの公式Docker Hubリポジトリ](https://hub.docker.com/r/evolveum/midpoint/)で公開されているバージョン4.0.1の`evolveum/midpoint:4.0.1`を使用しています。

# ロールのアサインポリシーの設定
midPointにおける、ロールをアサインするためのポリシーの設定方法は、大きく分けて2つあります。

1つ目は、ロール自体にそのロールをアサインする条件を設定する方法です。例えば、「正社員」ロールに対して、この「正社員」ロールをユーザ情報の雇用形態情報が「正社員」となっているユーザに割り当てる、といったポリシーを設定する形になります。

![ロールポリシー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13224/30104dcb-87bc-4241-e5ce-bc6e856814f3.png)

もう一つの方法は、オブジェクトテンプレートを作成する方法です。midPointではユーザや組織、ロール、リソースなどのmidPoint内でデータとして保持するものをオブジェクトと呼びます。オブジェクトテンプレートとは、ユーザなどのオブジェクトの設定に関してのルールを保持するものです。

オブジェクトテンプレートでの設定の場合は、ロールにアサインポリシーを設定する方法に比べ、柔軟な設定ができます。例えば、ユーザの雇用形態情報に格納されている情報と同じ名前のロールをそのユーザにアサインするといったルールでオブジェクトテンプレートを作成します。すると、雇用形態情報が「正社員」となっているユーザには「正社員」ロールを、「インターン」となっているユーザには「インターン」ロールをアサインするといった動作の設定が一括でできます。ロールにアサインポリシーを設定する方法で同様の動作を実現するには、「正社員」ロールと「インターン」ロールのそれぞれに設定を加える必要があります。

![オブジェクトテンプレートポリシー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13224/2cce5f37-f5b9-9f26-447d-9154ceda2f02.png)

本記事では両方の設定方法を説明していきます。

## ロール自体にアサインポリシーを設定する
ここから、具体的な設定方法を説明していきます。まずは、ロールにアサインポリシーを設定する方法です。

### 自動アサインの有効化

ロールのアサインポリシーでの自動アサインには、システム設定の自動アサインを有効にする必要があります。`ロール管理`(システム > ロール管理)の`自動アサインが有効`を`True`とすることで、自動アサインが有効となります。

![1-1自動アサイン有効化.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13224/50c93797-eee6-def9-eba9-cb2692969ca8.png)

### ロールの作成とポリシー設定
次に、ポリシーを設定するロールを作成します。今回は`employee`というロールを作成します。

![1-2employeeロール作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13224/2ffeef7a-0d79-5397-7afa-2e0fb9baacb6.png)

作成したロールにポリシーを設定します。この設定は、「RAWデータの編集」と呼ばれるロール定義のXMLを直接編集する方法で設定します。先程作成した`employee`ロールの画面の右下の「RAWデータの編集」を押下します。

![1-3employeeRAWデータの編集.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13224/0b53d628-91cc-b632-7a04-c9cbb42370db.png)

編集エディタにて、`role`タグ内に以下の定義を追加します。

![1-4employeeロールにポリシーを追加.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13224/7036e6ba-b737-c776-04cd-f6080f52d8d5.png)

``` xml:自動アサイン設定
    <autoassign>
        <enabled>true</enabled>
        <focus>
            <mapping>
                <source>
                    <path>subtype</path>
                </source>
                <condition>
                    <script>
                        <code>subtype == 'employee'</code>
                    </script>
                </condition>
            </mapping>
        </focus>
    </autoassign>
```

今回はサブタイプ属性を雇用形態情報の属性として利用することにしています。`employee`ロールに、サブタイプが `employee`となっているユーザへ`employee`ロール自身をアサインするという設定を追加した形となります。

### 動作確認

動作確認のため、サブタイプを`employee`としたユーザを作成してみます。

![1-5employeeユーザ作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13224/ccdab8a3-fdf7-7b0d-041f-81b4fd31437b.png)

保存後、作成したユーザの詳細画面に行くと、`employee`ロールが自動でアサインされていることが確認できます。

![1-6employeeロールアサイン確認.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13224/f4ab2b28-3cbb-4efb-0e92-38892e1054f3.png)

なお、サブタイプの値が`employee`以外になると自動的に`employee`ロールのアサインも外れます。

## アサインポリシーを設定したオブジェクトテンプレートを作成する

次に、オブジェクトテンプレートでロールのポリシーを設定する方法です。

### ポリシーを設定したオブジェクトテンプレートの作成

オブジェクトテンプレートでアサインポリシーを設定する場合は、まずオブジェクトテンプレートを作成します。

オブジェクトテンプレートは「オブジェクトのインポート」から、「組み込みエディター」を選択し、下記のXMLをインポートすることで作成してください。

![2-1オブジェクトテンプレート作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13224/2f7077d6-faea-8ebd-361f-50b432b89a82.png)

``` xml:ロール自動アサインオブジェクトテンプレート
<objectTemplate>
    <name>User Template</name>
    <mapping>
        <authoritative>true</authoritative>
        <source>
            <path>subtype</path>
        </source>
        <expression>
            <assignmentTargetSearch>
                <targetType>RoleType</targetType>
                <filter>
                    <equal>
                        <path>name</path>
                        <expression>
                            <path>$subtype</path>
                        </expression>
                    </equal>
                </filter>
            </assignmentTargetSearch>
        </expression>
        <target>
            <path>assignment</path>
        </target>
    </mapping>
</objectTemplate>
```

このXMLは、User Templateという名前のオブジェクトテンプレートで、サブタイプと同じ名前のロールがある場合にそのロールをアサインするという設定がされた状態です。

### オブジェクトテンプレートの適用

次にこのオブジェクトテンプレートをユーザオブジェクトに適用する設定をします。`オブジェクトポリシー`(システム > オブジェクトポリシー)を下記の設定で新規作成します。

- 「オブジェクト・テンプレート参照」: 先ほど作成した`User Template`
- 「タイプ」: ユーザー

![2-2オブジェクトポリシー設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13224/a6f036d5-0233-3b67-46c8-228c95fa2db4.png)

これで設定は完了です。

### 動作確認

オブジェクトテンプレートの適用まで完了すると、ユーザのサブタイプにロール名を指定することで、指定したロールがアサインされます。

以下は`intern`という名前のロールを新規に作成し、サブタイプを`intern`としたユーザを作成した際に`intern`ロールがアサインされていることを確認した結果となります。

![2-3インターンアサイン確認.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13224/3cf46c7d-c0f4-9dd4-12ca-fe104c5b8ca5.png)

なお、サブタイプが変更されると、ロールのアサインも自動で対応するものに変更されます。

## ロールでの設定とオブジェクトテンプレートでの設定

今回ご紹介した2つの設定方法について、[ロールのアサインポリシーの設定](https://qiita.com/n1330/private/4ffd7144369eb2d6df73#ロールのアサインポリシーの設定)のはじめで、オブジェクトテンプレートで設定する方法のほうが柔軟性がある点に触れていました。その他に、性能の面でもオブジェクトテンプレートでの設定の方が有利です。[公式のガイド](https://wiki.evolveum.com/display/midPoint/Role+Autoassignment)でも、ロールにアサインポリシーを設定する方法では数十ロールまでは問題ないがそれを超えるとパフォーマンスに影響が出てくるといった旨が記載されています。

本格的な運用を見据えると、オブジェクトテンプレートで設定する方がおすすめできるかと思います。


# PeopleレイヤとResourceレイヤ

[昨日の記事](https://qiita.com/zakiyamac09/private/f95a013a06152248a2b6)で説明されている通り、ロールはPeopleレイヤとResourceレイヤに分けて階層的に管理することが推奨されています。[ロールのアサインポリシーの設定](https://qiita.com/n1330/private/4ffd7144369eb2d6df73#%E3%83%AD%E3%83%BC%E3%83%AB%E3%81%AE%E3%82%A2%E3%82%B5%E3%82%A4%E3%83%B3%E3%83%9D%E3%83%AA%E3%82%B7%E3%83%BC%E3%81%AE%E8%A8%AD%E5%AE%9A)の中で作成しユーザにアサインした雇用形態を表すロールはPeopleレイヤに分類することができます。

ここでは、リソースのアクセス権限を表すResourceレイヤのロールを設定し、そのリソースへのアクセスを許可する雇用形態に対して、そのロールを紐付けます。これにより、間接的にリソースの権限をユーザに割り当てます。今回はリソースとしてmidPoint自体を対象に説明していきます。

![people-resource.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13224/7fa9024f-74b4-4ad9-3fb3-32343a490f02.png)

## Resourceレイヤロールの設定
### リソースへの権限を指定したResourceレイヤロールの作成

まず、Resourceレイヤのロールとして`idm-user`というロールを作成します。

![3-1idm-user.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13224/d95d8e26-d866-1d7c-1409-4a393fed42ec.png)

次に、作成した`idm-user`に、midPointにデフォルトで用意されている一般ユーザ用のロールの`End user`ロールをインデュースメントします。

![3-2enduserインデュースメント.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13224/d9f6249f-ee6a-d8be-a51c-83330495823c.png)

インデュースメントとはロール等を多段に紐付ける仕組みの一つで、大元のロールがアサインされているオブジェクト(ユーザ等)に多段に紐付けられたロール等が関節的にアサインされる設定となります(参考: [Assignment vs Inducement \- midPoint \- Evolveum Confluence](https://wiki.evolveum.com/display/midPoint/Assignment+vs+Inducement))。

midPointでは、このインデュースメントやアサインを多段に設定することで、PeopleレイヤとResourceレイヤといったロールの階層管理が実現できます。

上記のインデュースメント設定で、midPointへのアクセス権限を設定したResourceレイヤのロールが完成しました。この時点では、まだユーザにこのロールを紐付けていないため、ユーザはmidPointへログインすることができません。試しに、[ロールのアサインポリシーの設定](https://qiita.com/n1330/private/4ffd7144369eb2d6df73#%E3%83%AD%E3%83%BC%E3%83%AB%E3%81%AE%E3%82%A2%E3%82%B5%E3%82%A4%E3%83%B3%E3%83%9D%E3%83%AA%E3%82%B7%E3%83%BC%E3%81%AE%E8%A8%AD%E5%AE%9A)で作成した`test`ユーザにパスワードを設定しログインしてみると下記のようにエラーとなります。

![3-3testpassword.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13224/38021b83-c09c-ea64-ab11-9c300d75f0fa.png)

![3-4アクセス拒否.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13224/0d280a3c-74c1-1c5f-2a9b-7542119c353b.png)

### PeopleレイヤへのResouceレイヤの指定

今回は`employee`ロールを持つユーザにはmidPointのアクセスを許可することにします。`employee`ロールの設定にて`idm-user`ロールをインデュースメントします。

![3-5employe-idmuser.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13224/c7d87d6f-c9ec-a0be-9911-2f8408a91b36.png)

これで、`employee`ロールを持つ`test`ユーザもmidPointへのアクセス権限を得た形になります。再度`test`ユーザでログインすると、今度は問題なく`End user`権限でログインできることが確認できます。

![3-6testユーザログイン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13224/d9b86f3b-2f99-26fc-5a12-09835a80641b.png)

# おわりに

今回は、midPointでのロールやポリシーの設定をご紹介しました。midPointでは、アサインやインデュースメントによりロールを柔軟に管理する仕組みや、アサインポリシーに従いロールを自動でアサインする機能を提供しており、「エンタイトルメント管理」「ポリシーとロール管理」といったIDの権限管理を十分に実現できます。

なお、Resourceレイヤのロールの設定に関して、本記事ではResourceレイヤのロールにmidPointの権限ロールを紐付けていますが、リソースを指定することで、そのロールを持つユーザを、指定されたリソースにプロビジョニングするといった設定ができます。プロビジョニング(フルフィルメント)については本アドベントカレンダーの10日目から12日目で紹介される予定です。

また、[Entitlements](https://wiki.evolveum.com/display/midPoint/Entitlements)という仕組みを使うことで、プロビジョニングするかしないかだけではなく、権限情報をプロビジョニングすることも可能です。例えば、LDAPへのプロビジョニングで、midPointで管理している権限をLDAPグループの所属情報として連携するといったことができます。

# 参考

[Role Autoassignment \- midPoint \- Evolveum Confluence](https://wiki.evolveum.com/display/midPoint/Role+Autoassignment)
[Role Autoassign Configuration \- midPoint \- Evolveum Confluence](https://wiki.evolveum.com/display/midPoint/Role+Autoassign+Configuration)
[Roles, Metaroles and Generic Synchronization \- midPoint \- Evolveum Confluence](https://wiki.evolveum.com/display/midPoint/Roles%2C+Metaroles+and+Generic+Synchronization)
[Assignment vs Inducement \- midPoint \- Evolveum Confluence](https://wiki.evolveum.com/display/midPoint/Assignment+vs+Inducement)
[Entitlements \- midPoint \- Evolveum Confluence](https://wiki.evolveum.com/display/midPoint/Entitlements)