Ostrzegaj, gdy użytkownik zostanie dodany do grupy Active Directory

Spójrzmy na przykłady procesu tworzenia prostego systemu powiadamiania administratora o dodaniu nowego użytkownika do grupy zabezpieczeń Active Directory. Na przykład chcemy śledzić zmianę grupy administratorów domeny, a jeśli zostanie do niej dodany nowy użytkownik, otrzymamy powiadomienie (listem lub wyskakujące okienko).

Istnieją dwie opcje organizacji takiego rozwiązania:

  • Można włączyć inspekcję zdarzeń na kontrolerach domeny i śledzenie wystąpienia zdarzenia, gdy użytkownik zostanie dodany do grupy zabezpieczeń (EventID 4728)
  • Przechowuj lokalny plik tekstowy z listą użytkowników w określonej grupie i okresowo porównuj go z bieżącymi członkami grupy domen

Treść

  • Inspekcja dodawania użytkownika do grupy na kontrolerze domeny
  • Porównanie aktualnego składu grupy domen z szablonem

Inspekcja dodawania użytkownika do grupy na kontrolerze domeny

W przypadku, gdy masz włączone zasady inspekcji w swoim obiekcie zasad grupy Konfiguracja komputera -> Ustawienia systemu Windows -> Ustawienia zabezpieczeń -> Zaawansowana konfiguracja audytu -> Zarządzanie kontem -> Audit Security Group Management, po dodaniu użytkownika do grupy Active Directory zdarzenie EventId pojawia się w dzienniku zabezpieczeń 4728 (Członek został dodany do grupy globalnej z włączonymi zabezpieczeniami).

Za pomocą programu PowerShell można śledzić występowanie tego zdarzenia w dzienniku zabezpieczeń. Na przykład wyświetlamy wszystkie zdarzenia z tym kodem w ciągu 24 godzin na kontrolerze domeny. Dla wygody wyświetlimy nazwę grupy AD, która uległa zmianie, które konto zostało dodane, a który z administratorów dodał użytkownika do grupy (skrypt zgodny z przykładem z artykułu Uzyskiwanie listy użytkowników AD utworzonych w ciągu 24 godzin).

$ time = (get-date) - (new-timespan -hour 24)
Get-WinEvent -FilterHashtable @ LogName = "Bezpieczeństwo"; ID = 4728; StartTime = $ Time | Foreach
$ event = [xml] $ _. ToXml ()
if ($ event)

$ Time = Get-Date $ _. TimeCreated -UFormat "% Y-% m-% d% H:% M:% S"
$ NewUser = $ event.Event.EventData.Data [0]. "# Text"
$ ADGroup = $ event.Event.EventData.Data [2]. "# Text"
$ AdminUser = $ event.Event.EventData.Data [6]. "# Text"
$ dc = $ event.Event.System.computer
$ dc + „|” + $ Czas + „|” + „|” + $ ADGroup + „|” + $ NewUser + „|” + $ AdminUser

Teraz na kontrolerze domeny musisz utworzyć nowe zadanie dla programu planującego i powiązać jego uruchomienie ze zdarzeniem 4728. Kiedy to zdarzenie nastąpi, wyślij wiadomość do użytkownika (jak powiązać skrypt ze zdarzeniem opisany jest w artykule Wyzwalacze zdarzeń systemu Windows i Uruchamianie skryptu PowerShell, gdy wystąpi zdarzenie, nie powtórzę go).

Problem polega jednak na tym, że sprawdzany jest tylko jeden dziennik DC. Jeśli użytkownik został dodany do grupy na innym kontrolerze domeny, nie zobaczysz tego zdarzenia. Możesz oczywiście utworzyć subskrypcję wydarzeń z kilku kontrolerów domeny lub sortować wszystkie kontrolery za pomocą skryptu, ale jeśli w domenie jest duża liczba kontrolerów domeny, nie jest to zbyt wygodne.

Wskazówka. Przykład pętli z wyliczaniem wszystkich kontrolerów domeny w domenie za pomocą Get-ADDomainController i zbierania z nich zdarzeń może wyglądać następująco (przykład z tego artykułu):

