【Nextcloud】Active Directory 連携したアカウントのパスワードを変更する

前回投稿から時間が空いてしまいましたが、この記事書くための検証やら画面キャプチャ取得やらに思いのほか時間がかかってしまいました・・・f(-_-;
\# Windows の手順作るの大変・・・ PowerShell とか使えるともう少し簡単になるのかな・・・ Windows Server はほとんど触らないので PowerShell の学習はなかなかはかどりません。

## はじめに
Nextcloud と Active Directory (AD) を連携させて運用するニーズは多いです。
ユーザがこのパスワードを変更する場合は、通常はドメインに参加している Windows 端末からパスワード変更機能を利用すると思います。
この記事では、このパスワード変更を AD 連携させた Nextcloud から行えるようにするにはどうすればよいかをまとめてみます。

## 記事の前提
* Nextcloud と AD の標準的な環境はあらかじめ準備できている前提とし、それぞれの構築手順は書きません。
* AD 連携するための Nextcloud への LDAP の設定内容に関する細かい設定の説明はいたしません。

## パスワード変更するための必須条件
Nextcloud から AD(LDAP) 連携したアカウントのパスワードを変更する機能を実現するにあたっての条件については、 Nextcloud の公式ドキュメント [Enable LDAP password changes per user](https://docs.nextcloud.com/server/stable/admin_manual/configuration_user/user_auth_ldap.html?highlight=ldap) に記載されております。
一般的な AD 連携において必要な条件は以下のとおりです。

* Nextcloud と AD の接続は `LDAPS(LDAP over SSL/TLS)` であること。
* AD 構成設定のうち、`dSHeuristics` パラメータの `fUserPwdSupport` の設定が、「`userPassword` 属性を `unicodePwd` のエイリアスとして使う」設定となっていること( `dSHeuristics` パラメータについては [Microsoft 公式ドキュメント](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-adts/e5899be4-862e-496f-9a38-33950617d2c5) を参照してください)。

## 環境
下の図のとおりです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/aa11f1e5-d0e3-7fb7-6b7c-cd987c8be09c.png)

### Linux(CentOS7)

```
$ cat /etc/redhat-release 
CentOS Linux release 7.6.1810 (Core) 
```

### Nextcloud

```
$ sudo -u nginx php /var/www/html/nextcloud/occ status
  - installed: true
  - version: 16.0.1.1
  - versionstring: 16.0.1
  - edition: 
```

### Windows Server
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/a9f1f155-fb05-0b54-01aa-e4e30c91217e.png)

## 設定手順

### SSL/TLS 証明書の準備
Nextcloud と AD を連携する際に、Nextcloud から LDAPS で AD に接続する必要があるため、AD サーバに SSL/TLS 証明書などを設定していきます。
今回は閉じたネットワークで Nextcloud と AD を連携する前提とするので、自己署名証明書(=オレオレ証明書)で実装します。
まず、openssl を利用して、秘密鍵と SSL/TLS 証明書のファイルを作成します。

```shell:rootで実施
openssl req -x509 -days 3650 -newkey rsa:2048 -keyout secret.key -out server.crt
```
入力の必要な項目は以下のとおりです。これら以外の項目は未入力で Enter してしまって問題ありません。

* `Enter PEM pass phrase:`　秘密鍵のパスフレーズ
* `Verifying - Enter PEM pass phrase:`　秘密鍵のパスフレーズ(確認)
* `Common Name (eg, your name or your server's hostname) []:`　**AD サーバのフルコンピューター名**

出力されるファイルは以下のとおりです。

* `secret.key`　秘密鍵
* `server.crt`　サーバ証明書(有効期間は10年(=3650日))

引き続き、AD サーバに作成した証明書や秘密鍵をインストールするために PKCS#12 ファイルの形式でひとまとめにします。

```shell:rootで実施
openssl pkcs12 -export -out server.p12 -inkey secret.key -in server.crt
```
入力の必要な項目は以下のとおりです。

* `Enter pass phrase for secret.key:`　秘密鍵のパスフレーズ
* `Enter Export Password:`　PKCS#12 ファイルのパスフレーズ
* `Verifying - Enter Export Password:`　PKCS#12 ファイルのパスフレーズ(確認)

出力されるファイルは以下のとおりです。

* `server.p12`　PKCS#12 形式のまとめファイル

