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をセットアップ済み

レジストリを設定

こちらによるとレジストリを設定すれば有効になるとのこと。
とりあえず、設定してみます。
上記ページのとおり、レジストリに新しくLdapEnforceChannelBindingを追加しました。

影響を確認する場合は設定値を 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 コマンドの引数は変えていません。
設定値を変えると結果が変わるので、この設定項目の影響であると考えられます。

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が意図した状態(チャネルバインディングが有効)であることを確認したうえで、検証したいシステムで使えなくなる機能がないかを確認することができます。

おわりに

このページで「構成を変更に事前にテストしてください」とアナウンスされていますが、LDAP チャネルバインディングを有効になっているかの確認方法がどこにも見当たりませんでした。
LDAP チャネルバインディングが有効になっている環境でちゃんとテストを行えているのかを確かめるすべがありません。

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

感想

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

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

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

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


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

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