ActiveDirectory のLDAP チャネルバインディングを有効化してみた

# はじめに
2020 年初頭の Windowsアップデートで、「LDAP 署名有効化」「LDAP チャネルバインディング （LDAPS 利用時）化」になるとのことで試してみました。
本記事では「LDAP チャネルバインディング （LDAPS 利用時）化」で試したことについての記録です。

https://portal.msrc.microsoft.com/ja-JP/security-guidance/advisory/adv190023
https://msrc-blog.microsoft.com/2019/10/02/ldapbinding/

## 試した環境
* Windows Server 2016 Standrd
* 2012/12/11時点での Windowsアップデート実施済み
* ADをセットアップ済み



# レジストリを設定
[こちら](https://support.microsoft.com/ja-jp/help/4034879/how-to-add-the-ldapenforcechannelbinding-registry-entry)によるとレジストリを設定すれば有効になるとのこと。
とりあえず、設定してみます。
上記ページのとおり、レジストリに新しく`LdapEnforceChannelBinding`を追加しました。

![LDAPチャネルバインディング有効.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316450/d9672bf8-8312-9f3e-5e77-5d9dfca04e56.png)

影響を確認する場合は設定値を `2` とし、どんなクライアントからのアクセスに対しても有効とするようにしましょう。


# LDAP チャネルバインディングの確認
さてLDAP チャネルバインディングを有効(設定値: 2)にしましたが、有効になったことをどのように確認すれば良いのでしょうか。
設定したつもりが、実はスペルミスで有効じゃなかったなんてことはイヤですし、検証したことにならないですからね。
しかし、**マイクロソフトのページでは確認方法を見つけられませんでした。**
仕方なく色々試行錯誤して、ADに対してリクエストを投げたところレジストリの設定によって挙動が変わる ldapsearch を発見しました。
それが Simple BIND ではなく SASL(DIGEST-MD5) による BIND でした。


* `LdapEnforceChannelBinding`の設定が 0 や 1 の場合

```
# ldapsearch -LLL -U user0001 -H ldaps://$LDAP:636/  -Y DIGEST-MD5 -b ${SUFFIX} -N -y "$PASS" "(cn=administrator)" dn
SASL/DIGEST-MD5 authentication started
SASL username: user0001
SASL SSF: 0
dn: CN=Administrator,CN=Users,DC=win2018adfs,DC=osstech,DC=example,DC=co,DC=jp
```

検索は成功します。


* `LdapEnforceChannelBinding`の設定を 2 にする

```
# ldapsearch -LLL -U user0001 -H ldaps://$LDAP:636/  -Y DIGEST-MD5 -b ${SUFFIX} -N -y "$PASS" "(cn=administrator)" dn
SASL/DIGEST-MD5 authentication started
ldap_sasl_interactive_bind_s: Invalid credentials (49)
	additional info: 80090346: LdapErr: DSID-0C090579, comment: AcceptSecurityContext error, data 80090346, v3839
```

検索が失敗しました！
Windowsサーバーは`LdapEnforceChannelBinding`の設定を 2 に変更しただけ(OS再起動等もしていません)[^1]でldapsearch コマンドの引数は変えていません。
設定値を変えると結果が変わるので、この設定項目の影響であると考えられます。

[^1]: 「LdapEnforceChannelBindingの変更を適用した後に、コンピューターを再起動する必要はありません。」とあるので、期待したとおりの動きに見えます。

# LDAP チャネルバインディングの影響
LDAP チャネルバインディングを有効にすると SASLによる認証は失敗しました。
一方で Simple BIND による認証では、`LdapEnforceChannelBinding`の設定値が`2`でも検索が可能でした。

* `LdapEnforceChannelBinding`の設定値が `2` で Simple BIND

```
# ldapsearch -x -LLL -H ldaps://${LDAP}:636/ -D "CN=user0001,CN=Users,DC=win2018adfs,DC=osstech,DC=example,DC=co,DC=jp" -b ${SUFFIX} -y ${PASS} -s sub "(cn=user0001)" cn 
dn: CN=user0001,CN=Users,DC=win2018adfs,DC=osstech,DC=example,DC=co,DC=jp
cn: user0001
```

検索結果が返ってきました。
従って`Simple BIND` によるLDAPSであれば、LDAP チャネルバインディングの影響は無いという結果になります。

SASLによる ldapsearch により、`LdapEnforceChannelBinding`が有効か判別できるので、ADが意図した状態(チャネルバインディングが有効)であることを確認したうえで、検証したいシステムで使えなくなる機能がないかを確認することができます。

# おわりに
[このページ](https://msrc-blog.microsoft.com/2019/10/02/ldapbinding/)で「構成を変更に事前にテストしてください」とアナウンスされていますが、**LDAP チャネルバインディングを有効になっているかの確認方法**がどこにも見当たりませんでした。
**LDAP チャネルバインディングが有効になっている環境でちゃんとテストを行えているのか**を確かめるすべがありません。

LdapEnforceChannelBinding が有効だとSASL(DIGEST-MD5)に失敗するというは**検証結果に基づく推測**となりますが、困っている方の検証の手助けが出来たのなら幸いです。


# 感想
`LDAP チャネルバインディングとは何か`という仕様も見当たらないため、どういうリクエストを投げると拒否されてしまうのか不明であり、対策を取る方法がわからず、もしテストで繋げないクライアントがいたらどうしたら良いかということがわかりません。[^2]

それで影響調査してくださいとは無茶でんがな…マイクロソフトさん…


調べてみると実感するのですが、情報が全然ありません。
しかし、LDAPS + Simple BIND を接続できなくするなんてことになれば、ADに接続する多くのクライアントが影響を受けることになり、もっと事前に騒がれることになるはずです。
そう考えると大きな影響がある Windows アップデートでは無いのでは？と感じています。

調べることがWebを検索するか検証しか出来ないので歯がゆいです。仕様を公開するなり、ソースコードが欲しいー



[^2]: 「Windowsアップデートをしない」または「LdapEnforceChannelBinding を 0 または 1 にする」ということが取れる対策でしょう。