39
1 ドメインコントローラーの仮想化

仮想化した DC を PowerShell で複製する

Embed Size (px)

Citation preview

Page 1: 仮想化した DC を PowerShell で複製する

1

ドメインコントローラーの仮想化

Page 2: 仮想化した DC を PowerShell で複製する

2

DC 仮想化のメリット

• スケーラビリティ• 物理 PC がなくても展開可能

• サーバーのロールバック(スナップショット)• 自動展開のしやすさ• パブリックウラウドへの移行

• 仮想 DC を IaaS に展開

Page 3: 仮想化した DC を PowerShell で複製する

3

仮想 DC の展開

• サーバーマネージャーを使用して

• Windows PowerShell を使用して

• VHDファイルを所定の手続きでクローン

いずれの処理もリモートから行える

Page 4: 仮想化した DC を PowerShell で複製する

4

Hyper-V

DC01

①クローン先情報を埋め込む

②エクスポート VHD DC02③インポート

Hyper-V

DCクローンの動作イメージ

Page 5: 仮想化した DC を PowerShell で複製する

5

1. ソース DC で FSMO が起動していないことを確認。起動している場合には他の DC に移動。

2. ソース DC をクローン可能な DC として認可する3. 非互換アプリを調査し CustomDCCloneAllowList.xmlを生成4. 複製先情報を記載した DcCloneConfig.xmlファイルを作成5. ソース DC をシャットダウン6. ソース DC を Export

7. ソースを起動8. Exportしたイメージを新しい仮想マシンとして Import

9. 複製先マシンを起動( DC 間複製が開始される)

仮想 DC のクローン手順

Page 6: 仮想化した DC を PowerShell で複製する

6

$SourceDC = "ITCAMP-DC02"

$DistDC = "ITCAMP-DC03"

$distPDCEmu = "ITCAMP-DC01"

$SourceHyperVHost = "ITCAMP-FS"

$DistHyperVHost = "ITCAMP-FS"

$VMStore = "¥¥$DistHyperVHost¥VMStore"

$ConfirmPreference = "none"

Move-ADDirectoryServerOperationMasterRole -Identity $distPDCEmu -OperationMasterRole PDCEmulator

Get-ADComputer $SourceDC | %{Add-ADGroupMember -Identity "Cloneable Domain Controllers" -Members $_.samAccountName}

Invoke-Command -ComputerName $SourceDC -ScriptBlock { Get-ADDCCloningExcludedApplicationList -GenerateXml -Force }

Invoke-Command -ComputerName $SourceDC -ScriptBlock { `

New-ADDCCloneConfigFile -Static -IPv4Address "192.168.210.52" `

-IPv4DNSResolver "192.168.210.50" `

-IPv4SubnetMask "255.255.255.0" `

-IPv4DefaultGateway "192.168.210.254" `

-CloneComputerName "$Args" `

-SiteName "Default-First-Site-Name" } `

-ArgumentList $DistDC

Stop-VM -ComputerName $SourceHyperVHost -Name $SourceDC

Get-VM -ComputerName $SourceHyperVHost -Name $SourceDC | %{ Export-VM $_ -Path $VMStore}

Start-VM -ComputerName $SourceHyperVHost -Name $SourceDC

$CFG = (Dir "$VMStore¥$SourceDC¥Virtual Machines¥*.xml").FullName

MD ¥¥$DistHyperVHost¥F$¥$DistDC

Import-VM -ComputerName $DistHyperVHost -Path $CFG -GenerateNewId -Copy-VhdDestinationPath F:¥$DistDC

Get-VM -ComputerName $DistHyperVHost -Name $SourceDC |Where-Object {$_.State -EQ "Off"} | Rename-VM -NewName $DistDC

Start-VM -ComputerName $DistHyperVHost -Name $DistDC

DCクローンを自動化するスクリプト例

step1

step2step3

step4

step5step6step7

step8

step9

ITCAMP-FS

DC01 DC02 DC03複製

ここからコマンドを実行

Page 7: 仮想化した DC を PowerShell で複製する

7

Step 1: ソースDCでPDCエミュレーターが動作していないことを確認

PDCエミュレーターがインストールされているDCはクローンできない

$ConfirmPreference = "none"

Move-ADDirectoryServerOperationMasterRole -Identity $distPDCEmu `

-OperationMasterRole PDCEmulator

Page 8: 仮想化した DC を PowerShell で複製する

8

Step 2: ソースDCをクローン可能なDCに設定する

