Maksymalny rozmiar listy kontroli dostępu (ACL) na obiektach katalogu Active Directory

January 19, 2020  ‐ 3 minut(a) czytania

Wszystkie obiekty w usłudze Active Directory i wszystkie dające się zabezpieczyć obiekty na komputerze lokalnym lub w sieci posiadają tzw. deskryptory zabezpieczeń, które pomagają kontrolować dostęp do obiektów. Deskryptory zabezpieczeń zawierają informacje o tym, kto jest właścicielem obiektu (owner), kto może uzyskać do niego dostęp i w jaki sposób oraz jakie są zasady audytowania dostępu.

Deskryptory zabezpieczeń obiektu zawierają listy kontroli dostępu (access-contol list, ACL) opisujące wszystkie uprawnienia zabezpieczeń, które dotyczą tego obiektu. Co do zasady deskryptory mogą zawierać dwa rodzaje list ACL:

  • Arbitralna lista kontroli dostępu (discretionary access control list, DACL), które identyfikuje użytkowników i grupy, którym zezwala się lub odmawia dostępu;
  • Systemowa lista kontroli dostępu (system access control list, SACL), która kontroluje sposób audytowania dostępu.

Ten model kontroli dostępu może być stosowany do zabezpieczania jednostkowych obiektów takich jak pliki i foldery, obiektów Active Directory, kluczy rejestru, drukarek i innych urządzeń, portów, usług, procesów i wątków. Granularności ustawień pozwala elastycznie dostosować zabezpieczenia do wymagań organizacji, wydeloegować uprawnienia do obiektów oraz ich atrybutów.

Nie ma różny bez kolców, mechanizm ma ograniczenia pojemnościowe oraz nie jest specjalnie wygodny w utrzymaniu. Dzisiaj na tapetę weźmy ograniczenia rozmiaru.

The number of bytes of memory allocated for the ACL. The size of an ACL varies with the number and size of its ACEs. The maximum size of an ACL is 64K, or approximately 1,820 ACEs, depending on the size of the ACEs. However, for performance reasons, the maximum size is not practical, it will vary from 1820 to 2000.
Źródło: How Security Descriptors and Access Control Lists Work  

The maximum size for an ACL, including its ACEs, is 64 KB (Reference: http://msdn2.microsoft.com/en-us/library/Aa374931.aspx )
It’s about the 64KB ACL size limit of Windows. It stands on every object supporting ACL

Źródło: Maximum number of ACEs in an ACL 

Jeśli jest ograniczenie to trzeba się zastanowić nad dwiema rzeczami. Po pierwsze, czy da się przekroczyć opisany limit (a zatem czy jest on zablokowany i narzędzie zwróci błąd przy przekroczeniu rozmiaru) oraz co się dzieje, gdy zostanie przekraczony (jeśli narzędzie nie blokuje zmian powyżej limitu)? Po drugie czy i jak można monitorować wielkość list ACL?

image

Microsoft, a nie mógłbyś precyzyjnie określić liczbę wpisów w ACL? I ile to jest „w przybliżeniu 1820”? Nie da rady, bo poszczególne wpisy (access control entry, ACE) różnią się długością, w zależności od ustawień. 

image

Zastanówmy się, więc jak precyzyjnie zmierzyć rozmiar listy, we właściwościach obietków zobaczymy zinterpretowaną listę (nazwy podmiotów (użytkownicy, grupy, komputery) i ich uprawnienia). 

Jak zmierzyć rozmiar listy kontroli dostępu ACL?

Pomysł pierwszy, zrzućmy listę do pliku i sprawdźmy jego rozmiar. W tym celu zrzućmy ACL za pomocą programu icacls. 

icacls C:\Scripts /save C:\Temp\AclFile.txt /T

image

Następnie sprawdźmy rozmiar pliku. 

Write-Host((Get-Item “C:\Temp\AclFile.txt”).length/1KB)

image

Przyznacie, że w przypadku plików i folderów sprawa jest nieskomplikowana i bez trudnu można by to zautomatyzować (jeśli zajdzie taka potrzeba). 

A co właściwie zapisało się w pliku? Jak wygląda lista i w jakim formacie icacls zapisał dane do pliku?

image

Powyższy format zapisu to Security Descriptor Definition Language (SDDL). Mało czytelny, ale skondensowany. I o to chodzi, gdy ma się „tylko” 64k miejsca. Rzućmy jeszcze okiem na ACE strings (jeden z formatów za pomocą których wyświetlane są listy ACL w PowerShell). 

(Get-Acl -Path “C:\Scripts");(Get-Acl -Path "C:\Scripts").Access

image

Następnie analogicznie dla obietków katalogu Active Directory. 

Get-Acl -Path "AD:CN=Domain Users,CN=Users,DC=pfe,DC=academy” | Format-List -Property PSPath,Sddl

image

Jeśli przyjmiemy, że przy kodowaniu Win-1250, jeden znak zajmuje 8 bitów, czyli 1 bajt, to możemy w prosty sposób przeliczyć wielkość ACL.

((Get-Acl -Path “AD:CN=Domain Users,CN=Users,DC=pfe,DC=academy”).Sddl | Measure-Object -Character).Characters*8/1kb

image

Udanych pomiarów w waszych środowiskach! Na koniec jeszcze kilka odnośników do materiałów źródłówych:

  1. What is 64k ACL limit
  2. How Security Descriptors and Access Control Lists Work
  3. ACL structure
  4. Best practices and guidance for writers of service discretionary access control lists
  5. Access Control Lists
  6. Security Descriptor Definition Language
  7. ACE Strings

O ile nie stwierdzono inaczej, opublikowane materiały autorskie udostępniane są na licencji Creative Commons Uznanie autorstwa-Użycie niekomercyjne-Na tych samych warunkach 4.0. W przypadku przedruków oraz tłumaczeń pewne prawa są zastrzeżone na rzecz oryginalnych twórców lub dystrybutorów.

Witrynę zasilają Netlify, Hugo i Doks.