【AD基礎】セキュアチャネルとは?基本概念と破損の影響について

  • 2022年12月18日
  • 2023年6月8日
  • AD DS

ドメインに参加しているコンピューターと、ドメイン コントローラーは「セキュアチャネル」と呼ばれる、保護された安全な通信を確立しています。セキュアチャネルが正常に確立できないと、コンピューターにログオンできない等のトラブルが発生する可能性があります。

今回は、セキュアチャネルの基本概念と一般的なトラブルについて紹介します。

セキュアチャネルとは?

ドメインに参加している 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 ハッシュを有効化したい場合は、以下のポリシーを設定することで有効化することができます。

パス:[コンピューターの構成] – [ポリシー] – [Windows の設定] – [セキュリティの設定] – [ローカル ポリシー] – [セキュリティ オプション]
ポリシー:[ネットワーク セキュリティ: 次回のパスワード変更時に LAN Manager のハッシュ値を保存しない]
設定値:無効
 

pwdLastSet 属性
コンピューター アカウントの pwdLastSet  属性には、パスワードが最後に設定された日時が保存されています。unicodePwd 属性に値がセットされた日時となります。

パスワードの保存場所(メンバー側)

ドメイン メンバーのコンピューターでは、LSA シークレットと呼ばれる領域に、パスワードとパスワードをセットした時間を保存しています。LSA シークレットの領域には、現在のパスワードと1世代前のパスワードの 2 世代分が保存されています。

現在のパスワード

HKEY_LOCAL_MACHINE\SECURITY\Policy\Secrets\$MACHINE.ACC\CurrVal

現在のパスワードがセットされた時間

HKEY_LOCAL_MACHINE\SECURITY\Policy\Secrets\$MACHINE.ACC\CupdTime

1世代前のパスワード

HKEY_LOCAL_MACHINE\SECURITY\Policy\Secrets\$MACHINE.ACC\CurrVal
 

1世代前のパスワードがセットされた時間

HKEY_LOCAL_MACHINE\SECURITY\Policy\Secrets\$MACHINE.ACC\OupdTime
 
LSA シークレットが保存されているレジストリの値を参照するには、レジストリ エディターをシステム権限で開く必要があります。Sysinternals の PsExec.exe もしくは PsExec64.exe を利用して、システム権限でレジストリ エディターを開いた上で参照してください。

CupdTime などのレジストリに保存されている “パスワードがセットされた時間” は 16 進数の文字列です。16 進数の文字列から日時を確認する手順を紹介します。

  1. レジストリ CupdTime の値を確認します。この例では、CupdTime の値が “ef 34 14 9d ab 0f d9 01” であったとします。
  2. CupdTime の値を 4 バイトごとに、前半部分と後半部分で分けます。例の場合は、”ef 34 14 9d” と “ab 0f d9 01” です。
  3. 前半部分と後半部分のそれぞれでバイトスワップします。例の場合は、”9d 14 34 ef” と “01 d9 0f ab” です。
  4. コマンド プロンプトを開きます。
  5. 以下のコマンドを実行して、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 コマンドにて確認することができます。

nltest /sc_verify:<ドメイン名>
 
コマンドの実行例は以下の通りです。
■セキュアチャネルが正常に確立できている場合
C:\>nltest /sc_verify:test01.local
フラグ: b0 HAS_IP HAS_TIMESERV
信頼された DC 名 \\TEST01DC01.test01.local
信頼された DC 接続状態 Status = 0 0x0 NERR_Success
信頼の確認 Status = 0 0x0 NERR_Success
コマンドは正常に完了しました
 
■セキュア チャネルが正常に確立できていない場合
C:\>nltest /sc_verify:test01.local
フラグ: 80
信頼された DC 名
信頼された DC 接続状態 Status = 5 0x5 ERROR_ACCESS_DENIED
信頼の確認 Status = 5 0x5 ERROR_ACCESS_DENIED
コマンドは正常に完了しました
 

パスワードの更新の仕組み

コンピューター アカウントのパスワードは、既定では 30 日に1度の間隔で更新される動作となります。コンピューター アカウントのパスワードの変更の処理は、メンバー サーバーのコンピューター側で開始されます。

