~/yazilar/active-directory-kurulumu-ve-ikinci-dc

Active Directory kurulumu ve ikinci domain controller

10 dk okuma

Add-Computer : Computer 'DC02' failed to join domain 'ad.example.com' from its current workgroup 'WORKGROUP' with
following error message: The specified domain either does not exist or could not be contacted.

Bir sunucuyu domain'e alırken ya da ikinci domain controller'ı kurarken bu mesajı görürsen ilk bakacağın yer DNS. Makine domain controller'ı DNS'teki SRV kayıtlarıyla buluyor. DNS ayarında DC yerine modem, kurumun genel resolver'ı ya da internetteki bir sunucu yazıyorsa domain'i hiçbir zaman bulamıyor. Kablo, güvenlik duvarı, parola, hepsi ondan sonra geliyor. AD sorunlarının çoğu bir şekilde DNS'e çıkıyor, o yüzden bu yazıda DNS'e de en az DC kadar yer var.

Plan

İki domain controller, ikisi de DNS sunucusu ve Global Catalog:

SunucuIPGörev
dc0110.10.20.11İlk DC, DNS, başlangıçta bütün FSMO rolleri
dc0210.10.20.12İkinci DC, DNS, Global Catalog

Ağ 10.10.20.0/24, gateway 10.10.20.1. İkisi de Core, ikisi de domain'e alınmamış, statik IP'li, saat dilimi ayarlanmış ve güncellemeleri yapılmış durumda.

Tek DC varsa o sunucu yeniden başlarken bile oturum açılamıyor ve DNS çözülmüyor. İkinci DC, birini bakıma alırken işlerin yürümesini sağlıyor. Yedek yerine geçmiyor, ona en sonda döneceğim.

Domain adı

