【図解】LDAP署名とチャネルバインディングとは?ADのLDAPを守る設定と、必須にする前の確認方法を初心者向けに解説

「LDAPとは?」の記事では、LDAP の基本と、389 番のままではシンプルBindのパスワードが読めてしまうこと、AD には「LDAP 署名」の設定があることを紹介しました。この記事はその続きです。AD の LDAP を守る2つの設定、LDAP 署名とチャネルバインディングが、それぞれ何を守り、どの通信に効くのかを図で説明します。あわせて、Windows Server 2025 で変わった既定値と、必須にする前に影響を受ける機器を探す方法をまとめます。

この記事でわかること
  1. LDAP 署名・SASL の暗号化・TLS・チャネルバインディングの違いと、それぞれが効く場面
  2. DC で署名を必須にすると、どの Bind が拒否されるか
  3. Windows Server 2025 で変わった既定値
  4. 必須にする前に、影響を受けるクライアントをイベントで探す手順

おさらい:389 番の2つの Bind

Bind は、LDAP でつないだあと最初に行う「名乗る」操作です。AD に対する Bind には、大きく分けて2つの種類があります。

シンプルBind名前(DN)とパスワードを送るP@ssw0rd…パスワードがそのまま流れるそのあとの通信も守られない複合機・NAS・Linux・VPN 機器に多いSASL Bind(Kerberos・NTLM)パスワードを送らずに認証する認証で「セッションの鍵」ができるその鍵で署名・暗号化ができるWindows の PC や管理ツールはこちらLDAP 署名がかかわるのは右の SASL Bind。左のシンプルBindは TLS で守るしかない
図1 389 番での Bind の2つの種類

シンプルBindは、名前(DN)とパスワードをそのまま送る方式です。分かりやすく、複合機や NAS、Linux、VPN 機器など多くの製品が対応していますが、389 番のままではパスワードが通信路に流れ、そのあとのやり取りも守られません。

SASL Bind は、Kerberos や NTLM(Windows では Negotiate で選ぶ)を使って、パスワードを送らずに認証する方式です。認証が終わると、クライアントと DC の両方に同じ「セッションの鍵」ができます。この鍵を使って、そのあとの LDAP の通信に署名を付けたり、暗号化したりできます。Windows の PC や管理ツールが AD と話すときは、ふつうこちらを使います。

LDAP を守る4つのしくみ

AD の LDAP の通信を守るしくみは、次の4つです。名前が似ていて混同しやすいのですが、それぞれ守るものと効く場面が違います。

しくみ守るもの効く場面
LDAP 署名改ざんされていないこと389 番の SASL Bind のあとの通信
SASL の暗号化(シーリング)改ざんに加えて、盗み見389 番の SASL Bind のあとの通信
TLS(LDAPS・StartTLS)盗み見・改ざん・サーバの確認636 番か、389 番で StartTLS したあとのすべての通信
チャネルバインディング認証を TLS の通り道に結び付けるTLS の上の SASL Bind だけ
389・SASL389・シンプルTLS・シンプルTLS・SASLLDAP 署名改ざんを防ぐ関係なし関係なしSASL の暗号化(シーリング)盗み見も防ぐ関係なし関係なしTLS(LDAPS・StartTLS)盗み見・改ざん・サーバ確認関係なし関係なしチャネルバインディング認証を TLS に結び付ける関係なし関係なし効く効かない(守れない)関係なし:その場面では使わない
図2 LDAP を守る4つのしくみと効く場面

図2で大事なのは2点です。1つ目は、LDAP 署名はシンプルBindを守れないことです。署名に使う鍵は SASL Bind で作られるので、鍵のないシンプルBindには署名を付けられません。シンプルBindを守れるのは TLS だけです。2つ目は、チャネルバインディングは TLS の上の SASL Bind にしか効かないことです。TLS の上でもシンプルBindには効きません。

LDAP 署名

LDAP 署名は、SASL Bind で作ったセッションの鍵を使って、LDAP のメッセージ1つ1つに署名を付けるしくみです。

① SASL Bind(Kerberos):署名を使うことを伝える② そのあとの LDAP の通信に、鍵で作った署名を付けるPC01DC01Bind:user01 のチケット +「署名します」Bind 成功両方に同じ「セッションの鍵」ができる(ネットワークには流れない)Search + 署名結果 + 署名途中で1文字でも変えられると署名が合わず、受け取らない
図3 LDAP 署名の流れ

