Windows Server 2003、Windows XP、Windows 2000 のネットワーク アクセス検証アルゴリズムと例

この記事では、NTLM プロトコルを使用したネットワーク アクセス中に Windows アカウントの検証がどのように機能するかを説明します。

適用対象: Windows 10 - すべてのエディション、Windows Server 2012 R2
元の KB 番号: 103390

概要

NTLM プロトコルを使用したネットワーク アクセス中に Windows アカウントの検証がどのように機能するかを説明する簡略化されたアルゴリズムを次に示します。 この例では、サーバー メッセージ ブロック (SMB) プロトコル経由のアクセスを使用していますが、NTLM 認証をサポートする他のすべてのサーバー アプリケーションに適用されます。 この説明では、このプロセスの内部作業については説明しません。 この情報を使用すると、決定論的な条件下での Windows ネットワーク ログオンの動作を予測できます。

Kerberos を使用してユーザーを認証し、サーバー リソースへのアクセスを取得する場合、プロセスは NTLM の機能とは異なります。

ローカル データベースはドメイン データベースであり、ドメイン コントローラー上の唯一のデータベースであることを忘れないでください。 ただし、他のサーバーとすべてのコンピューターでは、ローカル データベースはドメイン コントローラーとは異なります。

背景情報

2 台の Windows Server 2003 ベース、Windows XP ベース、または Windows 2000 ベースのコンピューターがネットワーク経由で通信する場合、サーバー メッセージ ブロック (SMB) と呼ばれる高レベルのプロトコルを使用します。 SMB コマンドは、NetBIOS 拡張ユーザー インターフェイス (NetBEUI) や TCP/IP などのトランスポート プロトコルに埋め込まれています。 たとえば、クライアント コンピューターがコマンドを NET USE 実行すると、"SMB セッションセットアップと X" フレームが送信されます。

Windows では、"セッション セットアップ" SMB には、暗号化されたパスワードとログオン ドメインのハッシュ関数であるユーザー アカウントが含まれています。 ドメイン コントローラーは、この情報をすべて調べて、クライアントが NET USE コマンドを完了するためのアクセス許可を持っているかどうかを判断します。

アルゴリズム

Windows クライアント コンピューターは、次のコマンドをサーバーに送信します。

NET USE x: \\server\share

Windows クライアント コンピューターは、ログイン ドメイン、ユーザー アカウント、およびパスワードを含む "セッション セットアップ" SMB を送信します。

サーバーは、SMB によって指定されたドメイン名またはコンピューター名を調べます。 名前がサーバーの独自の名前の場合は、次のアルゴリズムが実行されます。

    It checks its own domain database or computer database for
        a matching account.
    If it finds a matching account then
        The SMB password is compared to the domain database password or the computer database password.
        If  the password matches then
            The command completed successfully.
        If  the password does NOT match then
            The user is prompted for a password.
                The password is retested as above.
            System error 1326 has occurred. Logon failure: unknown
            user name or bad password.
        End
    If  it does NOT find the account in the domain Security Accounts Manager (SAM) database or computer SAM database then
        Guest permissions are tested.
        If  the guest account is enabled
            The command completed successfully.
        If  the guest account is disabled
            (* See Note a).
            The user is prompted for a password.
            System error 1326 has occurred. Logon failure:
                unknown user name or bad password.
        End

SMB で指定されたドメインがサーバーが信頼するドメインである場合は、次のアルゴリズムが実行されます。

    The server will do pass-through authentication. The
        network logon request will be sent to a server that has a domain controller role in the
        specified trusted domain.

セキュリティで保護されたチャネルが設定されていない場合は、次のアルゴリズムが実行されます。

