Merhaba,
Exchange kurulumlarında karşılaşabileceğiniz “System.OverflowException: Length of the access control list
exceed the allowed maximum.” veya günlük sistem kullanımlarında bir kaynağa erişim yetkisi tanımlarken karşılaşabileceğiniz “A constraint violation occured.” hatalarının ne anlama geldiğini ve kontrolünü nasıl yapabileceğinizi anlatacağım.
Bu hataların sebebi Microsoft’un makalesinde belirttiği üzere, ACL (Access Control List) listesinin (bizim anlayacağımız dilde ise: security permissionlar) maksimum 64KB olabileceği ve bu limitin de yaklaşık olarak 1820 ACEs (Access Control List Entry) ‘e karşılık gelmesindendir.
Çözümü? Çözümü basit, ACL listesini azaltmak/temizlemek. Bunun için ilgili nesnenin security tabından istemediğiniz girdileri temizleyerek bu durumu çözebilirsiniz. İnternette ufak bir arama ile ilgili objeden ilgili kullanıcı yetkilerini kaldıran bir çok script bulabileceğiniz için onu burada paylaşmıyorum.
Fakat bu işi nasıl kontrol edebileceğinizden bahsedeceğim. Kurumsal yerlerde migariton, sunucu kurulum-kaldırma ve kulllanıcı tanımlama-silme gibi işlemler bolca yapıldığından ACL size ‘ı limite yaklaşan objeler olabilir. Bu ACL ‘ler aslında güvenlik açısından çok önemlidir. Fakat compromise olan olmayan bir çok şirketde bu ACL listeleri kabarmaktadır. İzleme yapılıyorsa elbette bunlar için alarmlar üretilebilir fakat ben henüz bir çok üst düzey kurum da dahil olmak üzere bu ACL listelerine ekleme çıkarma işlemleri için aksiyon alan çalışanlar ve firmalar görmedim. Farklı zamanlarda alınabilecek bir rapor bile aslında size fikir verecektir. Bunun için Microsoft’ un herhangi bir toolunu göremedim. Fakat internette biraz araştırma sonucu bu hesabı yaparken baz alınan parametrelerden yola çıkarak aşağıdaki scripti yazdım. Bu script ile AD Objelerinizin ACL size’lerını görebilirsiniz. Tek Obje ve Çoklu AD Objeleri için yazılan iki scripti bu yazı için bırakıyor olacağım. Dilerseniz Get-ADObject komutunu -SearchBase ve -SearchScope parametreleri ile kullanarak istediğiniz kullanıcı ve/veya Computer Ou’ larından nesneleri çekerek işlem yapabilirsiniz. Çıktıyı ekrana bastığı gibi bir dosyaya da kaydetmektedir.
Tek AD Objesi için ACL Size hesaplama scripti:
Import-Module ActiveDirectory $dn = "CN=EXC02,OU=EXC,OU=Computers,OU=Tier1,OU=Admin,DC=sign3r,DC=intra" $adsi = [ADSI]("LDAP://$dn") $sdBytes = $adsi.psbase.ObjectSecurity.GetSecurityDescriptorBinaryForm() $rawSD = New-Object System.Security.AccessControl.RawSecurityDescriptor($sdBytes, 0) $rawBytes = New-Object byte[] $rawSD.BinaryLength $rawSD.GetBinaryForm($rawBytes, 0) $report = [PsCustomObject]@{ DistinguishedName = $dn ACLSize = $rawBytes.Length } Write-Output $report
Çoklu AD Objesi* için ACL Size hesaplama scripti:
Import-Module ActiveDirectory $objects = Get-ADObject -Filter * $ReportPath = "c:\test\ObjectsACLSize.csv" $result = @() foreach ($obj in $objects) { $dn = $obj.DistinguishedName $adsi = [ADSI]("LDAP://$dn") try{ $sdBytes = $adsi.psbase.ObjectSecurity.GetSecurityDescriptorBinaryForm() $rawSD = New-Object System.Security.AccessControl.RawSecurityDescriptor($sdBytes, 0) $rawBytes = New-Object byte[] $rawSD.BinaryLength $rawSD.GetBinaryForm($rawBytes, 0) $reportobj = [PsCustomObject]@{ DistinguishedName = $dn ACLSize = $rawBytes.Length } $result += $reportobj } catch { Write-Host -ForegroundColor Red "$dn Objesinde hata alındı." $reportobj = [PsCustomObject]@{ DistinguishedName = $dn ACLSize = "ERROR : $($Error[0].Exception.Message)" } $result += $reportobj } } $result | Export-Csv -Path $ReportPath -Encoding UTF8 -Delimiter ";" -NoTypeInformation Write-Output $result
* Örnekte tüm AD Objeleri çekilmiştir. Toplu AD Objesi için olan script için çıktılar aşağıdaki gibi olacaktır.
Peki bende neden böyle bir hata verdi dersiniz? Demezsiniz artık, sebebini yukarıda zaten bahsettik. Ama senaryoyu merak eden arkadaşlar için belirteyim. Exchange kurulumunda sürekli olarak hata aldığımdan dolayı, AD üzerinde exchange obje temizliği yaptım. Fakat exchange$ bilgisayar hesabını hiç silmedim. PrepareAD komutlarında ilgili groupları sunucu üzerinde yetkilendirdiğinden, ve ben her hatada bu grupları ve Exchange AD Objelerini kaldırdığımdan taktir edersiniz ki bilgisayar hesabı üzerinde çok fazla Unknown Account bulunmaktaydı. Sayısının ekran görüntüsünü bulamadım fakat 1268 gibi bir rakamdı. Bunları temizledikten sonra hata çözümlendi.
Faydalı olması dileğiyle…