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 (メモ)
ゲスト アカウントが無効で、ユーザーにアカウントがない場合でも、サーバーはパスワードを要求します。 パスワードは要件を満たしませんが、サーバーはセキュリティ対策としてパスワードを要求します。 このセキュリティ対策は、未承認のユーザーが、アカウントが存在するケースとアカウントが存在しない場合の違いを判断できないことを保証します。 アカウントが存在するかどうかに関係なく、ユーザーは常にパスワードの入力を求められます。
この時点で、ドメイン SID、ユーザー ID、グローバル グループ メンバーシップ、ログオン時間、ログオフ時間、KickOffTime、Full Name、Password LastSet、Password Can Change Flag、Password Must Change Flag、User Script、Profile Path、Home Directory、Bad Password Count の各情報が、信頼されたドメインから返されます。
信頼されたドメインにアカウントが見つからない場合、オペレーティング システムはローカル ゲスト アカウントを使用して、サーバーに対する認証の一貫性のある動作を保証する必要があります。
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
実行すると、次の手順が実行されます。
コンピューターは、"セッションセットアップ" SMB で次を送信します。
- account = "USER1"
- password = "PSW1"
- domain = "LOCAL1"
\\NET サーバーは SMB を受け取り、アカウント名を確認しました。
サーバーはローカル ドメイン アカウント データベースを調べ、一致するものが見つかりません。
その後、サーバーは SMB ドメイン名を調べます。
サーバーは "LOCAL1" を信頼しないため、サーバーは信頼されたドメインをチェックしません。
その後、サーバーはゲスト アカウントを確認します。
ゲスト アカウントが無効になっているので、"システム エラー 1326 が発生しました。 ログオンエラー: 不明なユーザー名またはパスワードが正しくありません。エラー メッセージが生成されます。
例 3
コマンドを NET USE x: \\SCRATCH\share
実行すると、次の手順が実行されます。
コンピューターは、"セッションセットアップ" SMB で次を送信します。
- account = "USER1"
- password = "PSW1"
- domain = "LOCAL1"
\\SCRATCH サーバーは SMB を受け取り、アカウント名を調べます。
サーバーはローカル ドメイン アカウント データベースを調べ、一致するものを見つけます。
その後、サーバーは SMB パスワードとドメイン アカウントのパスワードを比較します。
パスワードが一致します。
そのため、"コマンドが正常に完了しました" というメッセージが生成されます。 例 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 ベースのドメイン コントローラー
- ドメイン コントローラーの管理ツールから、Active Directory ユーザーとコンピューターを開始します。
- [ドメイン コントローラー OU] を右クリックし、[プロパティ] をクリックします。
- [グループ ポリシー] タブで、[既定のドメイン コントローラー ポリシー] をダブルクリックします。
- ポリシー エディターで、[コンピューターの設定] をクリックし、[Windows の設定] をクリックし、[セキュリティ設定] をクリックし、[ローカル ポリシー] をクリックして、[監査ポリシー] をクリックします。
- [ ログオンとアカウントログオンの成功 ] オプションと [ 失敗 ] オプションを選択します。
Windows 2000 サーバーとメンバーのドメイン設定
- ドメイン コントローラーの管理ツールから、Active Directory ユーザーとコンピューターを開始します。
- ドメイン名を右クリックし、[ プロパティ] をクリックします。
- [グループ ポリシー] タブで、[既定のドメイン ポリシー] をダブルクリックします。
- ポリシー エディターで、[コンピューターの設定] をクリックし、[Windows の設定] をクリックし、[セキュリティ設定] をクリックし、[ローカル ポリシー] をクリックして、[監査ポリシー] をクリックします。
- [ ログオンとアカウントログオンの成功 ] オプションと [ 失敗 ] オプションを選択します。
Windows 2000 サーバーとメンバーのローカル設定
- 管理ツールから、ローカル セキュリティ ポリシーを開始します。
- 監査ポリシーを開きます。
- [ ログオンとアカウントログオンの成功 ] オプションと [ 失敗 ] オプションを選択します。 これで、ネットワーク ユーザーがこのサーバーにリモートでアクセスするたびに、監査証跡がイベント ビューアーに記録されます。 イベント ビューアーでこれらのイベントを表示するには、[ログ] メニューの [セキュリティ] をクリックします。
信頼関係、パススルー認証、ユーザーアクセス許可、ドメイン ログインの詳細については、「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
フィードバック
https://aka.ms/ContentUserFeedback。
近日公開予定: 2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub イシューを段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、以下を参照してください:フィードバックの送信と表示