The trusted domain controller checks its own domain database
        for a matching account.
    If the trusted domain controller finds a matching account, then
       NOT for Windows 2000 and later versions:
    It determines whether the account is a local or global account.
       If the account is local, then
           Guest permissions on the original server are tested.
           If the guest account is enabled
               The command completed successfully.
           If the guest account is disabled
               (* See Note 1) The user is prompted for a password.
               System error 1326 has occurred. Logon failure:
               unknown user name or bad password.
        End
        If the account is global (the only option for Active Directory)
           The SMB password is compared to the domain database
               password.
           If  the password matches, then
               The command completed successfully.
               (* See Note 2)
           If  the password does NOT match, then
               The user is prompted for a password.
                   The password is retested as above.
               System error 1326 has occurred. Logon failure:
               unknown user name or bad password.
       End
    If the trusted domain controller does NOT find the account in the trusted domain controller
           database, then
       Guest permissions are tested on the original server, not the trusted domain.  (* See Note 3)
       If  the guest account is enabled
           The user will have original server guest access.
           The command completed successfully.
       If  the guest account is disabled
           (* See Note 1) The user is prompted for a password.
           System error 1326 has occurred. Logon failure:
           unknown user name or bad password.
    End

重要

次のケースでは、クライアントが、サーバーが持っている、または認識しているユーザー ドメインとは異なるユーザー ドメインを使用するシナリオについて説明します。 NTLMv2 認証プロトコルがネゴシエートされるときに、この不一致に問題があります。 v2 の NTLM ではパスワードソルトが使用され、ユーザー ドメインはこの salt でクライアントによって使用されます。

サーバーが情報を取得し、ローカル データベース内のユーザーを検索すると、サーバーは LOCAL データベースの名前を使用して salt とハッシュを計算します。 したがって、クライアントによって送信される "ソース ドメイン" が空であるか、不明なドメインである場合、ソルトとパスワード ハッシュは一致しません。 このような場合、認証試行は "不明なユーザー名または不適切なパスワード" (STATUS_LOGON_FAILURE) エラーで失敗します。 試行の監査イベントでは、"正しくないパスワード" シンボル STATUS_WRONG_PASSWORDが報告されます。

サンプル イベント:

ログ名: セキュリティ
ソース: Microsoft-Windows-Security-Auditing
イベント ID: 4625
タスク カテゴリ: ログオン
レベル: 情報
キーワード: 監査エラー
コンピューター: server-computer1
説明:
アカウントのログオンに失敗しました。

件名:

セキュリティ ID: NULL SID
アカウント名: -
アカウント ドメイン: -
ログオン ID: 0x0

ログオンの種類: 3

ログオンに失敗したアカウント:

セキュリティ ID: NULL SID
アカウント名: ntadmin
アカウント ドメイン: client-computer1

エラー情報:

失敗の理由: 不明なユーザー名または不適切なパスワード。
状態: 0xc000006d
サブ状態: 0xc000006a
...

詳細情報:

ログオン プロセス: NtLmSsp
認証パッケージ: NTLM
転送されたサービス: -
パッケージ名 (NTLM のみ): -
キーの長さ: 0

このシナリオを回避するには、クライアントに正しいドメイン名を明示的に含める必要があります。 ワークグループ シナリオでのドライブ マッピングの場合、次のようになります。
Net use x: \\server-computer1\data /u:server-computer1\ntadmin *

SMB で指定されたドメインがサーバーによって不明な場合など、ドメインが指定されたが、信頼されたドメインまたはそのドメイン コントローラーとしてサーバーによって認識されなかった場合は、次のアルゴリズムが実行されます。

    It  will check its own account database for
        a matching account
    If  the server finds a matching account, then
        The SMB password is compared to the domain database password or the computer database password.
        If  the password matches, then
            The command completed successfully.
        If  the password does NOT match, then
            The user is prompted for a password.
                The password is retested as above.
            System error 1326 has occurred. Logon failure: unknown
            user name or bad password.
    End
    If  it does NOT find the account in the domain database then
        guest permissions are tested.
        If  the guest account is enabled
            The command completed successfully.
        If  the guest account is disabled
            System error 1326 has occurred. Logon failure:
            unknown user name or bad password.
    End

