【MarkLogic Server】外部LDAPサーバを用いた認証・認可の設定方法


はじめに
===
MarkLogicは内部でユーザ管理や権限管理の機能を搭載していますが、外部のLDAPサーバを用いたユーザ認証にも対応しています。既存の認証システムと連携してMarkLogicを運用したい、などのニーズに対応できるようになっています。

ここでは、OpenLDAPを用いたMarkLogicの外部認証の設定方法について記します。

実施内容
===
MarkLogicのHTTPサーバやXDBCサーバに接続する際のユーザ認証を、外部のOpenLDAPサーバで行う設定方法を記します。

まず、MarkLogicが接続する外部のLDAPサーバを設定します。
次に、MarkLogicのHTTPサーバやXDBCサーバごとの認証・認可方式の設定を行います。
最後に、OpenLDAPで管理するユーザのロールと、MarkLogicのロールのマッピングを設定します。

| 対象MarkLogicバージョン | 対象OpenLDAPバージョン |
|---|---|
|8.0-6.3|SLAPD 2.4.23|

ここでは、以下のような構成を例として取り上げます。

![MarkLogic-OpenLDAP構成図.png](https://qiita-image-store.s3.amazonaws.com/0/188643/e4eb1a4c-282f-6a49-25e3-53edf6ae8940.png)

外部LDAPサーバの設定
===
ユーザ認証に使用する外部のLDAPサーバをMarkLogicに設定する方法を記します。

WebブラウザでMarkLogicの管理画面にアクセスして「External Security」を選択し、「Create」タブを表示します。

![MarkLogic管理画面-ExternalSecurity設定.png](https://qiita-image-store.s3.amazonaws.com/0/188643/546d0b02-fc06-0886-d7bd-5022ba38c809.png)

ここでLDAPサーバの設定を入力します。主な項目は以下の通りです。

| 項目名 | 概要 | 今回の設定 |
|:------|:-----|:-----|
| external security name | 接続先のLDAPサーバの名前です。 | LdapServer |
| authentication | 認証方式として「ldap」か「kerberos」のいずれかを選択します。 | ldap |
| authorization | 当該サーバへの接続ユーザに対する認可方式を設定します。MarkLogicの認可機能を使う場合は「internal」を選びます。 | ldap |
| ldap server uri | 接続先のOpenLDAPのURIを入力します。 | http\://localhost:389 |
| ldap base | ユーザを検索する際の基準となるDNを入力します。 | o=jucoML,c=jp |
| ldap attriburte | ログインに使うユーザIDが設定されたRDNの属性を設定します。<br>例：cn、sn、uidなど。 | sn |
| ldap default user | MarkLogicがLDAPにアクセスする際のデフォルトユーザのDNを設定します。LDAPの管理者などになります。 | cn=manager, o=jucoML, c=jp |
| ldap default user<br>および<br>confirm ldap password | 上記のldap default userのパスワードです。 | 任意のパスワード |
| ldap bind method | MarkLogicがLDAPに接続する際の認証機構を「MD5」か「simple」から選択します。<br>なお、simpleの場合パスワードは平文で送られるため、LDAPSなど保護された接続環境で使用すべきです。| simple |

以上でMarkLogicがユーザの認証・認可に使用するOpenLDAPの設定が完了します。

MarkLogicの接続方式に応じたサーバの認証・認可設定
===
アプリケーションやユーザがMarkLogicに接続する方式には、HTTP、XDBC、WebDAV、ODBCがあります。
例えば、MarkLogicのREST-APIを使用する場合、HTTPでのアクセスとなります。
XDBC(XML Database Connector)はMarkLogic独自の接続方式であり、ODBCやJDBCに類似した方式になります。

これらの接続方式を使用するためには、MarkLogicの管理画面でそれぞれの方式に応じたサーバを構築する必要があります。
MarkLogicの管理画面の「App Servers」に表示される「Create HTTP」などのタブで構築することができます。

![MarkLogic管理画面-サーバ構築設定_01.png](https://qiita-image-store.s3.amazonaws.com/0/188643/0b63a1ea-3836-e1b5-e602-76c7c9ff6833.png)

これらのサーバに接続する際にユーザの認証・認可を行いますので、各サーバ単位で認証・認可の方式を設定することになります。ここではHTTPサーバを例に、上記で設定した外部のOpenLDAPを使用する設定について記します。

| 項目名 | 概要 | 今回の設定 |
|:------|:-----|:-----|
| authentication | このサーバに接続する際の認証方式です。「application-level」、「basic」、「digest」、「digestbasic」、「kerberos-ticket」から選択します。<br>外部の認証システムを利用する場合、「application-lebel」「basic」「kerberos-ticket」のいずれかのみとなります。 <br><br>＜application-levelについて＞<br>「application-level」はMarkLogicでユーザ認証を行わず、接続元のアプリケーション側で認証する設定になります。これを選択した場合、MarkLogicの接続ユーザは後述する「default user」で選択したユーザとなります。「default user」で「admin」を選択してしまうと、誰でもMarkLogicにアクセス可能で、かつ、管理者権限で全ての操作を行えるようになってしまうため注意が必要です。| basic |
| internal security | MarkLogicの認証・認可機能を使用するかどうか選択します。外部のOpenLDAPを使用する場合は「false」を選択します。 | false |
| external security | 使用する外部の認証・認可システムを選択します。上記で設定したOpenLDAPの設定を選択します。 | LdapServer |
| default user | 「authentication」で「application-level」を選択した場合、MarkLogicへの接続に使用するデフォルトのユーザを選択します。今回は「basic」を選択しているため、本項目は任意の値でOKです。 | nobody |

認可に用いるロールの設定
===
MarkLogicでユーザの認可を行うためには、ユーザごとに許可するロールや実行権限の設定が必要になります。
今回のように外部LDAPサーバを用いた認可を実現するためには、LDAP側のロールとMarkLogic側のロールを対応付ける必要があります。これにより、LDAPのユーザアカウントでMarkLogicにログインし、LDAPで管理するロールに基づいた認可処理を実現できます。

ここではLDAPのロールの設定と、MarkLogicのロールの設定について記します。

###1．LDAPのロール設定
MarkLogicがLDAPからユーザのロールを取得する際にはLDAPの"membereOf"属性を参照します。しかし、OpenLDAPはデフォルトでは"memberOf"属性に対応していないため、これを有効にする必要があります。

詳細は以下の記事をご参照ください。
[Using OpenLDAP for authorising MarkLogic security roles ](https://help.marklogic.com/knowledgebase/article/View/457/0/using-openldap-for-authorising-marklogic-security-roles)

今回は以下のロールをエントリーしました。

* ユーザ"user01"に対するロール"role01"

```
objectClass: top
objectClass: groupOfNames
cn: role01
member: cn=user01, o=jucoML, c=jp
```

* ユーザ"user02"に対するロール"role02"

```
objectClass: top
objectClass: groupOfNames
cn: role02
member: cn=user02, o=jucoML, c=jp
```

###2．MarkLogicのロール設定

MarkLogicのロール設定は、管理画面から"Security"の"Roles"をたどり、"Create"タブで行います。

![MarkLogic管理画面-ロール設定.png](https://qiita-image-store.s3.amazonaws.com/0/188643/0a159bdf-9421-3fce-542c-536bdc4c6cf9.png)


MarkLogicのロールとLDAPのロールを紐づけは"external name"に記述します。ここでは、role01とrole02の設定例を記します。

| 設定項目 | 概要 | 今回の設定 |
|:------|:-----|:-----|
| role name | MarkLogicのロール名です。 | role01<br>role02 |
| external name | このロールに対応するLDAP側のロールのDNです。 | cn=role01, o=jucoML, c=jp<br>cn=role02, o=jucoML, c=jp |

以上で、MarkLogicのロールとLDAPのロールが紐づきます。
例えば、user01でMarkLogicのHTTPサーバ等にログインすると、LDAP側にuser01のエントリーを問い合わせに行き、パスワードを確認し、memberOf属性からロール情報を取得する流れとなります。

なお、MarkLogicでロールを作成する場合、既存のロールとの紐づけや許可する実行権限の設定、アクセスを許可するURIの設定などが必要になります。以下に概要を記します。

| 設定項目 | 概要 |
|:------|:-----|
| Roles | MarkLogicに用意されているロールの中から必要なロールを紐づけます。admin権限のロールやセキュリティ管理系のロールなどがあります。|
| Execute Privileges | 実行を許可する機能を紐づけます。クエリの関数レベルの細かい設定が可能です。 |
| URI Privileges | アクセスを許可するディレクトリやドキュメント等のURIを設定します。 |
| default permissions | 作成したドキュメントに付与するデフォルトのロールと許可する操作(read, insert, update, execute)を設定します。|
| default collections | 作成したドキュメントにデフォルトで設定するコレクションを指定します。 |

以上でロールの設定が完了しますが、実際に使用するには適切なロールや実行権限を割り当てる必要があります。
MarkLogicを使用する際によく利用するツールとして、[MLCP](https://developer.marklogic.com/products/mlcp)や[CoRB2](https://developer.marklogic.com/code/corb)が挙げられます。MLCPはデータローダー、CoRB2はバッチ処理用のツールです。

ここではMLCPやCoRB2の実行に必要なロール、実行権限を例として記します。

* MLCPの実行に必要なロールと実行権限
    * Role
        * security
    * Execute Privileges
        * xdbc:eval
        * xdbc:insert

* CoRB2の実行に必要な実行権限
    * Execute Privileges
        * xdmp:value
        * xdbc:invoke        
        * xdmp:spawn
        * xdbc:eval

実際に使ってみよう
===
以上でLDAPを使った認証・認可の設定は完了になります。

最後に、簡単ですが認証・認可の動作を確認する方法を記します。

実際にMLCPを使ってuser01でデータロードした場合、そのデータをuser01は参照可能ですが、
user02が参照するとエラーとなります。

* データロード

以下の例はtest.xmlというファイルを、/sample/test.xmlとしてロードします。

```
mlcp.bat import -host localhost -port 9999 -username user01 -password ***** ^
-input_file_path c:/load/test.xml ^
-mode local ^
-document_type xml ^
-output_uri_prefix /sample ^
-output_uri_replace "/c:/load,'' "
```
* ロードしたtest.xmlにREST-APIでアクセスしてみます。

```
http://localhost:9999/v1/documents?uri=/sample/test.xml
```

user01の場合は正しくtext.xmlの内容が表示されますが、user02の場合は「500 Internal Server Error」が返ります。
これは、test.xmlに対するアクセス権としてロードしたユーザのrole01が割り当てられており、role01以外のユーザは参照できないためです。

MarkLogicのHTTPサーバやXDBCサーバの認証・認可に、社内で運用されているLDAPサーバを使用したい場合は、上記をお試しください！

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

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

**免責事項**

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