署名は、メッセージの中身と鍵から計算した値です。途中で中身を1文字でも変えると署名が合わなくなるので、受け取った側は書き換えに気づけます。鍵はネットワークに流れないので、途中にいる第三者は正しい署名を作れません。ハッシュや HMAC のしくみは「暗号の基礎」の記事で説明しています。

ただし、署名は「改ざんされていないこと」を守るだけで、中身は読めてしまいます。中身も隠したいときは、SASL の暗号化(シーリング)か TLS を使います。Windows の LDAP クライアントの多くは、署名だけでなく暗号化も使えます。

DC で署名を必須にすると

DC 側の設定「Domain controller: LDAP server signing requirements」を「Require signing」にすると、DC は署名を使わない Bind を拒否します。拒否されるのは次の2つです。

DC で「Require signing(署名を必須)」にしたとき389SASL Bind・署名あり受け付ける389SASL Bind・署名なし拒否する389シンプルBind・暗号化なし拒否する636 / StartTLSシンプルBind・TLS の上受け付ける(TLS が守る)636 / StartTLSSASL Bind・TLS の上受け付ける(TLS が守る)
図4 DC で署名を必須にしたとき

TLS の上の通信は、TLS が改ざんを防いでいるので、署名がなくても受け付けられます。つまり、署名を必須にしたあとも、シンプルBindしか使えない機器は LDAPS か StartTLS に切り替えれば使い続けられます。

署名を必須にした DC に、389 番で暗号化せずにシンプルBindをすると、「Strong Authentication Required」というエラーで断られます。古い機器のログにこのエラーが出ていたら、署名の必須化が原因です。

クライアント側の設定

Windows のクライアントには「Network security: LDAP client signing requirements」という設定があり、「None」「Negotiate signing」「Require signing」から選びます。既定の Negotiate signing では、クライアントは署名を求め、DC が対応していれば署名を使います。この設定は SASL Bind にだけ効き、シンプルBindには関係しません。

チャネルバインディング

LDAPS や StartTLS を使っていても、TLS と、その中の SASL Bind(Kerberos・NTLM)は別々に行われます。そのため DC は、Bind が「どの TLS の通り道の上で行われたか」を知りません。途中にいる第三者が、クライアントとのあいだの TLS と DC とのあいだの TLS を別々に張り、認証のデータだけを中継すると、DC は見分けられません。とくに NTLM はサーバを確かめないので、この中継の危険が大きくなります。

これを防ぐのが LDAP のチャネルバインディングです。TLS の通り道から作った値(チャネルバインディングトークン、CBT)を Bind に入れ、DC が自分の側の値と比べます。

PC01DC01TLS(LDAPS 636 / StartTLS)SASL Bind(Kerberos・NTLM)+ CBT① TLS をつなぐ両方が、それぞれ同じ TLS の通り道から値(CBT)を作る② Bind に入れるクライアントは CBT を SASL Bind の認証データに入れて送る③ DC が比べる自分の CBT と同じなら成功。違う・ない(必須のとき)なら拒否
図5 LDAP のチャネルバインディング

DC 側の設定は「Domain controller: LDAP server channel binding token requirements」で、次の3つから選びます。

値名前動き
0NeverCBT を確かめない
1When supportedCBT に対応したクライアントには CBT を求める。対応していないクライアントは受け付ける。監査のイベントを出す
2AlwaysTLS の上の SASL Bind では必ず CBT を求め、正しい CBT がなければ拒否する

チャネルバインディングは、次の通信には効きません。

  • TLS の上のシンプルBind(CBT を入れる場所がない。TLS だけで守る)
  • TLS の上のクライアント証明書による Bind(証明書の認証で中継を防げるため、CBT はいらない)
  • TLS を使わない 389 番の SASL Bind(結び付ける TLS がない。署名・暗号化で守る)

チャネルバインディングの考え方と、HTTP や RDP での使われ方は「Windows認証とTLS」の記事で説明しています。

TLS をほどく機器があると失敗する

チャネルバインディングは、クライアントと DC が同じ TLS の通り道を見ていることが前提です。途中のロードバランサなどが TLS をいったん終わらせて張り直していると、両端の CBT が一致しません。Always にする前に、LDAPS の通り道に TLS を終端する機器がないかを確かめてください。

Windows Server 2025 で変わった既定値

これらの設定は長く「使えるが、既定では必須にしない」状態でした。Windows Server 2025 で新しく AD を作ると、既定値が変わります。

