barisnetblog.space — Fine-Grained Password Policy ile Gruplara Özel Parola Kuralları
Windows Server 21 Ekim 2026 4 dk okuma 3 görüntülenme

Fine-Grained Password Policy ile Gruplara Özel Parola Kuralları

Tek bir domain parola politikası yerine yöneticilere, servis hesaplarına ve standart kullanıcılara farklı PSO'lar uyguluyoruz. Precedence mantığı, shadow group ve sonucu doğrulama adımları.

GPO yazısında domain parola politikasının yalnızca Default Domain Policy üzerinden uygulanabildiğini ve OU'ya bağlanan parola ayarlarının domain hesaplarını etkilemediğini görmüştük. Peki yöneticilerden 15 karakter, standart kullanıcılardan 12 karakter istemek isterseniz? Bunun cevabı, orada kısaca değindiğimiz Fine-Grained Password Policy (FGPP)'dir. Bu yazıda firma.local domain'inde birden fazla parola politikası oluşturacak, hangisinin kazandığını belirleyen öncelik kurallarını inceleyecek ve sonucu doğrulayacağız.

FGPP Nasıl Çalışır?

FGPP, Password Settings Object (PSO) adı verilen nesnelerle çalışır. Temel kurallar şunlardır:

  • Gereksinim: Domain functional level en az Windows Server 2008 olmalıdır.
  • Konum: PSO'lar CN=Password Settings Container,CN=System,DC=firma,DC=local altında saklanır, GPO'larla ilgisi yoktur.
  • Hedef: PSO yalnızca kullanıcılara ve global güvenlik gruplarına uygulanır. OU'lara doğrudan uygulanamaz.
  • Kapsam: Parola kuralları ve hesap kilitleme ayarları birlikte tanımlanır. Kerberos ayarları PSO'da yoktur.
  • Yedek: Bir kullanıcıya hiçbir PSO uygulanmıyorsa Default Domain Policy'deki değerler geçerli olur.

Senaryo: Üç Farklı Politika

Örnek ortamımızda üç grup için farklı kurallar istiyoruz:

  • Yöneticiler (`Domain Admins`): 15 karakter, 60 günde bir değişim, 3 hatalı denemede kilit.
  • Servis hesapları (`Servis-Hesaplari`): 24 karakter, yılda bir değişim, kilitlenme yok.
  • Muhasebe (`Muhasebe`): Finansal verilere eriştikleri için 14 karakter ve 90 gün.

Diğer tüm kullanıcılar Default Domain Policy'deki 12 karakterlik kuralı kullanmaya devam edecek.

PSO Oluşturmak

GPO yazısındaki yönetici PSO'sunu zaten oluşturduysanız aynı adla tekrar oluşturmayın; değerlerini Set-ADFineGrainedPasswordPolicy ile güncelleyin. Precedence 10 da kullanımda olduğundan aynı değerle farklı adlı bir PSO da oluşturulamaz. Sıfırdan başlayanlar için üç PSO:

PowerShell
New-ADFineGrainedPasswordPolicy -Name "PSO-Yoneticiler" -Precedence 10 `
    -MinPasswordLength 15 -ComplexityEnabled $true -PasswordHistoryCount 24 `
    -MaxPasswordAge "60.00:00:00" -MinPasswordAge "1.00:00:00" `
    -LockoutThreshold 3 -LockoutDuration "00:30:00" -LockoutObservationWindow "00:30:00" `
    -ReversibleEncryptionEnabled $false

