ドメインに参加しているコンピューターと、ドメイン コントローラーは「セキュアチャネル」と呼ばれる、保護された安全な通信を確立しています。セキュアチャネルが正常に確立できないと、コンピューターにログオンできない等のトラブルが発生する可能性があります。
今回は、セキュアチャネルの基本概念と一般的なトラブルについて紹介します。
セキュアチャネルとは?
ドメインに参加している Windows OS 端末(ドメイン メンバーと呼びます)は、ドメイン コントローラーとの通信を保護するために、「セキュアチャネル」と呼ばれる安全な通信チャネルを確立します。ドメイン メンバーとなっているクライアントやサーバーは、認証に使用される資格情報などを、安全な状態でネットワークを経由してドメイン コントローラーとやり取りします。
セキュアチャネルは、以下の図のように、ドメイン メンバーごとに個別にドメイン コントローラー 1 台と確立されます。
クライアントやサーバーをドメインに参加させると、ドメイン コントローラーに「コンピューター アカウント」として登録されます。その時にコンピューター アカウントに対してパスワードが自動生成され、メンバーサーバーとなるコンピューター側とドメイン コントローラー側のそれぞれでパスワードを管理しています。ドメイン コントローラーではコンピューター アカウントの属性値に、コンピューター側では LSA シークレットと呼ばれる領域にパスワードを格納しています。
メンバー サーバーのコンピューターの OS を起動すると、まず始めに、コンピューター側の LSA シークレットに格納されているパスワードを用いて、ドメイン コントローラーにコンピューター認証の要求を送信します。ドメイン コントローラー側で認証に成功すると、認証処理の中で生成されたセッション・キーを用いて、コンピューターとドメイン コントローラーの間でセキュア チャネルを確立します。セキュア チャネルの確立には、PRC 通信にて Netlogon サービスを呼び出して行われます。
ドメインで管理されているユーザーが、ドメイン メンバーのコンピューターにログオンする場合、ドメイン コントローラーに対してユーザー認証を行います。ユーザーのログオンに関する通信はセキュア チャネルを介して行われます。そのため、もしコンピューター認証に失敗してセキュアチャネルが確認できず、売ユーザーはコンピューターにログオンすることはできません。セキュアチャネルが確立できなかったことが原因でログオンに失敗する時は、以下のようなメッセージが表示されます。
“このワークステーションとプライマリ ドメインとの信頼関係に失敗しました”
コンピューター アカウントのパスワードの保存場所
セキュアチャネルの確立に使用されるコンピューター アカウントのパスワードは、ドメイン コントローラーとメンバー サーバーのコンピューターのそれぞれで管理されています。コンピューター アカウントのパスワードの管理されている場所について紹介します。
パスワードの保存場所(DC側)
ドメイン コントローラーでは、AD データベースで管理しているコンピューター アカウントの属性値で管理されています。コンピューター アカウントのパスワードに関する属性の一覧は以下の通りです。
- unicodePwd 属性
- pwdLastSet 属性
unicodePwd 属性
コンピューター アカウントの unicodePwd 属性には、コンピューター アカウントのパスワードが保存されています。現在のパスワードの1世代のみが保存されています。unicodePwd 属性は、セキュアチャネルの確立時など、コンピューター認証を行うときに利用されます。
unicodePwd 属性はコンピューター アカウントのパスワードを保存しているため、セキュリティ上の観点から、属性値の書き込みは可能ですが、読み取りはできない属性となります。そのため、[Active Directory ユーザーとコンピューター] などの管理ツールからコンピューター アカウントの属性の設定を確認しても、unicodePwd 属性値は <未構成> と表示されます。
また、コンピューター アカウントのパスワードに関する情報を管理する属性として、dbcsPwd 属性もあります。unicodePwd 属性には、パスワードの NT ハッシュが保存されますが、dbcsPwd 属性には LM ハッシュが保存される動作となります。ただし、LM ハッシュのアルゴリズムは脆弱なため、LM ハッシュからパスワードの平文を入手できる可能性があります。そのため、Windows Vista 以降はパスワードの LM ハッシュは既定では保存されない構成になっています。もし、LM ハッシュを有効化したい場合は、以下のポリシーを設定することで有効化することができます。
ポリシー:[ネットワーク セキュリティ: 次回のパスワード変更時に LAN Manager のハッシュ値を保存しない]
設定値:無効
pwdLastSet 属性
コンピューター アカウントの pwdLastSet 属性には、パスワードが最後に設定された日時が保存されています。unicodePwd 属性に値がセットされた日時となります。
パスワードの保存場所(メンバー側)
ドメイン メンバーのコンピューターでは、LSA シークレットと呼ばれる領域に、パスワードとパスワードをセットした時間を保存しています。LSA シークレットの領域には、現在のパスワードと1世代前のパスワードの 2 世代分が保存されています。
現在のパスワード
現在のパスワードがセットされた時間
1世代前のパスワード
1世代前のパスワードがセットされた時間
CupdTime などのレジストリに保存されている “パスワードがセットされた時間” は 16 進数の文字列です。16 進数の文字列から日時を確認する手順を紹介します。
- レジストリ CupdTime の値を確認します。この例では、CupdTime の値が “ef 34 14 9d ab 0f d9 01” であったとします。
- CupdTime の値を 4 バイトごとに、前半部分と後半部分で分けます。例の場合は、”ef 34 14 9d” と “ab 0f d9 01” です。
- 前半部分と後半部分のそれぞれでバイトスワップします。例の場合は、”9d 14 34 ef” と “01 d9 0f ab” です。
- コマンド プロンプトを開きます。
- 以下のコマンドを実行して、CupdTime で保存されている日時を算出します。
nltest /time:9d1434ef 01d90fab
実行例:
C:\>nltest /time:9d1434ef 01d90fab
9d1434ef 01d90fab = 12/14/2022 20:02:53
コマンドは正常に完了しました
C:\>
セキュアチャネルの確立の流れ
メンバー サーバーのコンピューターの OS を起動すると、まず始めに、コンピューター側の LSA シークレットに格納されているパスワードを用いて、ドメイン コントローラーにコンピューター認証の要求を送信します。ドメイン コントローラー側で認証に成功すると、認証処理の中で生成されたセッション・キーを用いて、コンピューターとドメイン コントローラーの間でセキュア チャネルを確立します。セキュア チャネルの確立には、PRC 通信にて Netlogon サービスを呼び出して行われます。
セキュア チャネルが確立されるまでの通信フローは以下の通りです。
まず、(1) DC Locator により接続するドメイン コントローラーを検索します。DNS で SRV レコードの解決を行い、利用可能なドメイン コントローラーを検索します。DC Locator の仕組みについては、以下の記事でも紹介しています。
Active Directory ドメイン サービスで構築されたドメイン環境では、ドメイン コントローラーがユーザーやコンピューターの管理をしています。Active Directory の仕組みを利用して認証や設定の配布するためには、ドメイ[…]
接続先のドメイン コントローラーが見つかった後は、セキュア チャネルを確立するために RPC 通信を開始します。(2) RPC 通信にて EPM(Endpoint Mapper)に接続して、Netlogon を利用するポートを問い合わせます。これ以降の通信は、Netlogon サービスを利用するための RPC 通信として、Map Response パケットで応答された TCP ポート番号を利用します。
(3) Netlogon を利用する TCP ポートに接続し、NetrServerReqChallenge パケットにて、セッションキーの生成のためにチャレンジの交換をします。Client Challenge と Server Challenge を交換したら、Client Challenge+Server Challenge+コンピューター アカウントを組み合わせて、クライアントとドメイン コントローラー側で共通の AES のセッション・キーを生成します。
(4) NetrServerAuthenticate パケットにて、チャレンジの交換で生成した AES のセッション・キーを利用して、クライアントはコンピューターの資格情報を暗号化してドメイン コントローラーへ送信します。ドメイン コントローラーで復号して認証ができることを確認します。
(5) 認証に成功したら、AES のセッション・キーを利用して、暗号化された RPC セッションを利用できます。これがセキュアチャネルとして利用されます。
セキュアチャネルの確認方法
ドメイン メンバーのコンピューターが、ドメイン コントローラーと正常にセキュアチャネルを確立できているかどうかは、nltest /sc_verify コマンドにて確認することができます。
フラグ: b0 HAS_IP HAS_TIMESERV
信頼された DC 名 \\TEST01DC01.test01.local
信頼された DC 接続状態 Status = 0 0x0 NERR_Success
信頼の確認 Status = 0 0x0 NERR_Success
コマンドは正常に完了しました
フラグ: 80
信頼された DC 名
信頼された DC 接続状態 Status = 5 0x5 ERROR_ACCESS_DENIED
信頼の確認 Status = 5 0x5 ERROR_ACCESS_DENIED
コマンドは正常に完了しました
パスワードの更新の仕組み
コンピューター アカウントのパスワードは、既定では 30 日に1度の間隔で更新される動作となります。コンピューター アカウントのパスワードの変更の処理は、メンバー サーバーのコンピューター側で開始されます。
Netlogon サービスの起動時、および 15 分ごとの定期的なタイミングにおいて、Netlogon サービス内のスカベンジャー スレッドと呼ばれるスレッドにおいて、コンピューター アカウントのパスワードが切れているかどうかを確認しています。コンピューター アカウントのパスワードの有効期限が切れていることを確認したら、コンピューター アカウントのパスワードの更新処理を開始します。パスワードの有効期限が切れているかどうかの判断は、以下の条件を満たすかどうかを確認しています。
値:MaximumPasswordAge
値の種類:REG_DWORD
設定値:30 (既定値。単位は日)
ポリシー名: [ドメイン メンバー: 最大コンピューター アカウントのパスワードの有効期間]
セキュアチャネルの破損
セキュア チャネルの確立には、コンピューター アカウントのパスワードが利用されています。何らかの理由により、メンバーサーバーとなるコンピューター側とドメイン コントローラー側でそれぞれに保持しているパスワードが不一致の状態となった場合、セキュアチャネルが正常に確立できなくなります。このような状態をセキュアチャネルの破損と呼びます。
セキュアチャネルの破損すると、以下のような問題が発生することが想定されます。
- ドメイン メンバーのコンピューターのデスクトップへのログオン不可(キャッシュログオンは可能)
- Kerberos 認証の失敗(KRB_AP_ERR_MODIFIED)
- その他、様々な認証の失敗に起因する問題
セキュアチャネルの破損の一般要因
メンバー サーバーとなるコンピューターとドメイン コントローラーが保持するパスワードが不一致となった場合、セキュアチャネルが破損します。セキュアチャネルが破損する一般的な要因は以下の通りです。
ドメイン メンバーのコンピューターのリストア
ドメイン メンバーのコンピューターをリストアした時に、コンピューターがレジストリで保持しているコンピューター アカウントのパスワードが古いパスワードに書き換えられ、ドメイン コントローラーで保持するコンピューター アカウントのパスワードと不整合が生じたことが原因でセキュア チャネルが破損することが考えられます。
セキュアチャネルが破損する原因として、ドメイン メンバーとドメイン コントローラーでのコンピューター アカウントのパスワードが不一致になることが原因となります。既定の動作では、30 日に1回の頻度でパスワードが更新されるため、以下のポリシーを設定することでパスワードを更新しない構成に変更することができます。ただし、セキュリティ リスクが上がる構成となりますので、設定することは推奨しません。
ポリシー名: [ドメイン コントローラー: コンピューター アカウントのパスワードの変更を拒否する] を有効
ポリシー名: [ドメイン メンバー: コンピューター アカウント パスワード: 定期的な変更を拒否する] を有効
ドメイン コントローラーのリストア
ドメイン内の全てのドメイン コントローラーを、バックアップからリストアした時に、AD データベースで管理しているデータが古い状態に戻ります。その時に、ドメイン コントローラーで管理しているコンピューター アカウントのパスワードが古いパスワードに戻り、ドメイン メンバーのコンピューターで管理しているコンピューター アカウントのパスワードと不整合が生じたことが原因でセキュア チャネルが破損することが考えられます。
このシナリオの場合も同様に、[ドメイン コントローラー: コンピューター アカウントのパスワードの変更を拒否する]、[ドメイン メンバー: コンピューター アカウント パスワード: 定期的な変更を拒否する] のポリシーを有効にすることで回避できます。
コンピューター アカウントの再作成
コンピューターをドメイン参加させた後、ドメイン コントローラー上の管理ツールにて、該当のコンピューター アカウントが一度削除され、その後、同じコンピューター アカウントを作成された場合、セキュア チャネルの破損が発生します。コンピューター アカウントを再作成すると、新しいパスワードが割り当てられるため、ドメイン コントローラーとコンピューターとでパスワードの不整合が発生します。
コンピューター アカウントのリセット
コンピューターをドメイン参加させた後、ドメイン コントローラー上の管理ツールにて、該当のコンピューター アカウントがリセットされた場合、セキュア チャネルの破損が発生します。コンピューター アカウントをリセットすると、新しいパスワードが割り当てられるため、ドメイン コントローラーとコンピューターとでパスワードの不整合が発生します。コンピューター アカウントのリセットは、[Active Directory ユーザーとコンピューター] の管理コンソールにて、対象のコンピューター アカウントを右クリックして [アカウントのリセット] をクリックすることでリセットできます。
同じホスト名のコンピューターがドメイン参加
ドメイン参加済みのドメイン メンバーのコンピューターで使用されているホスト名と、同じ名前のコンピューターをドメインに参加させた場合、セキュアチャネルの破損が発生します。同じ名前のコンピューターをドメイン参加させたタイミングにて、すでにあるコンピューター アカウントが上書きされ、パスワードも変更されます。そのため、既存のコンピューターとドメイン コントローラーとでパスワードの不整合が発生します。
サードパーティー製のアプリケーションの影響
サードパーティー製のアプリケーションにより、ドメイン メンバーのコンピューターもしくはドメイン コントローラーが管理するコンピューター アカウントのパスワードの情報が書き換えられたことによってパスワードに不整合が生じた場合、セキュアチャネルの破損が発生します。ウィルス対策ソフトのようなファイルスキャンの処理を行うアプリケーションでは、スキャン対象の除外設定を行うことをおすすめします。
ファイル破損、ディスクへの書き込みエラーによる影響
ファイル破損やディスクへの書き込みエラーなどで、ドメイン コントローラー上の AD データベースに問題が生じた、もしくは、クライアントのレジストリの設定に問題が生じた場合、パスワードの不整合によりセキュアチャネルの破損が発生します。
セキュアチャネルの復旧方法
セキュアチャネルの破損の復旧方法として、以下に紹介する 2 つの方法があります。セキュアチャネルの復旧作業において、まずは対処策①を実施して解消しない場合に、対処策②を実施して復旧作業を行ってください。
対処策①
1. セキュア チャネルの破損が発生している端末に管理者権限をもつユーザーでログオンします。
2. 管理者権限で PowerShell を開きます。
3. 以下のコマンドレットを実行します。
Test-ComputerSecureChannel -credential test01\administrator -repair
対処策②
対処策①でセキュアチャネルが復旧しない場合、一度ドメインを離脱して、ドメインの再参加を実施してください。
※一度、ワークグループに落として、ドメインを離脱した後に、改めてドメインに参加します。