Windows Server 2022 までLDAP 署名(DC)なし(署名なしも受け付ける)チャネルバインディングNever(確かめない)CBT の監査イベント2023年3月の更新から既定で出るクライアント署名を求めるが、署名なしに戻ることもあるWindows Server 2025(新しく作る AD)LDAP 署名(DC)必須(Enforcement が有効)チャネルバインディングWhen supportedCBT の監査イベント既定で出るクライアント既定で暗号化してつなぐアップグレードした DC は、もとのポリシーを引き継ぐ(ポリシーがなければ署名は必須になる)
図6 バージョンごとの既定値
項目Windows Server 2022 までWindows Server 2025(新しく作る AD)
LDAP 署名(DC)任意。署名なしの Bind も受け付ける必須。「Domain controller: LDAP server signing requirements enforcement」が既定で有効で、署名のレベルの設定より優先される
チャネルバインディングNeverWhen supported
CBT の監査2023年3月のセキュリティ更新から既定で有効既定で有効
LDAP クライアント署名を求めるが、署名・暗号化なしに戻ることもある既定で暗号化してつなぐ(Windows 11 24H2 以降も同じ)

既存の DC を Windows Server 2025 にアップグレードした場合は、もとの署名のポリシーが引き継がれます。ただし、署名のポリシーが何も設定されていなければ、署名は必須になります。いま「なんとなく動いている」古い機器がある環境では、アップグレードや DC の追加の前に、次の章の手順で影響を確かめておくと安心です。

これまでの経緯

Microsoft は 2019 年にアドバイザリ ADV190023 を出し、LDAP 署名とチャネルバインディングを有効にするよう案内してきました。その後、2020 年・2023 年・2024 年の更新で、設定項目や監査イベントが段階的に追加されています。詳しい経緯は、参考資料の KB4520412 にまとめられています。

必須にする前に:影響を受けるクライアントを探す

署名やチャネルバインディングを必須にすると、対応していないクライアントは AD を使えなくなります。いきなり必須にせず、DC のイベントで影響を受けるクライアントを探してから進めます。

① 件数を見るイベント 2887(署名なし)・3040(CBT なし)24時間ごとのまとめで、どれくらいあるかを知る② クライアントを特定診断ログを 2 にして 2889・3039・3075IP アドレスと、Bind に使ったアカウントが分かる③ クライアントを直すSASL + 署名、または LDAPS・StartTLS へ機器の設定変更・更新・入れ替え④ 必須にするRequire signing / Alwaysまず一部の DC で試してから広げる⑤ 拒否を見張るイベント 2888 など拒否された件数が残っていないかを見る
図7 必須にするまでの手順

使うイベント

イベントは、DC の アプリケーションとサービス ログ ›› Directory Service に記録されます。

ID種類内容
2886署名起動時の注意。この DC は署名なしの SASL Bind と暗号化なしのシンプルBindを拒否していない
2887署名24時間のまとめ。署名なしの SASL Bind と暗号化なしのシンプルBindを受け付けた件数
2888署名24時間のまとめ。署名を必須にしているため拒否した件数
2889署名1件ずつの詳細。クライアントの IP アドレスと、Bind に使ったアカウント、Bind の種類(診断ログが必要)
3040CBT24時間のまとめ。CBT で守られていない LDAPS の Bind の件数(Never のとき)
3041CBT起動時と24時間ごとの注意。CBT を確かめるように勧める(Never のとき)
3039CBT1件ずつ。CBT の確認に失敗したクライアント(診断ログが必要)
3074・3075CBT1件ずつ。Always にしたら失敗するクライアント、CBT を送っていないクライアント(診断ログが必要)

1件ずつの詳細(2889・3039・3074・3075)を出すには、DC のレジストリ HKLM\SYSTEM\CurrentControlSet\Services\NTDS\Diagnostics の「16 LDAP Interface Events」を 2 にします。3039・3074・3075 は、チャネルバインディングを When supported か Always にしているときだけ記録されます。詳細のログは量が増えて DC の負荷になるので、調べ終わったら 0 に戻します。

見つかったクライアントの直し方

見つかったもの直し方
389 番で暗号化せずにシンプルBindをしている機器LDAPS(636)か StartTLS に切り替える。DC には LDAPS 用の証明書が必要
署名なしで SASL Bind をしているアプリアプリの設定で署名・暗号化を有効にする。できなければ更新や入れ替えを検討する
LDAPS で SASL Bind をしているが CBT を送らないクライアントCBT に対応した版に更新する。Windows の LDAP クライアントは対応している
どうしても対応できない古い機器入れ替えを計画する。それまでは別のネットワークに分けるなど、影響を小さくする