### 証明書ファイルを AD サーバにインストール
前の手順で作成したファイルのうち、サーバ証明書 ( `server.crt` ) と、PKCS#12ファイル ( `server.p12` ) をリモートデスクトップ経由などの方法で AD サーバに転送します。
転送したファイルを以下の手順でインストールします。
#### ① mmc[^1] を起動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/56bd2d4b-f35d-1cff-fc1e-2e3db3789c98.png)
#### ②証明書スナップインの追加
「ファイル」 - 「スナップインの追加と削除」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/6f83d4f1-0f67-3bcb-98bc-319a37133ce1.png)
「利用できるスナップイン」から証明書を選択し、「追加」をクリック、引き続き「 OK 」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/31449279-0cde-78c2-ce64-878186584e6d.png)
「コンピューターアカウント」を選択し、「次へ」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/f423f983-d768-9de0-3dd7-f6348d38ea6d.png)
「次へ」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/a0ba4696-9a95-0bc3-cdcd-655463f4c316.png)
「OK」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/113e7b47-71d3-18b8-47c9-ec098f081f94.png)
#### ③ルート証明書のインストール
「証明書(ローカルコンピューター)」を展開し、「信頼された証明機関」を右クリック、「すべてのタスク」 - 「インポート」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/90499031-1b80-7345-c65e-286b0f66c1ae.png)
「次へ」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/e7c4b591-9201-a241-d6cc-a595a19ac031.png)
「ファイル名」としてサーバ証明書ファイル ( `server.crt` ) を選択して「次へ」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/bac21557-c14a-d8be-eaab-e889c6d20ef7.png)
「次へ」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/a00009eb-cebe-2646-2e47-4e72365a31b6.png)
「完了」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/f0ff3a07-4544-1921-edf1-9d5f3d00e85e.png)
「 OK 」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/ba681fd8-2950-820d-c8f6-463ecaaa6b5c.png)
#### ④ PKCS#12 ファイルのインストール
「証明書(ローカルコンピューター)」の「個人」を右クリック、「すべてのタスク」 - 「インポート」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/9d1bd4e1-bc96-8f0f-fb1c-639bdce70c15.png)
「次へ」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/7614b4c6-5235-b901-f0f4-8cef1c410328.png)
「ファイル名」として PKCS#12 ファイル ( `server.p12` ) を選択して「次へ」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/f2450145-d397-81ff-8717-3c5a9a193ecf.png)
「パスワード」に PKCS#12 ファイルを作成したときのパスフレーズを入力して「次へ」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/7ac82102-19f6-495f-b360-fcc88e112370.png)
「次へ」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/b65dfe56-b702-5ef7-4587-4b9c71cf3746.png)
「完了」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/93fa6f7b-5948-019d-b87a-ffc236f09272.png)
「 OK 」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/6ab27ee6-cc6c-83be-e9a0-8efe018094b0.png)

### AD `dSHeuristics` パラメータの設定変更
#### ① mmc を起動
#### ② ADSI エディタースナップインの追加
「ファイル」 - 「スナップインの追加と削除」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/6f83d4f1-0f67-3bcb-98bc-319a37133ce1.png)
「利用できるスナップイン」から「ADSI エディター」を選択し、「追加」をクリック、引き続き「 OK 」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/2de70668-2769-9265-21ef-f36b80593642.png)
#### ③`dSHeuristics` パラメータの設定変更
「 ADSI エディター」を右クリックし、「接続」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/b0ae4ec4-0aa2-dea2-c8d0-206b1182dc39.png)
「既知の名前付けコンテキストを選択する」プルダウンで「構成」を選択し、「 OK 」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/59502e71-ade6-de47-0a15-91e5cd017829.png)
「 ANSI エディター」 - 「構成」 - 「 CN=Configuration,・・・ 」 - 「 CN=Service 」 - 「 CN=Windows NT 」の順に展開し、「 CN=Directory Service 」を右クリックし、「プロパティ」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/148ecb3c-c62a-bdbf-10e3-b85773fede15.png)
「属性」から「 dSHeuristics 」をクリックし、「編集」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/a83fd731-485f-3980-3a45-e1a8328e0de1.png)
「値」に「 000000211 」を入力し、「 OK 」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/2359a241-da1e-ab10-ea1f-145d560fc019.png)
「 OK 」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/a055d48e-34cf-6c8e-3e8b-b69bb81adb19.png)

### 古いパスワードの有効期間の変更[^2]
※この設定変更は AD の運用ポリシーとか関係あると思いますので、必要に応じて変更を検討してください。変更しなくてもパスワード変更は機能します。