Netlogon サービスの起動時、および 15 分ごとの定期的なタイミングにおいて、Netlogon サービス内のスカベンジャー スレッドと呼ばれるスレッドにおいて、コンピューター アカウントのパスワードが切れているかどうかを確認しています。コンピューター アカウントのパスワードの有効期限が切れていることを確認したら、コンピューター アカウントのパスワードの更新処理を開始します。パスワードの有効期限が切れているかどうかの判断は、以下の条件を満たすかどうかを確認しています。

 有効期限切れの条件
 前回のパスワードの変更日時 + レジストリ MaximumPasswordAge(日)+ 最大 24 時間までのランダムな時間 < 現在の日時
 
前回のパスワードの変更日時は、レジストリ CupdTime にて管理されています。また、MaximumPasswordAge はパスワードの有効期間が定義されているレジストリで、既定値は 30 (単位は日)です。
キー:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NetLogon\Parametersze
値:MaximumPasswordAge
値の種類:REG_DWORD
設定値:30 (既定値。単位は日)
MaximumPasswordAge は、以下のポリシーと紐づいています。ポリシーの設定値の変更でも、MaximumPasswordAge の設定値を変更することができます。
パス: [コンピューターの構成] – [Windows の設定] – [セキュリティの設定] – [ローカル ポリシー] – [セキュリティ オプション]
ポリシー名: [ドメイン メンバー: 最大コンピューター アカウントのパスワードの有効期間]
 
コンピューター アカウントのパスワードが変更されるのは、ドメイン コントローラーと正常に接続ができることが条件です。長期間、ドメイン メンバーの端末がドメイン コントローラーと接続できない状況の場合、パスワードの有効期限が切れていたとしても、パスワードの更新が行われることはありません。パスワードの有効期限が切れた後、ドメイン コントローラーと正常に接続できた段階で、コンピューター アカウントのパスワードの変更が行われる動作となります。そのため、メンバー サーバーが長期間オフラインであることが原因で、セキュアチャネルが確立できなくなることはありません。
 

セキュアチャネルの破損

セキュア チャネルの確立には、コンピューター アカウントのパスワードが利用されています。何らかの理由により、メンバーサーバーとなるコンピューター側とドメイン コントローラー側でそれぞれに保持しているパスワードが不一致の状態となった場合、セキュアチャネルが正常に確立できなくなります。このような状態をセキュアチャネルの破損と呼びます。

セキュアチャネルの破損すると、以下のような問題が発生することが想定されます。

  • ドメイン メンバーのコンピューターのデスクトップへのログオン不可(キャッシュログオンは可能)
  • Kerberos 認証の失敗(KRB_AP_ERR_MODIFIED)
  • その他、様々な認証の失敗に起因する問題

セキュアチャネルの破損の一般要因

メンバー サーバーとなるコンピューターとドメイン コントローラーが保持するパスワードが不一致となった場合、セキュアチャネルが破損します。セキュアチャネルが破損する一般的な要因は以下の通りです。

ドメイン メンバーのコンピューターのリストア

ドメイン メンバーのコンピューターをリストアした時に、コンピューターがレジストリで保持しているコンピューター アカウントのパスワードが古いパスワードに書き換えられ、ドメイン コントローラーで保持するコンピューター アカウントのパスワードと不整合が生じたことが原因でセキュア チャネルが破損することが考えられます。

セキュアチャネルが破損する原因として、ドメイン メンバーとドメイン コントローラーでのコンピューター アカウントのパスワードが不一致になることが原因となります。既定の動作では、30 日に1回の頻度でパスワードが更新されるため、以下のポリシーを設定することでパスワードを更新しない構成に変更することができます。ただし、セキュリティ リスクが上がる構成となりますので、設定することは推奨しません。

パス: [コンピューターの構成] – [Windows の設定] – [セキュリティの設定] – [ローカル ポリシー] – [セキュリティ オプション]
ポリシー名: [ドメイン コントローラー: コンピューター アカウントのパスワードの変更を拒否する] を有効
ポリシー名: [ドメイン メンバー: コンピューター アカウント 
パスワード: 定期的な変更を拒否する] を有効
 

ドメイン コントローラーのリストア

