locked
セキュリティ アドバイザリ ADV190023 の対応について RRS feed

  • 全般的な情報交換

  • こんにちは、Visual Studio サポート チームです。

    今回は、ADV190023 で公開された LDAP チャネル バインディングと LDAP 署名の有効化に関連し、.NET Framework の System.DirectoryServices名前空間の DirectoryEntry クラス や DirectorySearcher クラスを利用したアプリケーションから LDAP 署名を有効にしたアクセスを実現する方法についてご紹介します。

    前提として、既定値 もしくは AuthenticationTypes.Secure をご指定いただいている アプリケーション開発者様は ADV190023対応後もそのままアプリケーションをご利用いただけます。

    もしアプリケーションが明示的に未署名アクセスを指定している場合、今回のADV190023対応により通信先が常に署名を要求するようになり、LDAP 接続に失敗する可能性があるため後述の対応をご検討ください。

    セキュリティアドバイザリ ADV190023 については以下のドキュメントを参照してください。 

      ADV190023 | LDAP チャネル バインディングと LDAP 署名を有効にするためのマイクロソフト ガイダンス
      https://portal.msrc.microsoft.com/ja-JP/security-guidance/advisory/adv190023

    ============================================
    セキュリティ アドバイザリ ADV190023の対応について
    ============================================
    マイクロソフトでは、2020 年 初頭に Active Directory ドメイン環境内の LDAP 通信の安全性を向上するため、LDAP 署名 および LDAP チャネルバインド に関する既定値の変更を予定しています。

    現在公開中の Windows では、既定の構成において LDAP 接続に LDAP 署名や LDAP チャネルバインディングを必須としていないため、これらが適用されない方式で通信を行われた場合には、悪意のある中間者によって LDAP 通信が攻撃にさらされる可能性があります。今回の対応措置により、Active Directory 環境における LDAP 接続をより安心・安全な環境でご利用いただけるようこれらの機能を既定で有効化することを予定しています。

    具体的な変更点は、以下のとおりです。

    (A) LDAP 署名の必須化
    ----------------------------------------------------------
    LDAP 署名を利用することで、LDAP セッションに署名を行うことができます。これにより、LDAP サーバーと LDAP クライアント 間セッションの改ざんを防止することができます。 LDAP 署名の構成は以下のレジストリキーで保存されており、現在の既定値は 1 です。対応措置により、このレジストリが 2 相当の動作に変更されます。

    キー:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NTDS\Parameters
    名前:LDAPServerIntegrity
    種類:REG_DWORD
    値:1 (下位互換 : サーバーにバインドするためにデータ署名は必須ではない) 
          2 (常に有効 : 署名 を要求しない SASL LDAP バインド、およびクリア テキスト (SSL/TLS 暗号化がされていない) 上で実行される LDAP 簡易バインドを拒否する) 

    (B) LDAP チャネルバインドの 有効化(LDAPS 利用時のみ)
    ----------------------------------------------------------
    LDAP over SSL/TLS (LDAPS) で LDAP チャネルバインディングを利用すると、TLS が動作するトランスポート層からの情報を LDAP が動作するアプリケーション層で適切に利用できます。LDAP チャネルバインドの構成は以下のレジストリキーで保存されており、現在の既定値は 0 です。対応措置により、このレジストリが 1 相当の動作に変更されます。

    キー:HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\NTDS\Parameters
    名前:LdapEnforceChannelBinding
    種類:REG_DWORD
    値:0 (無効 : チャネル バインディング トークン の検証をしない) 
          1 (有効 : チャネル バインディング トークン を検証する) 

    ============================================
    アプリケーションでの対応方法について
    ============================================

    (A) LDAP 署名への対応
    ----------------------------------------------------------
    LDAP 署名の必須化により、署名を要求しない SASL LDAP バインド、およびクリア テキストによる LDAP 簡易バインドの要求は拒否されます。

    これに伴い、DirectoryEntryクラス や DirectorySearcher クラスにて LDAP 署名を有効にしたアクセスする際には、AuthenticationTypes で Secure の指定が必要となります。既定の状態は AuthenticationTypes.Secure であるため、既定値のままご利用いただいている場合は問題ありません。AuthenticationTypes.Anonymous や AuthenticationTypes.None を指定している場合、要求が拒否されます。

    Secure フラグを設定した場合、Active Directory Domain Services は Kerberosもしくは NTLM を使用してクライアントを認証します。

    また、Secure フラグは、他のフラグと組み合わせて使用でき、Signing や SealingのようにSecure フラグとともに設定する必要があるオプションもあります。

    例えば、特定パスに紐づくディレクトリエントリオブジェクトに対してDirectoryEntry クラスでセキュアにバインドする場合、以下のように実装します。

      -----------------------------------------------------------
     DirectoryEntry objDE;
       String strPath="LDAP://DC=onecity,DC=corp,DC=fabrikam,DC=com";

        if(args.Length>0)strPath=args[1];

         // Create a new DirectoryEntry with the given path.
       objDE=new DirectoryEntry(strPath, “user”, “pass”, AuthenticationTypes.Secure | AuthenticationTypes.Sealing);

       foreach(DirectoryEntry objChildDE in objDE.Children)
        Console.WriteLine(objChildDE.Path);

      -----------------------------------------------------------

    この他、Active Directory Domain Services 側が SSL (Secure Sockets Layer) 暗号化を構成している場合(LDAPS を利用可能な状態になっている場合)、以下のように SecureSocketsLayer フラグを指定して SSL/TLS レイヤーで通信を暗号化する方法も有効です。

       -----------------------------------------------------------

        objDE=new DirectoryEntry(strPath, “user”, “pass”, AuthenticationTypes.SecureSocketsLayer);

       -----------------------------------------------------------

    (参考情報)
    .NET Framework では System.DirectoryServices 名前空間の DirectoryEntry クラス や DirectorySearcher クラスを利用して Active Directory サービスインターフェイス(ADSI)プロバイダーを使用した オブジェクトへのバインド、属性読み取りや更新・検索を実現できます。

    System.DirectoryServices 名前空間の詳細につきましては、以下のドキュメントを参照してください。

     System.DirectoryServices Namespace
     https://docs.microsoft.com/en-us/dotnet/api/system.directoryservices?view=netframework-4.8

     DirectoryEntry クラス
     https://docs.microsoft.com/ja-jp/dotnet/api/system.directoryservices.directoryentry?view=netframework-4.8

     DirectorySearcher クラス
     https://docs.microsoft.com/ja-jp/dotnet/api/system.directoryservices.directorysearcher?view=netframework-4.8

      AuthenticationTypes 列挙型
     https://docs.microsoft.com/ja-jp/dotnet/api/system.directoryservices.authenticationtypes?view=netframework-4.8

    (B) LDAP チャネルバインドの対応(LDAPS 利用時のみ)
    ----------------------------------------------------------
    更新プログラムを適用してサーバー既定値が変更されても、CBT (Channel Binding Tokens) に対応したクライアントであれば利用する、CBT に対応していないクライアントであればこれまで通り動作する、という内容であるため、従来接続できていたアプリケーションが接続できなくなるといった影響はございません。

    また、クライアント側で CVE-2017-8563 の脆弱性に対応した更新プログラムを適用していただくことで、セキュアな状態で通信をご利用いただくことができます。

    今回のご案内は以上です。私どもサポートでは今後もお客様によりセキュアな製品利用を進めていただけるよう情報を公開していきます。

    2019年11月26日 1:45
    所有者