SMB で指定されたドメインが NULL である場合、つまりドメインが指定されていない場合は、次のアルゴリズムが実行されます。

    The server will treat this as a local network logon. The server
        will test for a matching account in its own database.
    If  it finds a matching account, then
        The SMB password is compared to the SAM database password.
        If  the password matches, then
            The command completed successfully.
        If  the password does NOT match, then
            The user is prompted for a password.
                The password is retested as above.
            System error 1326 has occurred. Logon failure: unknown
            user name or bad password.
    End
    If  it does NOT find the account in the local SAM database AND
      LsaLookupRestrictIsolatedNameLevel=0 AND NeverPing=0, then (* See Note 4)
        The server will simultaneously ask each domain that it trusts whether it has account that
            matches the SMB account.
        The first trusted domain to reply is sent a request to
            perform pass-through authentication of the client
            information.
        The trusted domain will look in its own database.
        If  an account that matches the SMB account is found, then
            The trusted domain determines whether the account is a local or global
                account.
           Not for Windows 2000 and later versions:
            If  the account is local then
                Guest permissions on the original server are tested.
                If  the guest account is enabled
                    The command completed successfully.
                If  the guest account is disabled
                The user will be prompted for a password.
                Regardless of what password is entered, the user will receive
                    "Error 5: Access has been denied."
            End
            If  the account is global (the only option for Active Directory)
                The password that was specified in the SMB is compared
                    to the SAM database password.
                If  the password matches, then
                    The command completed successfully.
                If  the password does NOT match, then
                    The user is prompted for a password.
                        The password is retested as above.
                    System error 1326 has occurred. Logon failure:
                    unknown user name or bad password.
            End
    If  no trusted domains respond to the request to identify the
        account, then
        Guest permissions are tested on the original server,
            not the trusted server.
        If  the guest account is enabled
            The command completed successfully.
        If  the guest account is disabled
            System error 1326 has occurred. Logon failure:
            unknown user name or bad password.
    End

Notes (メモ)

  1. ゲスト アカウントが無効で、ユーザーにアカウントがない場合でも、サーバーはパスワードを要求します。 パスワードは要件を満たしませんが、サーバーはセキュリティ対策としてパスワードを要求します。 このセキュリティ対策は、未承認のユーザーが、アカウントが存在するケースとアカウントが存在しない場合の違いを判断できないことを保証します。 アカウントが存在するかどうかに関係なく、ユーザーは常にパスワードの入力を求められます。

  2. この時点で、ドメイン SID、ユーザー ID、グローバル グループ メンバーシップ、ログオン時間、ログオフ時間、KickOffTime、Full Name、Password LastSet、Password Can Change Flag、Password Must Change Flag、User Script、Profile Path、Home Directory、Bad Password Count の各情報が、信頼されたドメインから返されます。

  3. 信頼されたドメインにアカウントが見つからない場合、オペレーティング システムはローカル ゲスト アカウントを使用して、サーバーに対する認証の一貫性のある動作を保証する必要があります。

  4. LsaLookupRestrictIsolatedNameLevel レジストリ エントリと NeverPing レジストリ エントリを使用して、信頼されたドメイン内の分離名の参照とログオンを制限する方法の詳細については、「 Active Directory ドメイン コントローラーに対して多数の外部信頼がある場合、Lsass.exe プロセスが応答を停止する可能性がある」を参照してください。

    • 信頼されたドメインのゲスト アカウントは使用できません。

    • 実際の内部プロセスは、ここで説明するアルゴリズムよりも複雑です。

    • これらのアルゴリズムでは、パススルー認証の実際の仕組みについては説明しません。 詳細については、「Windows での NTLM ユーザー認証」を参照してください。

    • これらのアルゴリズムでは、Windows Server 2003、Windows XP、および Windows 2000 で使用されるパスワード暗号化プロセスについては説明しません。 一方向パスワード ハッシュから派生したバイナリ ラージ オブジェクト (BLOB) は、認証要求の一部として送信されます。 この BLOB の内容は、ログオン用に選択された認証プロトコルによって異なります。

    • この記事では、Microsoft 認証モジュールの内部的な動作については説明しません。

    • これらのアルゴリズムでは、ゲスト アカウントが有効な場合、パスワードがないことを前提としています。 既定では、ゲスト アカウントには Windows Server 2003、Windows XP、および Windows 2000 のパスワードがありません。 ゲスト アカウントのパスワードが指定されている場合、SMB で送信されるユーザー パスワードは、そのゲスト アカウントのパスワードと一致する必要があります。

これらのアルゴリズムの動作例を次に示します。

例 1