New-ADFineGrainedPasswordPolicy -Name "PSO-Servis" -Precedence 20 `
    -MinPasswordLength 24 -ComplexityEnabled $true -PasswordHistoryCount 24 `
    -MaxPasswordAge "365.00:00:00" -MinPasswordAge "1.00:00:00" `
    -LockoutThreshold 0 -ReversibleEncryptionEnabled $false

New-ADFineGrainedPasswordPolicy -Name "PSO-Muhasebe" -Precedence 30 `
    -MinPasswordLength 14 -ComplexityEnabled $true -PasswordHistoryCount 12 `
    -MaxPasswordAge "90.00:00:00" -MinPasswordAge "1.00:00:00" `
    -LockoutThreshold 5 -LockoutDuration "00:15:00" -LockoutObservationWindow "00:15:00" `
    -ReversibleEncryptionEnabled $false

Süreler gün.saat:dakika:saniye biçimindedir. LockoutThreshold 0 hesabın hiç kilitlenmeyeceği anlamına gelir; servis hesaplarında bir saldırganın hesabı kilitleyip servisi durdurmasını engeller, ancak bu hesaplar için uzun ve rastgele parola şarttır.

Servis hesapları için grubu henüz oluşturmadıysanız önce oluşturun, ardından PSO'ları gruplara bağlayın:

PowerShell
New-ADGroup -Name "Servis-Hesaplari" -GroupScope Global -GroupCategory Security `
    -Path "OU=Gruplar,OU=Firma,DC=firma,DC=local"

Add-ADFineGrainedPasswordPolicySubject -Identity "PSO-Yoneticiler" -Subjects "Domain Admins"
Add-ADFineGrainedPasswordPolicySubject -Identity "PSO-Servis" -Subjects "Servis-Hesaplari"
Add-ADFineGrainedPasswordPolicySubject -Identity "PSO-Muhasebe" -Subjects "Muhasebe"

Muhasebe grubunun kapsamının Global olduğunu Get-ADGroup Muhasebe | Select-Object GroupScope ile kontrol edin.

Mevcut PSO'ları ve kimlere uygulandıklarını listeleyin:

PowerShell
Get-ADFineGrainedPasswordPolicy -Filter * |
    Select-Object Name, Precedence, MinPasswordLength, MaxPasswordAge, LockoutThreshold |
    Sort-Object Precedence

Get-ADFineGrainedPasswordPolicySubject -Identity "PSO-Muhasebe"

Aynı işlemleri grafik arayüzden yapmak isterseniz Active Directory Administrative Center (dsac.exe) içinde firma (local) > System > Password Settings Container yolunu kullanın. dsa.msc bu iş için uygun değildir.

Precedence: Hangi PSO Kazanır?

Bir kullanıcı birden fazla gruba üye olduğunda birden fazla PSO ile eşleşebilir. Örneğin hem Domain Admins hem Muhasebe üyesi olan bir yönetici. Kural sırası şöyledir:

  • Kullanıcıya doğrudan bağlı PSO önce gelir: Kullanıcıya doğrudan bir PSO bağlanmışsa, grup PSO'larının precedence değeri ne olursa olsun bu PSO uygulanır. Birden fazla doğrudan PSO varsa en düşük precedence kazanır.
  • Grup PSO'larında en düşük precedence kazanır: Doğrudan PSO yoksa, kullanıcının üye olduğu tüm grupların PSO'ları karşılaştırılır ve en küçük sayı kazanır.
  • Eşitlikte GUID belirler: İki PSO aynı precedence değerine sahipse en küçük GUID'e sahip olan uygulanır. New-ADFineGrainedPasswordPolicy kullanımda olan bir precedence değerini zaten hata vererek reddeder; bu durum ancak ADSI Edit gibi araçlarla oluşabilir.
  • Ayarlar birleşmez: Kazanan PSO'nun tüm ayarları uygulanır; iki PSO'dan en sıkı ayarlar seçilip harmanlanmaz.

Bu yüzden precedence değerlerini 10, 20, 30 gibi aralıklı verin; araya yeni bir politika eklemeniz gerektiğinde tüm numaraları değiştirmek zorunda kalmazsınız.

Sonucu Doğrulamak

Bir kullanıcıya gerçekte hangi PSO'nun uygulandığını görmenin en güvenilir yolu:

PowerShell
Get-ADUserResultantPasswordPolicy -Identity "ahmet"

