ある日の AD トラブルと修復 take3


ついにこの記事も take3 に達してしまいましたが、今回の話はあくまで検証用ADでのお話しです。

いやまじで。今回のはADドメイン崩壊寸前でした。



<経緯>

うちの検証用ADドメインはドメインコントローラが4台構成(addc51〜54。実はRODCも1台いるが本筋には関係ない)なのだが、以前に全部VMWare ESXi上の仮想マシンにしていたら、見事に時計がずれまくってKerberosに怒られたので、1台(addc54)だけ物理PCにしてこいつをドメインマスターに設定していました。

<発端>

ドメインマスタでちょいと設定変更をしてから repadmin で強制レプリカすると不穏なメッセージが出ました。


SyncAll が次のエラーを報告しました:
レプリケーションの発行中にエラーが発生しました: -2146893022 (0x80090322):
    対象のプリンシパル名が間違っています。
    レプリケーション元: df6f7f01-a996-492d-82b5-3c4a9aa3c446._msdcs.example.loca
l
    レプリケーション先: 52b82107-dec8-454a-a2d7-e1b759b7837d._msdcs.example.loca
l

DNS名から調べたDCで repadmin すると

C:\Users\administrator.EXAMPLE>repadmin /syncall /AeD

addc51 の NC すべてを同期しています。
同期中のパーティション: DC=ForestDnsZones,DC=example,DC=local
コールバック メッセージ: サーバー 52b82107-dec8-454a-a2d7-e1b759b7837d._msdcs.ex
ample.local へのアクセス中にエラーが発生しました (ネットワーク エラー): -2146893
022 (0x80090322):
    対象のプリンシパル名が間違っています。
コールバック メッセージ: サーバー 711cff57-c75a-45c3-b005-9d07ba78be91._msdcs.ex
ample.local へのアクセス中にエラーが発生しました (ネットワーク エラー): -2146893
022 (0x80090322):
    対象のプリンシパル名が間違っています。
コールバック メッセージ: サーバー df6f7f01-a996-492d-82b5-3c4a9aa3c446._msdcs.ex
ample.local へのアクセス中にエラーが発生しました (ネットワーク エラー): -2146893
022 (0x80090322):
    対象のプリンシパル名が間違っています。

致命的な Win32 エラーが発生したため、SyncAll は終了しました: 8440 (0x20f8):
    このレプリケーション操作に対して指定された名前付けコンテキストは無効です。
ひどいなぁ、これ。ここでやっとまずいことになっているということが分かります。

落ち着いてドメインマスターのイベントログを確認すると、大事なことがちゃんと書かれていました。

ログの名前:         Directory Service
ソース:           Microsoft-Windows-ActiveDirectory_DomainService
日付:            2017/05/01 16:55:28
イベント ID:       1925
タスクのカテゴリ:      知識整合性チェッカー
レベル:           警告
キーワード:         クラシック
ユーザー:          ANONYMOUS LOGON
コンピューター:       addc54.example.local
説明:
次の書き込み可能なディレクトリ パーティションのためにレプリケーション リンクを確立しようとして失敗しました。 
 
ディレクトリ パーティション: 
DC=DomainDnsZones,DC=example,DC=local 
ソース ディレクトリ サービス: 
CN=NTDS Settings,CN=ADDC53,CN=Servers,CN=Default-First-Site,CN=Sites,CN=Configuration,DC=example,DC=local 
ソース ディレクトリ サービスのアドレス: 
df6f7f01-a996-492d-82b5-3c4a9aa3c446._msdcs.example.local 
サイト間トランスポート (存在する場合): 
 
 
このディレクトリ サービスは、この問題が修正されるまでソース ディレクトリ サービスとレプリケートできなくなります。 
 
ユーザー操作 
ソース ディレクトリ サービスにアクセス可能か、またはネットワーク接続が利用可能かどうかを確認してください。 
 
追加データ 
エラー値: 
1398 クライアントとサーバーの間で、時間または日付が違います。
え?また時計がずれたんですか…。

リアルな私はここではっと原因に思い当たったのですが、その種明かしは後にして、とりあえず復旧を急ぎましょう。

このような事例の回復方法がMSのサポートサイトに載っていました。

https://support.microsoft.com/ja-jp/help/288167/error-message-target-principal-name-is-incorrect-when-manually-replicating-data-between-domain-controllers

「コンピュータアカウントパスワードの再設定を行う。」の作業をやることにします。

addc51上でまずKDCを無効に設定し、再起動します。

KDCを停める

ところがサポートの内容によれば。 "この操作を行うには、PDC エミュレータ操作マスタの役割の所有者以外のドメイン コントローラから、次のコマンドを実行します"

と書いてあります。どゆこと?当該のサーバ上でもドメインマスター上でもダメなの? 意味が分からないので当該サーバ上で直接実行を試みますがダメでした。

(どうダメだったかは…スクリーンショット撮り忘れです。ごめんなさい)

イベントログにはこのような記録が残っていました。

ログの名前:         Directory Service
ソース:           Microsoft-Windows-ActiveDirectory_DomainService
日付:            2017/05/18 11:17:55
イベント ID:       1308
タスクのカテゴリ:      知識整合性チェッカー
レベル:           警告
キーワード:         クラシック
ユーザー:          ANONYMOUS LOGON
コンピューター:       addc51.example.local
説明:
次のディレクトリ サービスとレプリケートする試みが連続して行われましたが継続的に失敗していることが、知識整合性チェッカー (KCC) により検出されました。 
 