2889 に出るアカウントは、多くの場合「機器が LDAP の検索に使っているサービスアカウント」です。アカウント名から、どの機器の設定かを探すと早く見つかります。

設定する場所

DC 側の設定は「Default Domain Controllers Policy」などの、DC に適用するグループポリシーで行います。場所は コンピューターの構成 ›› ポリシー ›› Windows の設定 ›› セキュリティの設定 ›› ローカル ポリシー ›› セキュリティ オプション です。

ポリシーレジストリの値選べる値
Domain controller: LDAP server signing requirementsNTDS\Parameters の LDAPServerIntegrityNone / Require signing(2)
Domain controller: LDAP server signing requirements enforcement-Windows Server 2025 の新しい AD では既定で有効
Domain controller: LDAP server channel binding token requirementsNTDS\Parameters の LdapEnforceChannelBindingNever(0)/ When supported(1)/ Always(2)
Network security: LDAP client signing requirementsServices\LDAP の LDAPClientIntegrityNone / Negotiate signing(1)/ Require signing

レジストリの値は、どこに反映されたかを確かめるために使います。設定そのものは、グループポリシーで行うのが基本です。

確かめ方

署名を必須にしたあとは、テスト用の DC で ldp.exe を使って確かめられます。Connection ›› Connect で DC の 389 番につなぎ、Connection ›› Bind で Bind type に「Simple bind」を選んで Bind します。「Ldap_simple_bind_s() failed: Strong Authentication Required」と表示されれば、署名の必須化が効いています。

テストには使い捨てのアカウントを

この確かめ方は、389 番で暗号化せずにシンプルBindをするので、入力したパスワードがそのまま通信路に流れます。本番のアカウントは使わず、検証環境で、権限のないテスト用のアカウントを使ってください。本番の環境では、イベント 2888 の件数で確かめます。

確認に使うコマンド

DC01(PowerShell・管理者):直近7日の 2886〜2889 と 3039〜3041・3074・3075 のイベントを表示する

Get-WinEvent -FilterHashtable @{LogName='Directory Service'; Id=2886,2887,2888,2889,3039,3040,3041,3074,3075; StartTime=(Get-Date).AddDays(-7)}

DC01(コマンドプロンプト・管理者):1件ずつの詳細(2889 など)を出すように、診断ログを 2 にする

reg add "HKLM\SYSTEM\CurrentControlSet\Services\NTDS\Diagnostics" /v "16 LDAP Interface Events" /t REG_DWORD /d 2 /f

DC01(コマンドプロンプト・管理者):調べ終わったら、診断ログを 0 に戻す

reg add "HKLM\SYSTEM\CurrentControlSet\Services\NTDS\Diagnostics" /v "16 LDAP Interface Events" /t REG_DWORD /d 0 /f

DC01(コマンドプロンプト・管理者):署名とチャネルバインディングの設定値を確かめる

reg query "HKLM\SYSTEM\CurrentControlSet\Services\NTDS\Parameters" /v LDAPServerIntegrity
reg query "HKLM\SYSTEM\CurrentControlSet\Services\NTDS\Parameters" /v LdapEnforceChannelBinding

DC01(コマンドプロンプト・管理者):DC に適用されているグループポリシーを HTML で書き出す

gpresult /h C:\temp\gpresult-dc01.html

reg query で値が見つからないときは、ポリシーで設定していない(OS の既定値のまま)という意味です。

まとめ

項目ひとことで
LDAP 署名389 番の SASL Bind のあとの通信を、改ざんから守る。シンプルBindは守れない
署名を必須にすると署名なしの SASL Bind と、暗号化なしのシンプルBindを拒否する。TLS の上は受け付ける
チャネルバインディングTLS の上の SASL Bind を、その TLS の通り道に結び付けて中継を防ぐ
Windows Server 2025新しい AD では署名が必須、チャネルバインディングは When supported が既定
必須にする前に2887・3040 で件数を見て、診断ログで 2889・3039・3075 からクライアントを特定する
直し方シンプルBindの機器は LDAPS・StartTLS へ。SASL のアプリは署名・暗号化を有効に

LDAP 署名とチャネルバインディングは、どちらも「AD を守る設定」ですが、効く通信が違います。389 番の SASL Bind には署名、TLS の上の SASL Bind にはチャネルバインディング、シンプルBindには TLS、と覚えておくと整理しやすくなります。必須にするときは、イベントで影響を受ける機器を洗い出してから、段階的に進めてください。

コメント