次の方法で共有


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

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

元の KB 番号: 103390

まとめ

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

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

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

背景情報

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

Windows では、NTLM を使用する場合、"セッションセットアップ" 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 とハッシュを計算します。 そのため、クライアントによって送信された "ソース ドメイン" が空であるか、不明なドメインである場合、salt とパスワード ハッシュは一致しません。 このような場合、認証の試行は"不明なユーザー名または無効なパスワード" (STATUS_LOGON_FAILURE) エラーで失敗します。 試行の監査イベントは、シンボル STATUS_WRONG_PASSWORD "正しくないパスワード" を報告します。

サンプル イベント:

ログ名: セキュリティ
ソース: Microsoft-Windows-Security-Auditing
イベント ID: 4625
タスク カテゴリ: ログオン
レベル: Information
キーワード: 監査エラー
コンピューター: 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.           
    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

メモ

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

  2. この時点で、ドメイン SID、ユーザー ID、グローバル グループ メンバーシップ、ログオン時間、ログオフ時間、KickOffTime、フル ネーム、パスワード LastSet、パスワード変更フラグ、パスワード変更フラグ、ユーザー スクリプト、プロファイル パス、ホーム ディレクトリ、および無効なパスワードカウントの各情報が、信頼されたドメインから返されます。

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

  4. LsaLookupRestrictIsolatedNameLevel レジストリ エントリと NeverPing レジストリ エントリを使用して、信頼されたドメイン内の分離名の参照とログオンを制限する方法の詳細については、「 Lsass.exe プロセスは、Active Directory ドメイン コントローラーで多くの外部信頼がある場合に応答を停止する可能性がありますを参照してください。 さらに、Windows Server 2008 SP2 で分離名参照要求を識別するためにログ記録を広げる修正プログラムを使用できます。

    • 信頼されたドメインのゲスト アカウントは使用できません。
    • 実際の内部プロセスは、ここで説明するアルゴリズムよりも複雑です。
    • これらのアルゴリズムでは、パススルー認証の実際のメカニズムについては説明しません。 詳細については、「Windows でのNTLM ユーザー認証を参照してください。
    • これらのアルゴリズムでは、Windows で使用されるパスワード暗号化プロセスについては説明しません。 一方向のパスワード ハッシュから派生したバイナリ ラージ オブジェクト (BLOB) は、認証要求の一部として送信されます。 この BLOB の内容は、ログオン用に選択された認証プロトコルによって異なります。
    • この記事では、Microsoft 認証モジュールの内部動作については説明しません。
    • これらのアルゴリズムでは、ゲスト アカウントが有効になっている場合、パスワードがないことを前提としています。 既定では、ゲスト アカウントには Windows のパスワードがありません。 ゲスト アカウントのパスワードが指定されている場合、SMB で送信されるユーザー パスワードは、そのゲスト アカウントのパスワードと一致する必要があります。

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

例 1

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

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

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

Note

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

構成

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

  • ログイン アカウント: USER1
  • パスワード: PSW1
  • ログイン ドメイン: LOCAL1

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

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

NET-DOMAIN ドメイン:

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

CONTOSO-DOMAIN ドメイン:

  • サーバー名: CONTOSO
  • ドメイン: CONTOSO-DOMAIN
  • ドメイン データベースにアカウントが含まれています: USER1
  • ドメイン データベースにパスワードが含まれている: PSW1

この例では、コンピューターは、コンピューターのドメイン アカウントが存在する CONTOSO-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: \\CONTOSO\share コマンドを実行すると、次の手順が実行されます。

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

    • account = "USER1"
    • password = "PSW1"
    • ___domain = "LOCAL1"
  2. \\CONTOSO サーバーは SMB を受信し、アカウント名を調べます。

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

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

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

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

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

回避策

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

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

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

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

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

NET USE /?  

NULL ドメイン名

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

Note

通常、SMB には "NULL" という 2 つの表現があります。長さ 0 のドメイン名と、疑問符文字 (?) で構成される 1 バイトのドメイン名です。 SMB サーバーは疑問符をキャッチし、ローカル セキュリティ機関 (LSA) に渡す前に NULL に変換します。

トラブルシューティング

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

Windows ドメイン コントローラー

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

Windows 2000 のドメイン設定

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

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

  1. 管理ツールから、ローカル セキュリティ ポリシーを開始します。
  2. Advanced Audit Policy Configuration – ローカル グループ ポリシー オブジェクトを開きます。
  3. Account Logon を選択し、Audit Credential Validation オプションと Failure オプションを選択します。
  4. これで、ネットワーク ユーザーがこのサーバーにリモートでアクセスするたびに、監査証跡がイベント ビューアーに記録されます。 イベント ビューアーでこれらのイベントを表示するには、Log メニューの Security をクリックします。

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