「LDAPとは?」の記事では、LDAP の基本と、389 番のままではシンプルBindのパスワードが読めてしまうこと、AD には「LDAP 署名」の設定があることを紹介しました。この記事はその続きです。AD の LDAP を守る2つの設定、LDAP 署名とチャネルバインディングが、それぞれ何を守り、どの通信に効くのかを図で説明します。あわせて、Windows Server 2025 で変わった既定値と、必須にする前に影響を受ける機器を探す方法をまとめます。
- LDAP 署名・SASL の暗号化・TLS・チャネルバインディングの違いと、それぞれが効く場面
- DC で署名を必須にすると、どの Bind が拒否されるか
- Windows Server 2025 で変わった既定値
- 必須にする前に、影響を受けるクライアントをイベントで探す手順
おさらい:389 番の2つの Bind
Bind は、LDAP でつないだあと最初に行う「名乗る」操作です。AD に対する 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 だけ |
図2で大事なのは2点です。1つ目は、LDAP 署名はシンプルBindを守れないことです。署名に使う鍵は SASL Bind で作られるので、鍵のないシンプルBindには署名を付けられません。シンプルBindを守れるのは TLS だけです。2つ目は、チャネルバインディングは TLS の上の SASL Bind にしか効かないことです。TLS の上でもシンプルBindには効きません。
LDAP 署名
LDAP 署名は、SASL Bind で作ったセッションの鍵を使って、LDAP のメッセージ1つ1つに署名を付けるしくみです。
署名は、メッセージの中身と鍵から計算した値です。途中で中身を1文字でも変えると署名が合わなくなるので、受け取った側は書き換えに気づけます。鍵はネットワークに流れないので、途中にいる第三者は正しい署名を作れません。ハッシュや HMAC のしくみは「暗号の基礎」の記事で説明しています。
ただし、署名は「改ざんされていないこと」を守るだけで、中身は読めてしまいます。中身も隠したいときは、SASL の暗号化(シーリング)か TLS を使います。Windows の LDAP クライアントの多くは、署名だけでなく暗号化も使えます。
DC で署名を必須にすると
DC 側の設定「Domain controller: LDAP server signing requirements」を「Require signing」にすると、DC は署名を使わない Bind を拒否します。拒否されるのは次の2つです。
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 が自分の側の値と比べます。
DC 側の設定は「Domain controller: LDAP server channel binding token requirements」で、次の3つから選びます。
| 値 | 名前 | 動き |
|---|---|---|
| 0 | Never | CBT を確かめない |
| 1 | When supported | CBT に対応したクライアントには CBT を求める。対応していないクライアントは受け付ける。監査のイベントを出す |
| 2 | Always | TLS の上の SASL Bind では必ず CBT を求め、正しい CBT がなければ拒否する |
チャネルバインディングは、次の通信には効きません。
- TLS の上のシンプルBind(CBT を入れる場所がない。TLS だけで守る)
- TLS の上のクライアント証明書による Bind(証明書の認証で中継を防げるため、CBT はいらない)
- TLS を使わない 389 番の SASL Bind(結び付ける TLS がない。署名・暗号化で守る)
チャネルバインディングの考え方と、HTTP や RDP での使われ方は「Windows認証とTLS」の記事で説明しています。
チャネルバインディングは、クライアントと DC が同じ TLS の通り道を見ていることが前提です。途中のロードバランサなどが TLS をいったん終わらせて張り直していると、両端の CBT が一致しません。Always にする前に、LDAPS の通り道に TLS を終端する機器がないかを確かめてください。
Windows Server 2025 で変わった既定値
これらの設定は長く「使えるが、既定では必須にしない」状態でした。Windows Server 2025 で新しく AD を作ると、既定値が変わります。
| 項目 | Windows Server 2022 まで | Windows Server 2025(新しく作る AD) |
|---|---|---|
| LDAP 署名(DC) | 任意。署名なしの Bind も受け付ける | 必須。「Domain controller: LDAP server signing requirements enforcement」が既定で有効で、署名のレベルの設定より優先される |
| チャネルバインディング | Never | When supported |
| CBT の監査 | 2023年3月のセキュリティ更新から既定で有効 | 既定で有効 |
| LDAP クライアント | 署名を求めるが、署名・暗号化なしに戻ることもある | 既定で暗号化してつなぐ(Windows 11 24H2 以降も同じ) |
既存の DC を Windows Server 2025 にアップグレードした場合は、もとの署名のポリシーが引き継がれます。ただし、署名のポリシーが何も設定されていなければ、署名は必須になります。いま「なんとなく動いている」古い機器がある環境では、アップグレードや DC の追加の前に、次の章の手順で影響を確かめておくと安心です。
Microsoft は 2019 年にアドバイザリ ADV190023 を出し、LDAP 署名とチャネルバインディングを有効にするよう案内してきました。その後、2020 年・2023 年・2024 年の更新で、設定項目や監査イベントが段階的に追加されています。詳しい経緯は、参考資料の KB4520412 にまとめられています。
必須にする前に:影響を受けるクライアントを探す
署名やチャネルバインディングを必須にすると、対応していないクライアントは AD を使えなくなります。いきなり必須にせず、DC のイベントで影響を受けるクライアントを探してから進めます。
使うイベント
イベントは、DC の アプリケーションとサービス ログ ›› Directory Service に記録されます。
| ID | 種類 | 内容 |
|---|---|---|
| 2886 | 署名 | 起動時の注意。この DC は署名なしの SASL Bind と暗号化なしのシンプルBindを拒否していない |
| 2887 | 署名 | 24時間のまとめ。署名なしの SASL Bind と暗号化なしのシンプルBindを受け付けた件数 |
| 2888 | 署名 | 24時間のまとめ。署名を必須にしているため拒否した件数 |
| 2889 | 署名 | 1件ずつの詳細。クライアントの IP アドレスと、Bind に使ったアカウント、Bind の種類(診断ログが必要) |
| 3040 | CBT | 24時間のまとめ。CBT で守られていない LDAPS の Bind の件数(Never のとき) |
| 3041 | CBT | 起動時と24時間ごとの注意。CBT を確かめるように勧める(Never のとき) |
| 3039 | CBT | 1件ずつ。CBT の確認に失敗したクライアント(診断ログが必要) |
| 3074・3075 | CBT | 1件ずつ。Always にしたら失敗するクライアント、CBT を送っていないクライアント(診断ログが必要) |
1件ずつの詳細(2889・3039・3074・3075)を出すには、DC のレジストリ HKLM\SYSTEM\CurrentControlSet\ の「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 requirements | NTDS\Parameters の LDAPServer | None / Require signing(2) |
| Domain controller: LDAP server signing requirements enforcement | - | Windows Server 2025 の新しい AD では既定で有効 |
| Domain controller: LDAP server channel binding token requirements | NTDS\Parameters の Ldap | Never(0)/ When supported(1)/ Always(2) |
| Network security: LDAP client signing requirements | Services\LDAP の LDAPClient | None / 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、と覚えておくと整理しやすくなります。必須にするときは、イベントで影響を受ける機器を洗い出してから、段階的に進めてください。
- LDAP signing overview for Active Directory Domain Services(Microsoft Learn)
- LDAP channel binding overview for Active Directory Domain Services(Microsoft Learn)
- Configure LDAP signing by using Group Policy for Active Directory Domain Services(Microsoft Learn)
- How to enable LDAP signing in Windows Server(Microsoft Learn)
- LDAP session security settings and requirements after ADV190023 is installed(Microsoft Learn)
- 2020, 2023, and 2024 LDAP channel binding and LDAP signing requirements for Windows(KB4520412)(Microsoft サポート)
- ADV190023:Microsoft Guidance for Enabling LDAP Channel Binding and LDAP Signing(Microsoft)
- Windows security baseline(LDAPClientIntegrity)(Microsoft Learn)
- ldap_sasl_bind_s function(Microsoft Learn)
コメント