試行回数:
205 
ディレクトリ サービス:
CN=NTDS Settings,CN=ADDC53,CN=Servers,CN=Default-First-Site,CN=Sites,CN=Configuration,DC=example,DC=local 
期間 (分):
4033 
 
このディレクトリ サービスの接続オブジェクトは無視され、レプリケーションが継続されるように新しい一時的な接続が確立されます。このディレクトリ サービスとのレプリケーションが再開されると、一時的な接続は削除されます。 
 
追加データ 
エラー値:
5 アクセスが拒否されました。
うーむ。じゃあドメインマスタ(addc54)以外のドメインコントローラ(addc52,53)を止めてからaddc51で再度実行してみましょう。

C:\Users\administrator.EXAMPLE>netdom resetpwd /server:addc54.example.local /u
erd:example\administrator /passwordd:naisho
ローカル コンピューターのコンピューター アカウント パスワードは正常にリセットさ
れました。

コマンドは正しく完了しました。
ちなみに最後の引数は password ではなく passwordd です。naisho とあるのはドメインのAdministratorのパスワードを入れます。

大丈夫かどうかの確認は、ドメインマスタへSMB接続します。

domain share

IPC$ への接続はできたように思えます。

当たり前ですが \\(IPAddress) だと試験の意味がないですよ。 では、ドメインマスタaddc54と復活したaddc51を生かした状態でaddc52を起動します。

同様にKDCのスタートアップを無効にしてリブート。

C:\Users\administrator.EXAMPLE>netdom resetpwd /server:addc54.example.local /us
erd:example\administrator /passwordd:naisho
ローカル コンピューターのコンピューター アカウント パスワードは正常にリセットさ
れました。

コマンドは正しく完了しました。
おー。うまくいくじゃん。

じゃあ最後。addc53を起動します。今度はKDCを動かしたままトライしてみます。


C:\Windows\system32>netdom resetpwd /server:addc54.example.local /userd:example
\administrator /passwordd:naisho
ローカル コンピューターのコンピューター アカウント パスワードは正常にリセットさ
れました。

コマンドは正しく完了しました。
よし。一応再起動しましょう。

勝利を確信しつつ、再起動したaddc53が落ち着いたのを確認してドメインマスタで repadminによる手動レプリカを実行。

コールバック メッセージ: SyncAll が完了しました。
SyncAll はエラーなしで終了しました。


がずらっと並びました。うん完璧。

時間が経過すると、レプリカトポロジーがおかしかったのも自動的に修復され、DC4台だと基本構成となる2x2ペアになりました。

あとはメンバーサーバのコンピュータアカウントが心配だったのですが、このトラブル修正を行う前はRDP接続できなくなってたメンバーにも 普通に接続できるようになったのを確認しました。ということで、メンバーは何もなしでいけそうです。



<原因>

さて、ドメインマスターを物理サーバにしたのにも関わらず、なぜこんなことが起きたのか。

これより話が遡ること、1週間以上前だと思います。

検証用環境ということもあって、ドメインマスターにしているのはごく普通のノートパソコンです。

ある日、このノートパソコンのACアダプタ(のめがねケーブル)が抜けてしまい、それに気づかず運転していたドメインマスターはバッテリーがなくなって息絶えてしまいました。

気づいた後に電源を入れると、BIOSの内容がクリアされたというメッセージが出ました。そのときには重大なことに気づかずに「あっそ。」と軽い気持ちでOSをそのまま起動したのですが、実はこのノートパソコン、通常のバッテリーだけでなくCMOSバッテリーが寿命を迎えて干上がっており、BIOSの設定内容が揮発したという大事なメッセージでした。つまり、ハードウェアクロックが基盤に焼きこんである初期値に戻った(確か1990年1月1日だったか何かだったと思う)ということになります。

悪いことに、OSが起動されてしまい、しかもOSが保持していた時刻からハードウェアクロックが大幅にずれたため、ドメインマスターが信頼すべき時計はローカルクロックにフォールバックしてしまいます(これは仕様のようです。参考)。

しかもその状態で何も気づかず運用したため、他のaddc51〜53におかしな日付が全部行き渡ってしまい、ドメイン参加していないPCからドメインメンバーのサーバにリモートデスクトップしようとするとエラーが発生していました。

addc51〜53の時計の異常に気づく前に、addc54の時計がおかしいことに気づき、CMOS時計も手動で合わせた上で再度w32tmにより同期設定を入れなおして、ドメインマスターは正気を取り戻したのですが、今度は他のドメインコントローラやメンバーと全部Kerberosが通らなくなり、崩壊寸前に陥っていたのが冒頭の状況でした。

今回は作業実施前にaddc54の時刻同期を正しい姿にしていたので、根本原因にもすぐ思い当たったのですが、非常に危険な状況だったと言えます。サーバ専用機でもCMOSバッテリーの寿命が3倍とか5倍になっているということもありえないと思うので、めったに再起動しないサーバ機の場合であっても注意が必要といえるかもしれません。面倒だからと言ってリモートデスクトップで済ませるのではなく、コンソールに変なメッセージが出ないかは確認しておく方がよいですね。


戻る