SCRATCH-DOMAIN ドメイン アカウント データベースにあるのと同じアカウント名とパスワードを使用して、コンピューターにログオンします。 SCRATCH-DOMAIN ドメインの NET USE \\SCRATCH ドメイン コントローラーに対してコマンドを実行すると、コマンドは正常に完了します。 SCRATCH-DOMAIN ドメインを NET USE \\NET 信頼するドメイン コントローラーに対してコマンドを実行すると、次のエラー メッセージが表示されます。

システム エラー 1326 が発生しました。 ログオン失敗: ユーザー名を認識できないか、またはパスワードが間違っています。

\SCRATCH-DOMAIN\USER1 アカウントには、\\NET に対するアクセス許可があります。

注:

この例では、次の構成を前提としています。

構成

ローカル セキュリティ機関を持つコンピューター:

-Login account: USER1
-Password: PSW1
-Login Domain: LOCAL1

Active Directory ドメイン コントローラー:

-Server Name: NET</WWITEM>
-Domain: NET-DOMAIN</WWITEM>
-Trust: NET-DOMAIN Trust SCRATCH-DOMAIN (したがって、
SCRATCH-DOMAIN のアカウントにアクセス許可を付与できます
NET-DOMAIN 内)。

NET-DOMAIN ドメイン:

  • NET-DOMAIN ドメインのドメイン アカウント データベースには、USER1 のアカウントが含まれていません。
  • ゲスト アカウントが無効になっています。

Windows Server 2003:

-Server Name: SCRATCH
-Domain: SCRATCH-DOMAIN
-Domain Database にアカウントが含まれています: USER1
-Domain Database にパスワードが含まれています: PSW1

この例では、コンピューターのドメイン アカウントが存在する SCRATCH-DOMAIN ドメインではなく、コンピューターがローカル ドメインにログオンしています。

例 2

コマンドを NET USE x: \\NET\share 実行すると、次の手順が実行されます。

  1. コンピューターは、"セッションセットアップ" SMB で次を送信します。

    • account = "USER1"
    • password = "PSW1"
    • domain = "LOCAL1"
  2. \\NET サーバーは SMB を受け取り、アカウント名を確認しました。

  3. サーバーはローカル ドメイン アカウント データベースを調べ、一致するものが見つかりません。

  4. その後、サーバーは SMB ドメイン名を調べます。

  5. サーバーは "LOCAL1" を信頼しないため、サーバーは信頼されたドメインをチェックしません。

  6. その後、サーバーはゲスト アカウントを確認します。

  7. ゲスト アカウントが無効になっているので、"システム エラー 1326 が発生しました。 ログオンエラー: 不明なユーザー名またはパスワードが正しくありません。エラー メッセージが生成されます。

例 3

コマンドを NET USE x: \\SCRATCH\share 実行すると、次の手順が実行されます。

  1. コンピューターは、"セッションセットアップ" SMB で次を送信します。

    • account = "USER1"
    • password = "PSW1"
    • domain = "LOCAL1"
  2. \\SCRATCH サーバーは SMB を受け取り、アカウント名を調べます。

  3. サーバーはローカル ドメイン アカウント データベースを調べ、一致するものを見つけます。

  4. その後、サーバーは SMB パスワードとドメイン アカウントのパスワードを比較します。

  5. パスワードが一致します。

そのため、"コマンドが正常に完了しました" というメッセージが生成されます。 例 2 と例 3 では、信頼関係は使用できません。 コンピューターが SCRATCH-DOMAIN ドメインにログオンしていた場合、 NET USE x: \\NET\share コマンドは正常に実行されました。

理想的な解決策は、すべてのコンピューターがドメインにログオンすることです。 ログオンするには、ユーザーがドメイン、アカウント、パスワードを指定する必要があります。 これを行うと、すべての NET USE -type コマンドで正しいドメイン、アカウント、およびパスワードの情報が渡されます。 管理者は、コンピューターと複数のドメインの両方で重複するアカウントを回避する必要があります。 Windows Server 2003 ベース、Windows XP ベース、および Windows 2000 ベースのコンピューターは、ドメイン間の信頼を使用し、ドメイン データベースを使用できるメンバーを使用して、この構成を回避するのに役立ちます。

回避策

このような場合に使用できる回避策は 1 つあります。 コンピューターから、次のコマンドを実行できます。

NET USE X: \\NET\SHARE /USER:SCRATCH-DOMAIN\USER1 PSW1