レジストリエディターを起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/b55d15bf-1f2f-472c-0ef8-2025f68e3a1d.png)
「\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa」を探して表示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/268b32a2-d62c-d149-8663-b33f910cffc9.png)
右枠内で右クリックし、「新規」 - 「DWORD (32ビット) 値」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/8766fbc1-e566-e99e-b004-551d5dab0a6a.png)
「名前」を「 OldPasswordAllowedPeriod 」に変更し、Enter キーを押下。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/d621ba1b-f4fb-f20a-27db-b9d7889dccc0.png)
「 OldPasswordAllowedPeriod 」を右クリックし、「修正」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/6671f563-05db-758b-9957-b80b94043d09.png)
「値のデータ」を古いパスワードの有効期間 (単位:秒、`0`は即時に無効) に変更し、「 OK 」クリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/9f728e83-b1da-37bc-5cd3-30ddd732df2e.png)

### Nextcloud サーバの設定

#### ①hosts 追加
※このサーバが参照している DNS で AD サーバのフルコンピューター名の名前解決ができる場合はこの手順は不要です。

```shell:rootで実施／ADサーバのIPアドレスとフルコンピューター名は環境にあわせて変更してください。
echo '10.0.0.100 hogehoge.test.nextcloud.biz' >> /etc/hosts
```
\# IP アドレスとフルコンピューター名は環境にあわせて変更してください。

#### ②サーバ証明書のインストール

```shell:rootで実施
cp -pi server.crt /usr/share/pki/ca-trust-source/anchors/
update-ca-trust extract
```

#### ③ LDAP 連携するための関連モジュールのインストール

```shell:rootで実施
yum install php-ldap -y
```

#### ④サービス再起動

```shell:Nginx+PHP-FPMの場合／rootで実施
systemctl restart php-fpm
```

```shell:Apacheの場合／rootで実施
systemctl restart httpd
```

#### ⑤ LDAP 連携アプリの有効化

```shell:実行ユーザ、occコマンドのパスは環境に合わせて変更してください。
sudo -u nginx php /var/www/html/nextcloud/occ app:enable user_ldap
```

### Nextcloud の設定
Nextcloud に管理者権限を持つアカウントでログインし、設定画面から「LDAP/AD統合」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/4ad48e3c-df4d-9171-6199-fd69c88365a3.png)
連携する AD のサーバ情報を設定。

* ホスト： `ldaps://(AD サーバのフルコンピューター名)`
* ポート： `636` ※通常はこれです。AD サーバの環境に合わせて必要に応じて変更してください。
* ユーザーDN： AD に接続するユーザーDN
* パスワード： ユーザーDN のパスワード
* ベースDN： AD のベースDN

設定後、「ベースDNをテスト」をクリックし、「設定OK」となれば接続に問題はありません。引き続き「続ける」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/839761be-bf0e-23f0-a640-18897635bb85.png)
ユーザーのオブジェクトクラスを選択し、「設定を検証し、ユーザーを数える」をクリック、「xxユーザーが見つかりました」が表示されることを確認して、「詳細設定」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/d95feacb-db53-89d5-9f49-47399c977e9f.png)
「接続設定」で「設定は有効です」をチェックし、「ディレクトリ設定」を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/fe7777dc-2aa7-215f-8662-03e472675b5e.png)
「ベースユーザーツリー」、「ベースグループツリー」を環境に合わせて設定。「グループとメンバーの関連付け」は「member(AD)」に設定されていると思いますのでこれを確認。「ユーザーごとにLDAPパスワードの変更を有効にする」をチェック。引き続き「エキスパート設定」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/806c126a-a332-39e3-1cda-2f6a3a2d19c4.png)
「内部ユーザー名属性：」に `sAMAccountName` と入力し、「設定をテスト」をクリック。「正しい設定です。接続されました。」が出力されれば OK です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/885b845f-3556-c7fc-b7d0-d4a072ac3909.png)

## 動作確認
Nextcloud のパスワード変更画面からパスワードが変更できるか確認します。

**★この記事は、[スタイルズ社のNextcloudサイト](https://nextcloud.stylez.co.jp/) の [Nextcloudブログ](https://nextcloud.stylez.co.jp/nextcloudblog)にも公開しております！**

[^1]: mmc = マイクロソフト管理コンソール(Microsoft Management Console)
[^2]: [ Windows Server 2003 Service Pack 1 で NTLM ネットワーク認証の動作が変更される](https://support.microsoft.com/ja-jp/help/906305/new-setting-modifies-ntlm-network-authentication-behavior)