Get-ADComputer $SourceDC | %{Add-ADGroupMember `

-Identity "Cloneable Domain Controllers" -Members $_.samAccountName}

複製元となるドメインコントローラーを CloneableDomain Controllers のメ

ンバーにする

Page 9: 仮想化した DC を PowerShell で複製する

9

Step3.非互換アプリを調査し CustomDCCloneAllowList.xmlを生成

コマンドレットを実行することで、C:¥Windows¥NTDS¥CustomDCCloneAllowList.xml ファイルが作成される

Invoke-Command -ComputerName $SourceDC -ScriptBlock { Get-

ADDCCloningExcludedApplicationList -GenerateXml -Force }

<AllowList>

<Allow>

<Name>Active Directory Management Pack Helper

Object</Name>

<Type>Program</Type>

</Allow>

<Allow>

<Name>System Center Operations Manager 2012

Agent</Name>

<Type>Program</Type>

</Allow>

<Allow>

<Name>Microsoft Silverlight</Name>

<Type>WoW64Program</Type>

</Allow>

<Allow>

<Name>AdtAgent</Name>

<Type>Service</Type>

</Allow>

<Allow>

<Name>HealthService</Name>

<Type>Service</Type>

</Allow>

<Allow>

<Name>QWAVE</Name>

<Type>Service</Type>

</Allow>

<Allow>

<Name>System Center Management APM</Name>

<Type>Service</Type>

</Allow>

<Allow>

<Name>wlidsvc</Name>

<Type>Service</Type>

</Allow>

</AllowList>

Page 10: 仮想化した DC を PowerShell で複製する

10

Step4.複製先情報を記載した DcCloneConfig.xmlファイルを作成

Invoke-Command -ComputerName $SourceDC -ScriptBlock { `

New-ADDCCloneConfigFile -Static -IPv4Address "192.168.210.52" `

-IPv4DNSResolver "192.168.210.50" `

-IPv4SubnetMask "255.255.255.0" `

-IPv4DefaultGateway "192.168.210.254" `

-CloneComputerName "$Args" `

-SiteName "Default-First-Site-Name" } `

-ArgumentList $DistDC

すでに作成されていると上書きでいないので注意

Page 11: 仮想化した DC を PowerShell で複製する

11

DcCloneConfig.xml の例

<?xml version="1.0"?>

<d3c:DCCloneConfig

xmlns:d3c="uri:microsoft.com:schemas:DCCloneConfig">

<ComputerName>ITCAMP-DC03</ComputerName>

<SiteName>Default-First-Site-Name</SiteName>

<IPSettings>

<IPv4Settings>

<StaticSettings>

<Address>192.168.210.52</Address>

<SubnetMask>255.255.255.0</SubnetMask>

<DefaultGateway></DefaultGateway>

<DNSResolver>192.168.210.50</DNSResolver>

<DNSResolver>192.168.210.51</DNSResolver>

<DNSResolver></DNSResolver>

<DNSResolver></DNSResolver>

<PreferredWINSServer></PreferredWINSServer>

<AlternateWINSServer></AlternateWINSServer>

</StaticSettings>

</IPv4Settings>

<IPv6Settings>

<StaticSettings>

<DNSResolver></DNSResolver>

<DNSResolver></DNSResolver>

<DNSResolver></DNSResolver>

<DNSResolver></DNSResolver>

</StaticSettings>

</IPv6Settings>

</IPSettings>

</d3c:DCCloneConfig

Page 12: 仮想化した DC を PowerShell で複製する

12

Step 5:ソース DC をシャットダウン

Stop-VM -ComputerName $SourceHyperVHost -Name $SourceDC

Page 13: 仮想化した DC を PowerShell で複製する

13

Step 6:ソース DC を Export

Get-VM -ComputerName $SourceHyperVHost `

-Name $SourceDC | %{ Export-VM $_ -Path $VMStore}

Page 14: 仮想化した DC を PowerShell で複製する

14

Start-VM -ComputerName $SourceHyperVHost -Name $SourceDC

Step7. ソースDCを起動

複製先のDCは複製元DCと複製を開始するので、事前に起動しておく必要がある。

Page 15: 仮想化した DC を PowerShell で複製する

15

Step 8: Exportしたイメージを新しい仮想マシンとして Import

$CFG = (Dir "$VMStore¥$SourceDC¥Virtual Machines¥*.xml").FullName

MD ¥¥$DistHyperVHost¥F$¥$DistDC

Import-VM -ComputerName $DistHyperVHost `

-Path $CFG -GenerateNewId -Copy -VhdDestinationPath F:¥$DistDC

重要!!インプレースインポートはできない!重要!!インプレースインポートはできない!

Page 16: 仮想化した DC を PowerShell で複製する

16

Step9.複製先マシンを起動

Page 17: 仮想化した DC を PowerShell で複製する

17

仮想 DC 展開の留意点

• 単一障害点にならないこと 少なくとも2台のHyper-V サーバーに1台づつ展開

1つのハードウェアの障害が複数のDCに影響を与えないようにすること できるだけ物理的に異なるリージョンに配置すること 可能であれば、少なくとも1台は物理 DC を構築しておくこと

Hyper-V

V-DC V-DC

Hyper-V

V-DC

Hyper-V

V-DC

Page 18: 仮想化した DC を PowerShell で複製する

18

• セキュリティ上の考慮点• できるだけ DC のみの単一機能のサーバーとし、ホスト、ゲストともに

Server Core を採用すること

• 必要に応じて RODC を検討すること• VHDファイルの安全性に考慮すること

• VHDファイルが含まれるドライブごと暗号化することをお勧め

Hyper-V(Server Core)

V-DC(Server Core)

Page 19: 仮想化した DC を PowerShell で複製する

19

Page 20: 仮想化した DC を PowerShell で複製する

20

Page 21: 仮想化した DC を PowerShell で複製する

21

Page 22: 仮想化した DC を PowerShell で複製する

22

Page 23: 仮想化した DC を PowerShell で複製する

23

• セキュリティ上の考慮点(つづき)• ホストコンピューターは死守すること

• 可能であればホストコンピューターは管理用ネットワークのみと通信を行うように設定されていること

• ホストコンピューターはゲストであるDCのドメインに所属させない

Hyper-V(domain member)

V-DC V-DC

DC からスタートアップスクリプトを送り込む

2

3Sysvol 共有にアタック

Page 24: 仮想化した DC を PowerShell で複製する

24

Measurement Test Physical Virtual Delta

Searches/sec Search for common name in base scope (L1) 11508 10276 -10.71%

Searches/sec Search for a set of attributes in base scope (L2) 10123 9005 -11.04%

Searches/sec Search for all attributes in base scope (L3) 1284 1242 -3.27%

Searches/sec Search for common name in subtree scope (L6) 8613 7904 -8.23%

Successful binds/sec Perform fast binds (B1) 1438 1374 -4.45%

Successful binds/sec Perform simple binds (B2) 611 550 -9.98%

Successful binds/sec Use NTLM to perform binds (B5) 1068 1056 -1.12%

Writes/sec Write multiple attributes (W2) 6467 5885 -9.00%

• パフォーマンスの考慮点

• Windows Server 2008 の場合約10%の性能減

Adtest.exe 使用 http://www.microsoft.com/en-us/download/details.aspx?id=15275

Page 25: 仮想化した DC を PowerShell で複製する

25

• 展開に関する考慮点

• 差分ディスクは使わないこと

実使用領域

未使用領域

固定

可変

元の領域差分差分

差分

差分

指定領域に達するまで自動拡張

Page 26: 仮想化した DC を PowerShell で複製する

26

• 展開に関する考慮点(続き)

• VHDファイルを”単純複製”しないこと

• SID の重複

(..かといって ドメインコントローラーでの Sysprep は未サポート)

• USN(Update Sequence Number)ロールバック問題

• 起動しているドメインコントローラーを Export しないこと

詳細:http://technet.microsoft.com/en-us/library/

virtual_active_directory_domain_controller_virtualization_hyperv(v=ws.10).aspx

Page 27: 仮想化した DC を PowerShell で複製する

27

重要な 4 つの ID

• USN(Update Sequence Number)• オブジェクトが追加、変更、削除されるたびに+1• ドメインコントローラー個々に管理されている

• RID (Relative Identifier)• DC 内オブジェクトの通番.• SID の構成要素• RID Master の RID Pool によって集中管理されている

• Invocation(発動,召喚) ID• DIT のバージョン管理に使用される• Get-ADDomainController で参照可能

• GUID(Globally Unique IDentifier)• サーバー内オブジェクトのID• 恒久的

Page 28: 仮想化した DC を PowerShell で複製する

28

USN とは• Update Sequence Number• オブジェクトを変更、作成、するごとに +1 • ドメインコントローラーごとに管理されている• ドメインコントローラー間でどこまで複製が完了したかを確認するための番号• ドメインコントローラーに変更が加えられるたびに加算される

DC1 DC2

USN_DC2 = 100 USN_DC1 = 200

My USN=200 My USN=100複製

DIT DITDC1からはUSN=200まで複製完了したということ

HighWatermark

Page 29: 仮想化した DC を PowerShell で複製する

29

複製の基本動作:High Watermark をベースにした差分複製

DC1 DC2

USN_DC1 = 200My USN=200

DIT DIT

複製リクエスト

複製無し

DC1 DC2

USN_DC1 = 200My USN=250

DIT DIT

複製リクエスト

USN=201~250

ユーザー追加50人

250

HWM

Page 30: 仮想化した DC を PowerShell で複製する

30

USN ロールバック問題

DC1 DC2

USN_DC1 = 250My USN=250

DIT DIT

DC1

My USN=200

DIT

DC2

USN_DC1 = 250

DIT

複製リクエスト

複製無し

なんらかの原因でロールバック

Page 31: 仮想化した DC を PowerShell で複製する

31

DC1

My USN=250

DIT

DC2

USN_DC1 = 250

DIT

複製リクエスト

複製無し

ユーザー追加50人

DC1

My USN=260

DIT

DC2

USN_DC1 = 250

DIT

複製リクエスト

USN=251~260

ユーザー追加10人

260

Page 32: 仮想化した DC を PowerShell で複製する

32

USN ロールバックの検知

• 「USN がロールバック」だけが発生すると、複製は停止する• Windows Server Backup から古い DIT をリストアした場合• 古い VHD ファイルをリストアした場合• 古い Export ファイルをインポートした場合

Event ID 2103:Active Directory データベースがサポートされていない方法で復元されました。Active Directory はこの状態が継続している間、ユーザーのログオンを処理できません。

Page 33: 仮想化した DC を PowerShell で複製する

33

Invocation ID

• Invocation ID:ディレクトリデータベース(NTDS.DIT)のID• DITのバージョン識別子として扱われる

DITInvocation ID

Page 34: 仮想化した DC を PowerShell で複製する

34

USN ロールバック問題を回避するにはInvocation ID をリセット(変更)する必要がある

USN = 1000InvocationID = A

DC1 が把握している DC1(自分自身)の状態

DC2 が把握しているDC1 の状態

DC1(A)@USN1000

USN = 500InvocationID = B

DC1(A)@USN1000DC1(B)@USN500

頭から複製

USN = 600InvocationID = B

DIT変更(USN変更)

DC1(A)@USN1000DC1(B)@USN600

差分複製

USNロールバック

Page 35: 仮想化した DC を PowerShell で複製する

35

旧バージョンでのスナップショットによるUSNロールバック

TIME: T2

TIME: T4

Create

Snapshot

T1 Snapshot

Applied!

USN: 100

+150 more users created

DC2 receives updates: USNs >200

USN: 200

ID: A RID Pool: 600- 1000

+100 users added

DC2 receives updates: USNs >100

• USN rollback はDC2に反映されない→50ユーザーが複製されてしまう

• All others are either on one or the other DC

• 100 ユーザー(RID = 500 - 599)は SID競合

スナップショットをリストアした場合にはロールバックが検知されない

Page 36: 仮想化した DC を PowerShell で複製する

36

Windows Server 2012 では

Hyper-V ホストで VM-Generation ID を管理している

• ユニークな 128 ビットの ID

• 専用ドライバーによりゲストOSに通知できるようになっている

WS 2012 仮想 DC は VM-Generation ID をトラックする

• Active Directory database (DIT) に保存

• DIT への変更をコミットする前に、

• “DIT内部の VM-Generation ID” と “ホストが認識している VM-Generation ID” を比較

• 異なれば DCの invocation ID と RID pool をリセットしてから、コミット

同じ操作を、起動時に実行する

Page 37: 仮想化した DC を PowerShell で複製する

37

仮想 Domain Controller

Invocation ID

VM-Gen ID

DIT

Hyper-V ホスト

VM-Gen ID

比較

Page 38: 仮想化した DC を PowerShell で複製する

38

Windows Server 2012 ではこうなっている

Tim

eli

ne o

f even

ts

TIME: T2

TIME: T3

TIME: T4

Create

Snapshot

T1 Snapshot

Applied!

USN: 100

ID: A savedVMGID: G1

USN: 100

ID: A

USN: 101-250

ID: B

+150 users created: VM generation ID の差異が発生

DC1(A)@USN = 200

USN: 200

ID: A

+100 users added

DC2 receives updates: USNs >100

DC

1

DC

2

TIME: T1VMGID: G1

savedVMGID: G1 VMGID: G1

savedVMGID: G1 VMGID: G2

savedVMGID: G2 VMGID: G2

DC2 again accepts updates: USNs >100

USN re-use avoided and USN rollback PREVENTED : all 250 users converge correctly across both DCs

DC1(A)@USN = 200

DC1(B)@USN = 250

… missing users replicate

back to DC1

Page 39: 仮想化した DC を PowerShell で複製する

39

結局のところ...

以下の用途には使えないので注意「作成したユーザーを削除したい」「変更したユーザーの属性を元に戻したい」

• Authoritative Restore を使用しましょう• または Forefront Identity Manager を使用し、メタデータで管理しましょう

消してしまったユーザーを復元するには「ゴミ箱」を使いましょう