このコマンドでは、次のようになります。

  • \\NET = アクセスするドメイン コントローラーのコンピューター名。
  • \SHARE = 共有名。
  • /USER: "セッション セットアップ" SMB で指定する必要があるドメイン、アカウント、パスワードを指定できるコマンド ライン パラメーター。
  • SCRATCH-DOMAIN = ユーザー アカウントが存在するドメインのドメイン名。
  • \USER1 = 検証対象のアカウント。
  • PSW1 = ドメイン上のアカウントと一致するパスワード。

このコマンドの詳細については、コマンド プロンプトで次のように入力します。

NET USE /?  

NULL ドメイン名

Windows Server 2003、Windows XP、および Windows 2000 に含まれる Microsoft SMB クライアントは、"セッションセットアップ SMB [x73]" SMB で NULL ドメイン名を送信します。 Microsoft SMB クライアントは、ログオン ドメイン名を指定し、ドメイン名が NET USE コマンドで指定されていない場合は NULL 文字を送信することで、ドメイン名を処理します。 Microsoft SMB クライアントは、例 1 で説明されている動作も示します。

注:

  • 既定のドメイン名は、"DOMAIN =" 行の LANMAN.INI ファイルで指定されます。 これは、 コマンドを使用NET LOGONして/DOMAIN:スイッチによってオーバーライドできます。
  • 通常、SMB には "NULL" の 2 つの表現があります。長さ 0 のドメイン名と、疑問符文字 (?) で構成される 1 バイト のドメイン名です。 SMB サーバーは疑問符をキャッチし、ローカル セキュリティ機関 (LSA) に渡す前に NULL に変換します。

トラブルシューティング

ネットワーク アクセスの問題のトラブルシューティングに役立つヒントは、次の手順を実行して監査を有効にすることです。

Windows 2000 以降のバージョンの Windows 2000 ベースのドメイン コントローラー

  1. ドメイン コントローラーの管理ツールから、Active Directory ユーザーとコンピューターを開始します。
  2. [ドメイン コントローラー OU] を右クリックし、[プロパティ] をクリックします。
  3. [グループ ポリシー] タブで、[既定のドメイン コントローラー ポリシー] をダブルクリックします。
  4. ポリシー エディターで、[コンピューターの設定] をクリックし、[Windows の設定] をクリックし、[セキュリティ設定] をクリックし、[ローカル ポリシー] をクリックして、[監査ポリシー] をクリックします。
  5. [ ログオンとアカウントログオンの成功 ] オプションと [ 失敗 ] オプションを選択します。

Windows 2000 サーバーとメンバーのドメイン設定

  1. ドメイン コントローラーの管理ツールから、Active Directory ユーザーとコンピューターを開始します。
  2. ドメイン名を右クリックし、[ プロパティ] をクリックします。
  3. [グループ ポリシー] タブで、[既定のドメイン ポリシー] をダブルクリックします。
  4. ポリシー エディターで、[コンピューターの設定] をクリックし、[Windows の設定] をクリックし、[セキュリティ設定] をクリックし、[ローカル ポリシー] をクリックして、[監査ポリシー] をクリックします。
  5. [ ログオンとアカウントログオンの成功 ] オプションと [ 失敗 ] オプションを選択します。

Windows 2000 サーバーとメンバーのローカル設定

  1. 管理ツールから、ローカル セキュリティ ポリシーを開始します。
  2. 監査ポリシーを開きます。
  3. [ ログオンとアカウントログオンの成功 ] オプションと [ 失敗 ] オプションを選択します。 これで、ネットワーク ユーザーがこのサーバーにリモートでアクセスするたびに、監査証跡がイベント ビューアーに記録されます。 イベント ビューアーでこれらのイベントを表示するには、[ログ] メニューの [セキュリティ] をクリックします。

信頼関係、パススルー認証、ユーザーアクセス許可、ドメイン ログインの詳細については、「Windows Server 2003 Security Services の技術的な概要」を参照してください。

詳細

基本的には、同じネットワーク アクセス検証アルゴリズムが Windows Server 2008、Windows Server 2008 R2、Windows Server 2012、Windows Server 2012 R2 に適用されます。

これらの OS には、SMB のいくつかの新機能があります。

Windows Server 2008

Windows Server 2012