Komut hiçbir çıktı vermezse kullanıcıya PSO uygulanmıyordur ve Default Domain Policy geçerlidir. Aynı bilgiyi kullanıcı nesnesinin msDS-ResultantPSO özniteliğinden de okuyabilirsiniz:

PowerShell
Get-ADUser -Identity "ahmet" -Properties msDS-ResultantPSO, msDS-UserPasswordExpiryTimeComputed |
    Select-Object Name, msDS-ResultantPSO,
        @{n="ParolaBitis";e={[datetime]::FromFileTime($_."msDS-UserPasswordExpiryTimeComputed")}}

Bir PSO'nun önceliğini sonradan değiştirmek için:

PowerShell
Set-ADFineGrainedPasswordPolicy -Identity "PSO-Muhasebe" -Precedence 25

OU'ya PSO Uygulamak: Shadow Group

PSO'lar OU'ya bağlanamadığı için, bir OU'daki tüm kullanıcılara politika uygulamak istediğinizde shadow group kullanılır. Bu, OU'daki kullanıcıları içeren ve düzenli olarak güncellenen bir gruptur:

PowerShell
$ou = "OU=Kullanicilar,OU=Firma,DC=firma,DC=local"
$grup = "SG-Kullanicilar-OU"

$ouUyeleri = Get-ADUser -SearchBase $ou -SearchScope Subtree -Filter *
$grupUyeleri = Get-ADGroupMember -Identity $grup | Where-Object objectClass -eq "user"

# OU'da olup grupta olmayanlari ekle
$ouUyeleri | Where-Object { $_.SID -notin $grupUyeleri.SID } |
    ForEach-Object { Add-ADGroupMember -Identity $grup -Members $_ }

# Grupta olup artik OU'da olmayanlari cikar
$grupUyeleri | Where-Object { $_.SID -notin $ouUyeleri.SID } |
    ForEach-Object { Remove-ADGroupMember -Identity $grup -Members $_ -Confirm:$false }

Bu betiği zamanlanmış bir görevle saatte bir çalıştırırsanız grup, OU ile senkron kalır.

PSO Silmek

PSO yanlışlıkla silinmeye karşı korumalıysa silme işlemi hata verir. Bu yüzden silmeden önce korumayı kaldırın:

PowerShell
Remove-ADFineGrainedPasswordPolicySubject -Identity "PSO-Muhasebe" -Subjects "Muhasebe" -Confirm:$false
Set-ADFineGrainedPasswordPolicy -Identity "PSO-Muhasebe" -ProtectedFromAccidentalDeletion $false
Remove-ADFineGrainedPasswordPolicy -Identity "PSO-Muhasebe" -Confirm:$false

Sık Karşılaşılan Hatalar

  • PSO'yu OU'ya bağlamaya çalışmak: Desteklenmez. Shadow group oluşturun ve PSO'yu gruba bağlayın.
  • Domain Local veya dağıtım grubu kullanmak: PSO yalnızca global güvenlik gruplarında çalışır. Grup kapsamını kontrol edin.
  • `net user /domain` çıktısına güvenmek: Bu komut Default Domain Policy değerlerini gösterir, PSO'yu yansıtmaz. Get-ADUserResultantPasswordPolicy kullanın.
  • Aynı precedence değerini vermeye çalışmak: PowerShell komutu hata verir. ADSI Edit ile verilmiş eşit değerler varsa kazanan GUID'e göre belirlenir; her PSO'ya benzersiz bir değer verin.
  • Kilit süresinin gözlem penceresinden kısa olması: LockoutDuration, LockoutObservationWindow değerinden küçük olamaz; komut hata verir.
  • Minimum yaşın maksimum yaştan büyük olması: MinPasswordAge, MaxPasswordAge değerinden küçük olmalıdır. Kontrol edip yeniden deneyin.

Bir sonraki yazıda, servis hesaplarının parola derdini tamamen ortadan kaldıran gMSA (Group Managed Service Account) kullanımını anlatacağız.

Okuma görünümü 3 görüntülenme