【MarkLogic Server】MarkLogicでドキュメントにアクセス権限を設定する方法

はじめに
========

MarkLogicでドキュメントに対して参照や更新などの操作を制限したユーザを作成したい場合があります。
本記事ではユーザにドキュメントのアクセス権限を設定する方法について紹介します。

MarkLogicのドキュメントアクセス制御の概要
====

MarkLogicはドキュメントを登録すると、登録したユーザ以外はアクセスできません（Adminなどの管理権限は除く）。
あるユーザが登録したドキュメントに対して、他のユーザがアクセスできるようにするためにアクセス権限を設定する方法について記載します。

MarkLogicはドキュメントへのアクセスやクエリ実行などで行われる認可の制御をロール単位で行っています。
ドキュメントへのアクセス権限があるロールをユーザに割り当てることで、ユーザはドキュメントのアクセスが可能となります。

実施内容
====

ドキュメントに対してアクセス権限を設定する方法を記載します。
今回は参照権限を設定してみます。
※同様の手順で登録や更新の権限も設定できます。

実施内容は以下の通りです。

* １．Admin権限のユーザでドキュメントを登録
* ２．ロールを作成
* ３．ユーザを作成
* ４．ドキュメントが参照できないことを確認
* ５．ドキュメントに参照権限を設定
* ６．ドキュメントが参照できることを確認

| 対象MarkLogicバージョン | 対象OS・バージョン |
|---|---|
|8.0-4|Red Hat Enterprise Linux 7.3|

### １．Admin権限のユーザでドキュメントを登録

Admin権限があるユーザでドキュメントを登録します。
ドキュメントを登録する方法は色々ありますが、今回はクエリコンソール画面より登録します。
Admin権限のユーザでクエリコンソール画面にアクセスし、xdmp:document-insertを利用しドキュメントを登録します。
ここではドキュメント名をtestDocument.xmlにします。