ドメイン内の全てのドメイン コントローラーを、バックアップからリストアした時に、AD データベースで管理しているデータが古い状態に戻ります。その時に、ドメイン コントローラーで管理しているコンピューター アカウントのパスワードが古いパスワードに戻り、ドメイン メンバーのコンピューターで管理しているコンピューター アカウントのパスワードと不整合が生じたことが原因でセキュア チャネルが破損することが考えられます。

このシナリオの場合も同様に、[ドメイン コントローラー: コンピューター アカウントのパスワードの変更を拒否する]、[ドメイン メンバー: コンピューター アカウント パスワード: 定期的な変更を拒否する] のポリシーを有効にすることで回避できます。

コンピューター アカウントの再作成

コンピューターをドメイン参加させた後、ドメイン コントローラー上の管理ツールにて、該当のコンピューター アカウントが一度削除され、その後、同じコンピューター アカウントを作成された場合、セキュア チャネルの破損が発生します。コンピューター アカウントを再作成すると、新しいパスワードが割り当てられるため、ドメイン コントローラーとコンピューターとでパスワードの不整合が発生します。

コンピューター アカウントのリセット

コンピューターをドメイン参加させた後、ドメイン コントローラー上の管理ツールにて、該当のコンピューター アカウントがリセットされた場合、セキュア チャネルの破損が発生します。コンピューター アカウントをリセットすると、新しいパスワードが割り当てられるため、ドメイン コントローラーとコンピューターとでパスワードの不整合が発生します。コンピューター アカウントのリセットは、[Active Directory ユーザーとコンピューター] の管理コンソールにて、対象のコンピューター アカウントを右クリックして [アカウントのリセット] をクリックすることでリセットできます。

同じホスト名のコンピューターがドメイン参加

ドメイン参加済みのドメイン メンバーのコンピューターで使用されているホスト名と、同じ名前のコンピューターをドメインに参加させた場合、セキュアチャネルの破損が発生します。同じ名前のコンピューターをドメイン参加させたタイミングにて、すでにあるコンピューター アカウントが上書きされ、パスワードも変更されます。そのため、既存のコンピューターとドメイン コントローラーとでパスワードの不整合が発生します。

サードパーティー製のアプリケーションの影響

サードパーティー製のアプリケーションにより、ドメイン メンバーのコンピューターもしくはドメイン コントローラーが管理するコンピューター アカウントのパスワードの情報が書き換えられたことによってパスワードに不整合が生じた場合、セキュアチャネルの破損が発生します。ウィルス対策ソフトのようなファイルスキャンの処理を行うアプリケーションでは、スキャン対象の除外設定を行うことをおすすめします。

ファイル破損、ディスクへの書き込みエラーによる影響

ファイル破損やディスクへの書き込みエラーなどで、ドメイン コントローラー上の AD データベースに問題が生じた、もしくは、クライアントのレジストリの設定に問題が生じた場合、パスワードの不整合によりセキュアチャネルの破損が発生します。

セキュアチャネルの復旧方法

セキュアチャネルの破損の復旧方法として、以下に紹介する 2 つの方法があります。セキュアチャネルの復旧作業において、まずは対処策①を実施して解消しない場合に、対処策②を実施して復旧作業を行ってください。

対処策①

1. セキュア チャネルの破損が発生している端末に管理者権限をもつユーザーでログオンします。

2. 管理者権限で PowerShell を開きます。

3. 以下のコマンドレットを実行します。

   Test-ComputerSecureChannel -credential <ドメイン名\管理者ユーザー> -repair
実行例)
Test-ComputerSecureChannel -credential test01\administrator -repair
4. パスワードの入力が求められるため、-credential で指定したユーザーのパスワードを入力して、TRUE が返ってくることを確認します。
5. 問題が解消されるか確認します。OS の再起動は不要です。
 

対処策②

対処策①でセキュアチャネルが復旧しない場合、一度ドメインを離脱して、ドメインの再参加を実施してください。


※一度、ワークグループに落として、ドメインを離脱した後に、改めてドメインに参加します。

楽天ブックス
¥3,630 (2023/06/08 11:21時点 | 楽天市場調べ)
楽天ブックス
¥4,400 (2023/06/08 11:24時点 | 楽天市場調べ)