LDAP の仕組み理解：WordPress の認証で Active Directory を利用する

# 本記事の目的

* 以下記事にて「LDAP ってどんなもの？」ということをざっくり説明した。

https://qiita.com/shintaro-san/items/2025db4fcda52e2944c3

* 本記事は、実際に LDAP の設定を行ってみて仕組みをもう少し理解するためのもの。ここでは WordPress を LDAP クライアント、ActiveDirectory(WindowsServer2022)を LDAP サーバーとして動作確認する。検証イメージは以下図の通り。
![fig-001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2902882/9ee3b6f0-f5e7-0361-ec8f-ad47175a144d.png)

# 手順

今回 Azure 上に Ubuntu20.04(WordPress 用) および WindowsServer2022(Active Directory 用) を用意した。手順は以下の通り。

* ActiveDirectory の構築
* ActiveDirectory でのユーザ情報追加
* WordPress 準備
* WordPress プラグイン設定
* LDAP 認証の動作確認

なお、手順詳細の後に「WordPress の LDAP 設定にあたり何を行ったか」を解説している項目を設けていいるので、そちらも参照しながら検証するのが good。

# 手順詳細

## ActiveDirectory の構築

ActiveDirectory の構築については特に何も参照しなかったが、以下とか参考になりそう。

https://anything-it.info/windows-server-2022-ad-install/

* なお上記 URL の「Active Directory ドメイン サービス構成ウィザード」において、ルートドメイン名は **ad.co.jp** としています(後々使う情報)。

## ActiveDirectory でのユーザ情報追加

* 以下のようにユーザを追加する。
    * Manager：ou の所属なし、グループについては Administrators に所属させておく。LDAP バインド用のユーザ(バインドについては後述)。
![ad-001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2902882/9036a08c-c188-5c77-3952-ed61e88892af.png)
    * user001 と user002：**ou=department001** を新規作成し、所属させる。ActiveDirectory の登録情報を用いて WordPress にログインできるか確認するためのユーザ。
![ad-002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2902882/48b0df79-c203-f0c0-e908-d281178f7d86.png)
    * user003：**ou=department002** を新規作成し、所属させる。。ActiveDirectory の登録情報を用いて WordPress にログインできるか確認するためのユーザ。
![ad-003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2902882/9e778c64-c7a5-762e-b053-7eac889e823c.png)

## WordPress 準備

以下を参考にさせていただきました、ありがとうございました！

https://qiita.com/cherubim1111/items/b259493a39e36f5d524b

* Azure 上に構築している際には、「受信ポートの規則」にて http 通信を許可しないと、ブラウザでアクセスできないので注意。
![fig-002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2902882/240cb6a3-018e-1dd5-f516-89782121ce79.png)

## WordPress プラグイン設定

### プラグインインストール

* 「LDAP」あたりの単語で検索し、**Active Directory Integration / LDAP Integration** をインストール、有効化する。

![fig-003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2902882/1c25885f-cdb7-4f97-1185-2b25d606fb20.png)

* このプラグインを使うためには、おそらく以下コマンドを実施のうえで再起動する必要がありそう(そうしないと、アラートが常時表示される)。
<pre># sudo apt-get -y install php-ldap</pre>

### プラグイン設定

* LDAP Configuration のタブについて、以下の通り設定。
    * LDAP Server については、Active Directory のプライベート IP を設定。
    * Username と Password については、前手順で作成した Manager ユーザの情報を入力。
![fig-004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2902882/aeb26a43-65fb-921d-adca-da6c8a1af3bf.png)
* 「Test Connection & Save」をクリック。問題なければチェックマークが表示される。
    * Azure で実施する場合は、こちらも「受信ポート規則の設定」により、WordPress ⇔ WindowsServer 間でポート 389 の通信を許可する必要がありそう。
        * WordPress 側の受信ポート規則追加例
        ![fig-005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2902882/f2debb47-1db2-3d61-0acc-c0d173c7678f.png)

* 続いて ou=department001 のユーザが、LDAP 認証でログインできるように設定する。
![fig-006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2902882/c32255d2-64b7-6ef8-ff3b-73c015465dd5.png)

* Test Authentication の項目があるが、ここは設定項目というわけではないのでスルーで良さそう。
    * 添付については Manager が ou=department001 にいないので失敗しているケース。user001・user002 で試すと成功する。
![fig-007.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2902882/3366f0f4-7d3a-9afa-02b3-d3a1a7828e50.png)

* Sign-In Settings において「Enable LDAP Login」を有効化することで、設定完了。
    * たぶん大丈夫だが「すべてのユーザが LDAP でしかログインできない」というケースに備えて、管理者権限ユーザについてはログインしたまま、ここ以降の検証を行うほうが無難。
![fig-008.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2902882/6c344d83-faec-f4ce-f71a-cbe8a912746b.png)

## LDAP 認証の動作確認

* 今回は ou=department001 に所属するユーザについて LDAP 認証ができるようにした。WordPress のログイン画面から、user001・user002 ともに、WindowsServer にログインする際のパスワードでログインできれば設定成功している。
* 以下のように、user001・user002 が自動で WordPress 上に登録される。
![fig-009.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2902882/c196b47d-288f-8f57-3f51-b58cba9cd099.png)

# ざっくりとした手順解説

* **「ActiveDirectory でのユーザ情報追加」** において、以下のような組織ツリー図を作成したことになる。
![fig-009.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2902882/d3e17049-8360-ed7c-a493-bab3fcaa68ee.png)
    * dc, ou, cn については以下参照にざっくりまとめる。

https://milestone-of-se.nesuke.com/l7protocol/ldap/binddn-basedn/

| LDAPの属性値 | 属性表示名 | ざっくり意味するところ |
|---|---|---|
| dc | Domain-Component | ドメイン。ここでは dc=ad,dc=co,dc=jp |
| ou | Organizational-Unit-Name | 組織単位（OU）。「人事部」とか「開発部」みたいな部署名と考えると良さそう |
| cn | Common-Name | 「ユーザ名」くらいの理解で良さげ。cn=user001 とか。ActiveDirectory でよく使う印象 |

* **「WordPress プラグイン設定」** において、情報として LDAP Server や Username を登録した。ここでやっていたのは、「WordPress がどの LDAP サーバーを参照するか = IP 情報の設定」と、「バインド用のユーザを誰にするかの登録」の 2 つ。
    * 以下記事を参考にすると、「バインドとは、LDAP サービスへログインすること」。

https://milestone-of-se.nesuke.com/l7protocol/ldap/binddn-basedn/

* つまりここでの設定は以下のイメージ。LDAP サーバと、バインドするユーザ(ここでは Manager)の特定を行った。

![fig-010.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2902882/876132a5-c791-f1fc-c3ab-74c928ffc7de.png)

* 続いて Search Base の登録を行ったが、これについては「どの箇所にいるユーザについて、LDAP 認証を適用するか」の設定と考えると良い。今回は以下のように、ou=department001 配下のユーザに LDAP を使えるようにした。

![fig-011.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2902882/a5b9c3ef-8ce2-ae51-46af-f31af859f5ae.png)


# 終わりに

* はじめて LDAP に触れた時はワケがわからなかったが、解説で述べたような「LDAP サーバとバインドユーザ特定する → LDAP 認証の対象とするユーザ探しに行く」という流れを掴めればだいぶ設定やりやすくなると思う。
* 次は LDAP サーバーを Azure Active Directory に変えて検証したい。