![CreateDocument_1.png](https://qiita-image-store.s3.amazonaws.com/0/188643/775cd69c-50d2-d722-c096-3501b5a3703c.png)

### ２．ロールを作成

新規にロールを作成します。

#### １．管理画面よりSecurity→Roles→Createタブに遷移

![createRole_1](https://qiita-image-store.s3.amazonaws.com/0/188643/b1f8fd32-7a6d-0012-2f88-699d0019cd02.png)

#### ２．任意のロール名と「qconsole-user」にチェックを入れ「OK」ボタンを押下

ここではロール名をDocumentReadOnlyRoleに設定します。
なお、今回ドキュメントの確認はクエリコンソール画面上で行うため、クエリコンソール画面へアクセス可能にするqconsole-userロールを設定しておきます。

![createRole_2.png](https://qiita-image-store.s3.amazonaws.com/0/188643/dfac334b-71da-0876-0a38-bed9394db851.png)

![createRole_3](https://qiita-image-store.s3.amazonaws.com/0/188643/01c1bc24-df50-93b7-ddc3-a3c2f921c230.png)

「OK」ボタンを押下すると、Security→Roles→Summaryタブに作成したロールが表示されます。

![createRole_4.png](https://qiita-image-store.s3.amazonaws.com/0/188643/3ebb137e-46bf-a8d8-089a-d16df4ae6f5c.png)

### ３．ユーザを作成

新規にユーザを作成します。

#### １．管理画面よりSecurity→Users→Createタブに遷移

![createUser_1](https://qiita-image-store.s3.amazonaws.com/0/188643/18e0b175-133e-5cd9-f237-0c833fdccaca.png)

#### ２．任意のユーザ名、パスワード、パスワード（確認）を入力。作成したロールにチェックを入れ「OK」ボタンを押下

ここではユーザ名をDocumentReadOnlyUserにします。

![createUser_2.png](https://qiita-image-store.s3.amazonaws.com/0/188643/5bfeee3d-cbd6-3a49-248e-4fcf0c4f7e30.png)

![createUser_3.png](https://qiita-image-store.s3.amazonaws.com/0/188643/8da74eb0-01c0-024d-0c50-6599af174a69.png)

「OK」ボタンを押下すると、Security→Users→Summaryタブに作成したユーザが表示されます。

![createUser_4.png](https://qiita-image-store.s3.amazonaws.com/0/188643/1d792061-883f-b516-b836-5311aa9ad25b.png)

### ４．ドキュメントが参照できないことを確認

fn:doc関数を実行しドキュメント参照できないことを確認します。

![createUser_5.png](https://qiita-image-store.s3.amazonaws.com/0/188643/18d35633-2eae-4d79-d5b9-452d2355632f.png)


### ５．ドキュメントに参照権限を設定

Admin権限があるユーザでクエリコンソール画面にアクセスします。
以下の関数いずれかを実行し、対象ドキュメントに参照権限を設定します。

* xdmp:document-set-permissions
	関数の詳細はMarkLogic社のサイト（[https://docs.marklogic.com/8.0/xdmp:document-set-permissions](https://docs.marklogic.com/8.0/xdmp:document-set-permissions)）を参照

* xdmp:document-add-permissions
	関数の詳細はMarkLogic社のサイト（[https://docs.marklogic.com/8.0/xdmp:document-add-permissions](https://docs.marklogic.com/8.0/xdmp:document-add-permissions)）を参照
	
例： DocumentReadOnlyRoleにtestDocument.xmlの参照権限を与える場合

```
xdmp:document-set-permissions("/testDocument.xml", xdmp:permission("DocumentReadOnlyRole", "read"))
```

または

```
xdmp:document-add-permissions("/testDocument.xml", xdmp:permission("DocumentReadOnlyRole", "read"))
```

参照権限の変更のためxdmp:permissionの第二引数をreadに設定していますが、updateやinsertに変更することで更新権限や作成権限を設定できます。

以上で参照権限の設定が完了します。

### ６．ドキュメントが参照できることを確認

fn:doc関数を実行しドキュメント参照できることを確認します。

![checkDocument3.png](https://qiita-image-store.s3.amazonaws.com/0/188643/fa4adcbd-cb41-234a-215f-50c14009af70.png)

その他のアクセス権限設定方法
=====

今回は登録済みのドキュメントに対してアクセス権限を設定する方法を紹介しましたが、ドキュメント登録時に権限を設定する方法も可能です。
ドキュメント登録時に権限を設定させる方法は、以下の方法があります。

* XQueryで「xdmp:document-insert」を利用しアクセス権限を設定する方法
* MLCPでデータロードする時にアクセス権限を設定する方法
* ロールのdefault permissionsでアクセス権限を設定する方法

それぞれ以下の方法で実現できます。

* XQueryで「xdmp:document-insert」を利用しアクセス権限を設定する方法

```
(: xdmp:document-insertの第3引数で権限設定を行う :)
xdmp:document-insert(
                     "/testDocument2.xml",
                     <root><data>67890</data></root>,
                     (: DocumentReadOnlyRoleにアクセス権限を設定 :)
                     (xdmp:permission("DocumentReadOnlyRole", "read"),
                      xdmp:permission("DocumentReadOnlyRole", "update"),
                      ･･･
                      )
                    )
```

* MLCPでデータロードする時にアクセス権限を設定する方法

```
MLCPの実行オプションに以下を追加
-output_permissions DocumentReadOnlyRole,read
```

* ロールのdefault permissionsでアクセス権限を設定する方法

default permissionsを設定することで、ドキュメント登録時に自動的にアクセス権限を設定してくれます。
default permissionsは以下の方法で設定することができます。

```
１．管理画面よりSecurity→Roles→[対象のロール]に遷移
２．default permissionsよりロールと権限を選択し「OK」ボタンを押下
```

補足 ～MarkLogicの実行権限について～
========

今回はドキュメントのアクセス権限の設定方法を紹介しました。
今回の手順ではクエリコンソール画面上でドキュメントを確認するためqconsole-userのロールを割り当てました。
XQueryやREST APIなどクエリコンソール以外の方法でドキュメントにアクセスする場合は、アクセス方法に応じて実行権限を割り当てる必要があります。

MarkLogicが搭載している様々な機能を利用するためには、その機能に応じた実行権限を設定する必要があります。
今回紹介できなかった実行権限については機会があれば紹介したいと思います。

おわりに
========

ユーザに設定されているロールをしっかり把握し、適切にドキュメントのアクセス権限を管理しましょう。

参考文献
========

* "Introduction to Security (Security Guide) — MarkLogic 8 Product Documentation".MarkLogic Developer Community.[https://docs.marklogic.com/8.0/guide/security/intro](https://docs.marklogic.com/8.0/guide/security/intro),（参照 2017-09-28）
* "Protecting Documents (Understanding and Using Security Guide) — MarkLogic 8 Product Documentation".MarkLogic Developer Community.[https://docs.marklogic.com/8.0/guide/security/permissions#id_85471](https://docs.marklogic.com/8.0/guide/security/permissions#id_85471),（参照 2017-09-28）
* "Administering Query Console (Query Console User Guide) — MarkLogic 8 Product Documentation".MarkLogic Developer Community.[https://docs.marklogic.com/8.0/guide/qconsole/admin](https://docs.marklogic.com/8.0/guide/qconsole/admin),（参照 2017-09-28)
* "Importing Content Into MarkLogic Server (mlcp User Guide) — MarkLogic 8 Product Documentation".MarkLogic Developer Community.[https://docs.marklogic.com/8.0/guide/mlcp/import#id_23879](https://docs.marklogic.com/8.0/guide/mlcp/import#id_23879),（参照 2017-09-28）

```math
\def\textsmall#1{%
  {\rm\scriptsize #1}
}
```

------------------------------------------------------------------------

**免責事項**

​​​​​$\textsmall{当ユーザ会は本文書及びその内容に関して、いかなる保証もするものではありません。}$
​​​​​$\textsmall{万一、本文書の内容に誤りがあった場合でも当ユーザ会は一切責任を負いかねます。}$
​​​​​$\textsmall{また、本文書に記載されている事項は予告なしに変更または削除されることがありますので、予めご了承ください。}$