「2020 年 LDAP チャネル バインディングと LDAP 署名を有効」について調べてみた

#はじめに
MSより2020 年初頭の Windowsアップデート(1/19確認時点では3月予定)に「LDAP 署名有効化」「LDAP チャネルバインディング （LDAPS 利用時）化」になるようです。

[Windows の 2020 年 LDAP 署名と LDAP チャネル バインディングの要件](https://support.microsoft.com/ja-jp/help/4520412/2020-ldap-channel-binding-and-ldap-signing-requirement-for-windows)
[[AD管理者向け] 2020 年 LDAP 署名と LDAP チャネルバインディングが有効化。確認を！](https://msrc-blog.microsoft.com/2019/10/02/ldapbinding/)

これを見てみたんですけど、はっきり言って**よく分からん**
ただ、影響範囲はでかそうな割に確かな情報がないので、検証しつつどのような対応が必要になるのかを書いていきます。

※認識違う部分ありましたらコメント頂ければとおもいます。

#アップデートの内容について
今後はLDAP通信はセキュリティ的にあれなので、LDAP署名を有効化しましょうというのが主旨です。


#LDAP 署名とは
そもそも「LDAP署名」とは何か？
これは単純にLDAPS通信(636)のことでしょ。

と思っていたら、よく調べてみると厳密には違いました。

[こちら](https://docs.microsoft.com/ja-jp/windows/security/threat-protection/security-policy-settings/domain-controller-ldap-server-signing-requirements)に以下のような記載を発見。


>署名が必要な場合、SSL を使用していない LDAP 簡易バインドは拒否されます (LDAP TCP/389)。

LDAP(AD)の認証にはいくつか種類があります。
・匿名(anonymous)認証
　⇒匿名による認証
　　クライアントは特に認証を必要とすることなく，LDAPの各エントリにアクセスできるようになる。

・簡易認証(simple bind)
　 ⇒平文パスワードによる単純な認証

・SASL認証(SASL bind)
　 ⇒ざっくりいうとセキュリティの高い認証方式。詳細は参照
https://www.ipa.go.jp/security/rfc/RFC2222JA.html

・DIGEST-MD5方式
　⇒パスワードから，元の文字を推測できない（ハッシュで変換）"チャレンジ"と呼ばれるワンタイムレベルの文字列を送り，それに応答する"レスポンス"を使って行なわれる認証
　　データは暗号化されていないが、パスワードは盗聴されない。

・kerberos認証
　⇒Kerberos v5に準拠した，Active Directory標準の認証プロトコル
　　KDCと呼ばれる認証機関から認証チケットを得ることで，チケットが有効な間，認証されたサービスにアクセスできるようになる。

つまり、**TCP/389を使用した<font color="red">簡易認証方式</font>は今後拒否される**、が正しい理解のようです。


#LDAP チャネルバインディングとは
##とりあえず調べてみた
チャネルバインディングとは、GSS-APIと呼ばれる認証のフレームワークの中で出てくる用語です。

なんのこっちゃ？

調べてみる、ADにはSPNEGO(読み方:スプネゴ) というSSOに使用されている仕組みがあり、そこでGSS-APIが用いられているようです。

話を戻すと、チャネルバインディングとは使用されている特定のデータチャネルを識別するためのタグのことです。
具体的には、チャネルバインディングは起動側と受け入れ側)を識別します。
これらのタグは起動側と受け入れ側のアプリケーションに固有であるため、識別情報のより有効な証明となります。

でチャネルバインディングトークン(CBT)と呼ばれるものはMSが独自にGSS-APIの仕組みを用いて開発したもののようです。

##具体例をみてみる。
MSの以下サイトを参考にします。
[認証の拡張保護の概要](https://docs.microsoft.com/ja-jp/dotnet/framework/wcf/feature-details/extended-protection-for-authentication-overview)

HTTPSに置き換えて説明します。(LDAPS通信でも基本的には同様です。)
以下の登場人物がいるパターン
・クライアント
・サーバー
・攻撃者

攻撃者はあたかも自分がサーバーであるかのように見せて、
本来であれば
クライアント⇒サーバー　となる接続を
クライアント⇒攻撃者⇒サーバー　へ変えてしまいます。

そうなると、SSLチャネルは2つ作成されます。
・クライアントと攻撃者間
・攻撃者とサーバー間

そうすると、資格情報はクライアントから攻撃者にわたり
攻撃者からサーバーへ渡っていくので、サーバーから見たら正しい資格情報が送信された、としかみなさないため
通信が許可されてしまいます。

それを防ぐためにチャネルバインディングトークン(CBT)という仕組みがあります。
ざっくりいうと、CBTはTLSのチャネルのプロパティに認証情報的なものを保持していて
チャネルの送信先によって特定されます。
つまりクライアントと攻撃者のCBT、攻撃者とクライアント間のCBTは異なるため
サーバー側でCBTを比較して、攻撃を検知することができます。


今回の内容でいえば、LDAPS通信だけでは攻撃を防ぐことはできないので
CBTも有効にしましょう、というのがMSの考え方なのだと思われます。

#結局どういうこと？
今回のアップデートに関しては、以下のようになります。
・LDAP署名の有効化(簡易認証のLDAP通信は使えないよ)
・LDAPチャネルバインディングの有効化(LDAPS通信にはCBTを使うよ)

なので、このアップデートを適用すると
・簡易認証方式におけるLDAP通信はできなくなる
・LDAPS通信の際に、クライアントがCBTに適応していない場合、通信が拒否される。

#クライアントの影響は？
大きく分けてクライアントは以下の2つがあると思います。
・ドメインユーザー
・サードパーティー製品によるAD参照

まずドメインユーザーについてですが、ドメインユーザーがADに認証を行う際にはkerberos認証を使っています。
この場合、ldapのバインドはセキュリティ保護されているため今回のLDAP署名云々には引っ掛かりません。

問題なのはサードパーティー製品によるAD参照です。
該当製品がシンプル認証のTCP/389でLDAP認証を行っている場合、アップデート後には通信できなくなります。
この際にADSIを用いていたり、MD-5などの認証を行っている場合は該当しないので影響はありません。(今まで通りLDAPの設定自体は389のままでいける)
※ちなみにADSIもGSSAPIを用いて作られている＝SASLを用いているわけなので今回のLDAP署名云々には関係ないようです。

#必要な対応について
[こちら](https://www.upken.jp/kb/ymqulEUWICCNHNUrJrMkueLluONMbh.html)のページに以下のような対処法がありました。
>◆Windowsの場合
ドメインに参加し、ADSI を使用します。
アプリケーションに大幅な改修が必要になるかもしれません。

>◆Linuxの場合
ドメイン コントローラー側で「Active Directory 証明書サービス」をインストールします。 「証明機関」スナップインから DER 形式の CA ルート証明書が取得できます。

つまりWindowsの場合はADSIを使用してLDAP問い合わせをすれば問題なく使用できる。
Linuxの場合は直でLDAP参照(簡易認証)をしていることが多いと思われるため、AD側に証明書の設定が必要で、LDAPS(636)での通信が必要となります。

なので、ADをLDAP参照しているシステムがある場合
**・ADSIを使用しているか
・簡易認証以外の方式で接続しているか**
がカギとなります。

もし上記に当てはまらない場合は、ADSI対応するorLDAPS化が必要となります。
※ADSI対応というか、SASLに準拠したものであれば大丈夫です。

##ADに証明書の設定は必要？
簡易認証のLDAP通信を使用している場合はSSL化（LDAPS）が必要となります。
その場合はADに証明書をインストールする必要があります。
ADの証明書設定については以下を参照
https://social.technet.microsoft.com/wiki/contents/articles/2980.ldap-over-ssl-ldaps-certificate.aspx
https://support.microsoft.com/en-us/help/321051/how-to-enable-ldap-over-ssl-with-a-third-party-certification-authority

ADSIを使用している、もしくはSASL認証などでAD参照している場合にはADに証明書等は必要ありません。
（システムをADSI化するって結構大変なんだろうか。。。）