$ time = (get-date) - (new-timespan -hour 124)
$ DCs = Get-ADDomainController -Filter *
foreach ($ DC w $ DC)
Get-WinEvent -ComputerName $ DC -FilterHashtable @ LogName = "Bezpieczeństwo"; ID = 4728; StartTime = $ Time | Foreach
$ event = [xml] $ _. ToXml ()
if ($ event)

$ Time = Get-Date $ _. TimeCreated -UFormat "% Y-% m-% d% H:% M:% S"
$ NewUser = $ event.Event.EventData.Data [0]. "# Text"
$ ADGroup = $ event.Event.EventData.Data [2]. "# Text"
$ AdminUser = $ event.Event.EventData.Data [6]. "# Text"
$ dc = $ event.Event.System.computer
$ dc + „|” + $ Czas + „|” + „|” + $ ADGroup + „|” + $ NewUser + „|” + $ AdminUser



Rozważ inne podejście.

Porównanie aktualnego składu grupy domen z szablonem

Za pomocą polecenia cmdlet Get-ADGroupMember wyświetl listę użytkowników w grupie Domain Admin i zapisz wynikową listę w pliku tekstowym (tworzymy rekurencyjną listę użytkowników, biorąc pod uwagę grupy zagnieżdżone).

(Get-ADGroupMember -Identity „Domain Admins” -recursive) .Name | Plik wyjściowy C: \ PS \ DomainAdmins.txt

Teraz dodaj nowego użytkownika do grupy Administratorzy domeny i ponownie zapisz listę użytkowników, ale do drugiego pliku.

(Get-ADGroupMember -Identity „Domain Admins” -recursive) .Name | Plik wyjściowy C: \ PS \ DomainAdminsCurrent.txt

Teraz porównaj dwa pliki i wyświetl różnice na listach:

$ oldadm = GC C: \ PS \ DomainAdmins.txt
$ newadm = GC C: \ PS \ DomainAdminsCurrent.txt
$ diff = Porównaj obiekt -ReferenceObject $ oldadm -DifferenceObject $ newadm | Select-Object -ExpandProperty InputObject
write-host $ diff

Zostało wyświetlone konto dodane do grupy AD..

Możesz wyświetlić komunikat w konsoli:

$ result = (Compare-Object -ReferenceObject $ oldadm -DifferenceObject $ diff | Where-Object $ _. SideIndicator -eq "=>" | Select-Object -ExpandProperty InputObject) -join ","
Jeśli (wynik $)
msg * "Dodano użytkownika do grupy Administratorzy domeny: $ wynik"

Lub wyślij wiadomość e-mail za pomocą polecenia cmdlet Send-MailMessage:

Jeśli (wynik $)
Send-MailMessage -SmtpServer msg01 -From [email protected] -To [email protected] -Podmiot "Użytkownik został dodany do grupy Administratorzy domeny: $ wynik" -Body "Utworzono wiadomość $ data" -Priorytet Wysoki

Ten skrypt można zapisać w pliku admins_group_changes.ps1 i uruchamiać regularnie za pomocą programu planującego (jak utworzyć zadanie programu planującego za pomocą programu PowerShell). Utwórzmy nowe zadanie dla harmonogramu, który uruchamia nasz skrypt PowerShell raz dziennie, który sprawdza skład grupy administratorów domeny za pomocą listy zapisanej lokalnie.

$ Trigger = New-ScheduledTaskTrigger -At 10:00 am -Daily
$ User = „NT AUTHORITY \ SYSTEM”
$ Action = New-ScheduledTaskAction -Execute „PowerShell.exe” -Argument „C: \ PS \ admins_group_changes.ps1”
Zarejestruj-Zaplanowane Zadanie -Nazwa „Sprawdź grupę administratorów” -Wyzwalacz $ Wyzwalacz -User $ Użytkownik -Akcja $ Akcja -RunLevel Najwyższy -Force

W ten sposób skład grupy administratorów będzie sprawdzany raz dziennie, aw przypadku zmian administrator otrzyma powiadomienie (wyskakujące okienko lub list).