Örneklerde ad.example.com kullanıyorum, NetBIOS adı da ORNEK. Senin ortamında bu, kurumun sahip olduğu bir alan adının alt alan adı olmalı. .local ile biten isimler hâlâ çok yaygın ama mDNS ile çakışıyor (macOS ve Linux istemciler .local'i farklı çözmeye çalışıyor) ve bu ada hiçbir genel CA sertifika vermiyor. Dışa açık alan adının kendisini (example.com) kullanmak da iç DNS'te web sitesi için can sıkıcı kayıtlar gerektiriyor. Alt alan adı ikisini de çözüyor. Bu ismi sonradan değiştirmek pratikte mümkün değil, acele etme.

İlk DC

dc01 üzerinde rolü kuruyorum:

Install-WindowsFeature AD-Domain-Services -IncludeManagementTools

Rolü kurmak sunucuyu henüz DC yapmıyor, sadece gerekli bileşenleri yüklüyor. Asıl iş Install-ADDSForest ile. Önce aynı parametrelerle bir ön kontrol çalıştırıyorum:

$dsrm = Read-Host -AsSecureString "DSRM parolası"

Test-ADDSForestInstallation -DomainName ad.example.com -DomainNetbiosName ORNEK `
    -InstallDns -SafeModeAdministratorPassword $dsrm

DSRM (Directory Services Restore Mode) parolası, DC'yi AD servisleri kapalıyken açman gerektiğinde, örneğin yedekten geri dönerken soruluyor. Her DC'de ayrı tutuluyor ve domain'deki hiçbir hesapla ilgisi yok. Kurumun parola kasasına kaydet, domain yönetici parolasıyla aynı yapma.

Ön kontrolde hata yoksa kurulum:

Install-ADDSForest -DomainName ad.example.com -DomainNetbiosName ORNEK `
    -InstallDns -SafeModeAdministratorPassword $dsrm

-ForestMode ve -DomainMode vermedim. Verilmediğinde kurulan sunucunun desteklediği en yüksek seviye seçiliyor. Ortama daha eski sürüm bir DC katılmayacaksa bu doğru tercih.

Kurulum sırasında neredeyse her zaman şu uyarı çıkıyor:

WARNING: A delegation for this DNS server cannot be created because the authoritative parent zone cannot be found
or it does not run Windows DNS server. If you are integrating with an existing DNS infrastructure, you should
manually create a delegation to this DNS server in the parent zone to ensure reliable name resolution from outside
the domain "ad.example.com". Otherwise, no action is required.

Kurulum, üst bölge olan example.com'da ad.example.com için delegasyon oluşturmaya çalışıyor ve o bölge Windows DNS'te olmadığı için yapamıyor. AD'ye bağlı makineler DC'leri DNS olarak kullanacağı için bu sorun değil. AD dışındaki sistemlerin de ad.example.com altındaki isimleri çözmesi gerekiyorsa example.com'u yöneten DNS'te bu alt alan için NS kayıtlarını eklemen gerekiyor.

Sunucu kendiliğinden yeniden başlıyor. Açıldığında ORNEK\Administrator ile giriş yapıp kontrol ediyorum:

Get-ADDomain | Select-Object DNSRoot, NetBIOSName, PDCEmulator
Resolve-DnsName -Type SRV _ldap._tcp.dc._msdcs.ad.example.com
DNSRoot        NetBIOSName PDCEmulator
-------        ----------- -----------
ad.example.com ORNEK       dc01.ad.example.com

Name                                     Type   TTL   Section    NameTarget                     Priority Weight Port
----                                     ----   ---   -------    ----------                     -------- ------ ----
_ldap._tcp.dc._msdcs.ad.example.com      SRV    600   Answer     dc01.ad.example.com            0        100    389

SRV kaydı geliyorsa istemciler DC'yi bulabilecek demektir. Yerleşik Administrator hesabını sadece kurulumda kullanıyorum, sonrasında herkes kendi yönetici hesabıyla çalışıyor. Örneklerde geçen ORNEK\yonetici hesabını şimdi açıyorum. Domain Admins üyeliği çok geniş bir yetki, bu hesabı sadece domain ve DC yönetimi için kullan, günlük işler için ayrı ve yetkisiz bir hesabın olsun:

$parola = Read-Host -AsSecureString 'yonetici parolası'
New-ADUser -Name 'yonetici' -SamAccountName 'yonetici' `
    -UserPrincipalName 'yonetici@ad.example.com' `
    -AccountPassword $parola -Enabled $true
Add-ADGroupMember -Identity 'Domain Admins' -Members 'yonetici'

DNS tarafı

-InstallDns ile DNS rolü de kuruldu ve ad.example.com bölgesi AD'ye entegre olarak oluşturuldu. AD'ye entegre bölge, kayıtlarını ayrı bir DNS replikasyonu yerine AD veritabanında tutuyor. İkinci DC geldiğinde bölge de onunla birlikte kendiliğinden geliyor, ayrıca secondary zone kurmak gerekmiyor. Get-DnsServerZone çıktısında ad.example.com ve _msdcs.ad.example.com bölgelerinin IsDsIntegrated sütunu True olmalı.

Üç ayar daha yapıyorum.

Forwarder. İstemciler sadece DC'leri DNS olarak kullanacak. Dışarıdaki isimleri DC'nin çözebilmesi için kurumun çözücülerini forwarder olarak ekliyorum. Forwarder vermezsen DC root hint'ler üzerinden kendisi çözmeye çalışıyor, çoğu kurum ağında bu dışarı doğrudan DNS trafiği demek ve güvenlik duvarında takılıyor.

Set-DnsServerForwarder -IPAddress 198.51.100.53, 198.51.100.54

Ters bölge. Logda IP gördüğünde isme çevirebilmek ve bazı uygulamaların ters sorgu kontrolleri için:

Add-DnsServerPrimaryZone -NetworkId "10.10.20.0/24" -ReplicationScope Domain

İstemcilerin DNS ayarı. DHCP'den dağıtılan DNS sunucuları iki DC olmalı ve sadece onlar. "Yedek olsun" diye ikinci sıraya genel bir çözücü eklemek kötü fikir: istemci bir noktada ona sorarsa SRV kayıtlarını bulamıyor ve oturum açma, grup ilkesi gibi işler rastgele aksıyor. Bu tür hataların izini sürmek çok zor.

Saat

Kerberos, istemci ile DC arasındaki saat farkı varsayılan olarak beş dakikayı geçerse kimlik doğrulamayı reddediyor. Domain'de saat hiyerarşisi şöyle işliyor: üyeler DC'lerden, DC'ler PDC Emulator rolündeki DC'den, PDC de dışarıdaki bir kaynaktan alıyor. Bu yüzden dış NTP ayarını sadece PDC'de yapıyorum:

w32tm /config /manualpeerlist:"ntp1.example.com,0x8 ntp2.example.com,0x8" /syncfromflags:manual /reliable:yes /update
Restart-Service w32time
w32tm /query /source

DC sanal makinedeyse hipervizörün zaman senkronizasyonu da devreye giriyor ve bu ayarla çakışabiliyor. Hyper-V için bunu serinin son yazısında anlatıyorum.

Silinen nesneler için geri dönüşüm kutusu

AD Recycle Bin varsayılan olarak kapalı. Kapalıyken yanlışlıkla silinen bir kullanıcıyı geri getirmek yedekten authoritative restore demek. Açıkken birkaç komut. Kapatılamayan bir özellik ama kapatmak isteyeceğin bir senaryo da yok:

Enable-ADOptionalFeature -Identity 'Recycle Bin Feature' -Scope ForestOrConfigurationSet -Target ad.example.com

Serinin sonraki yazılarında kullanacağım iki OU'yu da şimdi açıyorum:

New-ADOrganizationalUnit -Name Sunucular -Path "DC=ad,DC=example,DC=com"
New-ADOrganizationalUnit -Name Personel  -Path "DC=ad,DC=example,DC=com"

New-ADOrganizationalUnit OU'ları yanlışlıkla silinmeye karşı korumalı oluşturuyor. Silmek istediğinde önce bu korumayı kaldırman gerekiyor, iyi ki öyle.

İkinci DC

dc02'de ilk iş DNS ayarı. Yazının başındaki hatanın sebebi tam olarak bu adımın atlanması:

Set-DnsClientServerAddress -InterfaceAlias Ethernet -ServerAddresses 10.10.20.11
Resolve-DnsName -Type SRV _ldap._tcp.dc._msdcs.ad.example.com
Test-NetConnection dc01.ad.example.com -Port 389

SRV kaydı dönüyor ve 389'a bağlantı TcpTestSucceeded : True diyorsa devam. Dönmüyorsa sunucunun hangi DNS'e sorduğuna bak (Get-DnsClientServerAddress), birden fazla adaptör varsa yanlış olana bakıyor olabilir.

Sunucuyu önce domain'e alıyorum, sonra DC yapıyorum. Install-ADDSDomainController workgroup'taki bir sunucuyu da doğrudan terfi ettirebiliyor ama önce üye yapmak DNS'in ve kimlik bilgilerinin çalıştığını ayrı bir adımda görmemi sağlıyor:

Add-Computer -DomainName ad.example.com -Credential (Get-Credential ORNEK\yonetici) -Restart

Açıldıktan sonra:

Install-WindowsFeature AD-Domain-Services -IncludeManagementTools

$dsrm = Read-Host -AsSecureString "dc02 DSRM parolası"
Install-ADDSDomainController -DomainName ad.example.com -InstallDns `
    -Credential (Get-Credential ORNEK\yonetici) `
    -SafeModeAdministratorPassword $dsrm

Varsayılan olarak yeni DC Global Catalog da oluyor. Tek siteli bir ortamda doğrusu da bu.

Kurulum veritabanını dc01'den kopyalayıp sunucuyu yeniden başlatıyor.

DC'lerin kendi DNS ayarları

İki DC de ayakta. Şimdi DNS istemci ayarlarını düzeltiyorum, her biri önce diğerini, sonra kendisini göstersin:

# dc01'de
Set-DnsClientServerAddress -InterfaceAlias Ethernet -ServerAddresses 10.10.20.12, 127.0.0.1
# dc02'de
Set-DnsClientServerAddress -InterfaceAlias Ethernet -ServerAddresses 10.10.20.11, 127.0.0.1

Bir DC sadece kendini gösterirse açılış sırasında kendi DNS servisinin hazır olmasını bekliyor, o arada AD servisleri ortağını bulamıyor ve açılış uzuyor. Ortağı başa koymak bunu önlüyor, 127.0.0.1 de ortak kapalıyken yedek oluyor.

SYSVOL paylaşıldı mı

Grup ilkeleri ve oturum açma script'leri SYSVOL'da duruyor, DFSR ile replike ediliyor. dc02'de şuna bakıyorum:

net share
Share name   Resource                                        Remark
-------------------------------------------------------------------------------
...
NETLOGON     C:\Windows\SYSVOL\sysvol\ad.example.com\SCRIPTS Logon server share
SYSVOL       C:\Windows\SYSVOL\sysvol                        Logon server share
The command completed successfully.

NETLOGON ve SYSVOL yoksa ilk DFSR senkronizasyonu tamamlanmamış. Birkaç dakika bekle, düzelmezse DFS Replication günlüğüne bak:

Get-WinEvent -LogName 'DFS Replication' -MaxEvents 30 |
    Select-Object TimeCreated, Id, LevelDisplayName, Message

İlk senkronizasyonun bittiğini gösteren olay 4604. Hata olaylarında en sık sebep yine DNS ya da iki DC arasındaki güvenlik duvarı.

Site ve subnet

İstemciler kendilerine en yakın DC'yi, IP adreslerinin hangi subnet'e ve o subnet'in hangi siteye ait olduğuna bakarak buluyor. Tek site olsa bile subnet'i tanımlamak iyi bir alışkanlık, yoksa DC'ler günlüğe tanımsız subnet'ten gelen istemciler için uyarı yazıyor:

New-ADReplicationSubnet -Name "10.10.20.0/24" -Site "Default-First-Site-Name"

FSMO rolleri

AD'de çoğu değişiklik herhangi bir DC'de yapılabiliyor ve diğerlerine replike oluyor. Beş iş ise tek bir DC'nin elinde tutuluyor:

RolKapsamNe yapıyor
Schema MasterOrmanŞema değişiklikleri (Exchange kurulumu gibi)
Domain Naming MasterOrmanOrmana domain eklemek ve çıkarmak
PDC EmulatorDomainSaat kaynağı, parola değişikliklerinin öncelikli yeri, hesap kilitleme
RID MasterDomainDC'lere yeni nesne kimliği havuzu dağıtmak
Infrastructure MasterDomainBaşka domain'lerdeki nesnelere referansları güncel tutmak
netdom query fsmo
Schema master               dc01.ad.example.com
Domain naming master        dc01.ad.example.com
PDC                         dc01.ad.example.com
RID pool manager            dc01.ad.example.com
Infrastructure master       dc01.ad.example.com
The command completed successfully.

İki DC'lik bir ortamda hepsinin dc01'de durması sorun değil, çoğu kısa süre ulaşılamasa kimse fark etmiyor. En hızlı hissedilen PDC Emulator.

dc01'i uzun süreli bakıma alacaksan rolleri düzgünce dc02'ye taşıyorum:

Move-ADDirectoryServerOperationMasterRole -Identity dc02 `
    -OperationMasterRole PDCEmulator, RIDMaster, InfrastructureMaster, SchemaMaster, DomainNamingMaster

PDC'yi taşırsan dış NTP ayarını da dc02'ye taşımayı unutma, yoksa domain'in saat kaynağı yerinde değil. Aynı komutun -Force ile kullanımı rolü zorla almak (seize) demek. Sadece eski DC bir daha hiç açılmayacaksa yapılıyor, sonrasında da o DC'nin metadata'sını AD'den temizlemek gerekiyor. Zorla alınmış rolün sahibi olan eski DC ağa geri gelirse iki DC aynı rolü tuttuğunu sanıyor.

Replikasyonu kontrol etmek

İlk bakacağım komut özet:

repadmin /replsummary
Source DSA          largest delta    fails/total %%   error
 DC01                      04m:12s    0 /   5    0
 DC02                      03m:51s    0 /   5    0

Destination DSA     largest delta    fails/total %%   error
 DC01                      03m:51s    0 /   5    0
 DC02                      04m:12s    0 /   5    0

fails sütununda sıfırdan farklı bir şey ya da error sütununda bir kod görüyorsan ayrıntıya iniyorsun:

repadmin /showrepl dc02

Bu çıktı her dizin bölümü için son replikasyon denemesini listeliyor, "Last attempt ... was successful" satırları görmek istiyorsun. Elle bir replikasyon tetiklemek için:

repadmin /syncall /AdeP

A bütün bölümler, d sunucuları DN ile göster, e siteler arası da dahil, P değişiklikleri bu DC'den dışarı it.

En ikna edici test yine de bir nesne oluşturup diğer tarafta aramak:

New-ADUser -Name repltest -Server dc01
Start-Sleep -Seconds 30
Get-ADUser repltest -Server dc02
Remove-ADUser repltest -Server dc01 -Confirm:$false

Aynı site içinde değişiklikler genelde birkaç saniye ile birkaç dakika arasında karşıya geçiyor.

dcdiag

dcdiag /q
dcdiag /s:dc02 /q

/q sadece hataları yazdırıyor, çıktının boş gelmesi iyi haber.

Yeni kurulmuş bir DC'de DC02 failed test SystemLog satırını sık görüyorsun. Bu test sistem günlüğündeki yakın tarihli hata olaylarına bakıyor ve kurulum ile yeniden başlatma sırasında yazılan geçici hatalar onu kırmızıya boyuyor. Olay kimliğine bakıp ne olduğunu anla, bir süre sonra tekrar çalıştır.

DNS ile ilgili ayrıntılı bir kontrol de dcdiag /test:dns /s:dc01 /v ile yapılabiliyor, forwarder ve kayıt sorunlarını da yakalıyor.

Yedek ayrı bir iş

İki DC birinin donanımı giderse diğeriyle devam etmeni sağlıyor. Biri yanlışlıkla bir OU'yu boşaltırsa o silme işlemi birkaç saniye içinde ikinci DC'ye de replike oluyor. Recycle Bin bunun bir kısmını kurtarıyor, gerisi için düzenli system state yedeği gerekiyor:

Install-WindowsFeature Windows-Server-Backup
wbadmin start systemstatebackup -backupTarget:E: -quiet

E: burada DC'ye bağlı ayrı bir disk. Yedeğin bir yerde durduğunu görmek yetmiyor, ara sıra bir test ortamında geri dönmeyi denemek gerekiyor.

Domain iki DC ile ayakta ve replikasyon temiz. Sıradaki iş bu domain'e kullanıcı eklemek ve bunu elle yapmamak.

Sıradaki yazı: PowerShell ile tekrarlanan Windows işlerini otomatiğe almak