lcer00
Goto Top

Überwachung von AdminSDHolder bzw. adminCount im AD mit PRTG

Windows "tagged" Administratorkonten. Dies geschieht mit Hilfe des Attributs adminCount des AD-Objekts des betreffenden Benutzers.
Wird der Benutzer einer Administratorgruppe hinzugefügt, wird dieses Attribut auf einen Wert > 0 gesetzt. Wird der Benutzer aus der Administratorengrupe entfernt, wird das vorhandene Attribut nicht verändert. Das Attribut adminCount existiert und ist größer 0 wenn das Konto entweder Admin ist oder einmal war. Dieses Verfahren wird (verkürzt ausgedrückt) auf alle Gruppen angewendet, die irgendetwas auf einem Domänencontroller zu melden haben könnten. Wichtig: auch das krbtgt-Konto wird auch überwacht, dieses ist aber normalerweise deaktiviert.

Nähere Infos gibt es z.B. unter:

Wir überwachen mit PRTG die Anzahl der Konten über einen Powershell-Sensor.

Zunächst erstellt man ein Powershellskript unter C:\Program Files (x86)\PRTG Network Monitor\Custom Sensors\EXE mit folgendem Inhalt:
$admincount = (get-aduser -Filter {(admincount -gt 0) -and (enabled -eq $true) } -Properties adminCount).count
$admincount = [math]::truncate( $admincount)
write-output "$($admincount):OK"  
Das Skript liest alle AD-Benutzer aus und filtert, ob diese aktiviert sind und das Attribut adminCount größer als Null ist. Wenn man die deaktivierten Konten mitzählen will, kann man einfach den Filter anpassen:
$admincount = (get-aduser -Filter {admincount -gt 0 } -Properties adminCount).count
$admincount = [math]::truncate( $admincount)
write-output "$($admincount):OK"  
oder nur die deaktivierten Konten:
$admincount = (get-aduser -Filter {(admincount -gt 0) -and (enabled -eq $false) } -Properties adminCount).count
$admincount = [math]::truncate( $admincount)
write-output "$($admincount):OK"  

Alternativ kann man einen XML-Sensor für alle 3 verwenden.

$admincount1 = [math]::truncate((get-aduser -Filter {admincount -gt 0 } -Properties adminCount).count)
$admincount2 = [math]::truncate((get-aduser -Filter {(admincount -gt 0) -and (enabled -eq $true) } -Properties adminCount).count)
$admincount3 = [math]::truncate((get-aduser -Filter {(admincount -gt 0) -and (enabled -eq $false) } -Properties adminCount).count)


$StringWriter = New-Object System.IO.StringWriter;
$xmlWriter = New-Object System.Xml.XmlTextWriter $StringWriter
$xmlWriter.Formatting = [System.Xml.Formatting]::Indented
$xmlWriter.Indentation = 2;
$xmlWriter.WriteStartElement("prtg")  
    $xmlWriter.WriteStartElement("result")  
        $xmlWriter.WriteElementString("channel","adminCountUsers")  
        $xmlWriter.WriteElementString("value",$admincount1);  
    $xmlWriter.WriteEndElement()
    $xmlWriter.WriteStartElement("result")  
        $xmlWriter.WriteElementString("channel","enabled adminCountUsers")  
        $xmlWriter.WriteElementString("value",$admincount2);  
    $xmlWriter.WriteEndElement()
    $xmlWriter.WriteStartElement("result")  
        $xmlWriter.WriteElementString("channel","disabled adminCountUsers")  
        $xmlWriter.WriteElementString("value",$admincount3);  
    $xmlWriter.WriteEndElement()
$xmlWriter.WriteEndElement()
Write-Output $StringWriter.ToString();

Will man wissen, welche Benutzer betroffen sind, kann man schnell in Powershell über
get-aduser -Filter {(admincount -gt 0) -and (enabled -eq $true)}
nachschauen.

Der Sensor wird als Custom Skript in PRTG eingebunden.
https://kb.paessler.com/en/topic/71356-guide-for-powershell-based-custom ... , am besten auf dem "Gerät der Probe" um Remote-Abfrageprobleme zu vermeiden.

Für den Sensor legt man dann in der PRTG-UI Grenzwerte fest, so dass er bei Änderungen von Grün auf Rot schaltet. Dabei sieht besser aus, wenn man mit +-0,5 arbeitet, damit man den grünen Bereich auch gut sehen kann. Bei uns sind 6 Konten "normal". "Oberer Grenzwert für Fehler (#)" steht auf 6,5 und "Unterer Grenzwert für Fehler (#)" auf 5,5.

Der Sensor schaltet dann auf rot, sobald sich die Anzahl der Benutzer ändert, bei denen adminCount größer 0 ist. Das ist der Fall, wenn jemand eine Admin-Berechtigung zugewiesen bekommt, die er vorher nicht hatte. Man kann also schön nachverfolgen, ob da jemand einen Benutzer mit neuen Adminrechten ausgestattet hat. Wenn das OK ist, kann man den Schwellenwert anpassen, wenn nicht, hat man ein Problem. Überwacht man die deaktivierten Konten, kann man überprüfen, ob vielleicht jemand vergessen hat, ein Admin-Konto nach getaner Arbeit wieder zu deaktivieren.

back-to-topExkurs

Das Zurücksetzten des adminCount Attributes ist ein eigenes Thema. Dazu gibt es mehrere Herangehensweisen. Man muss im Grunde
  • den Benutzer aus der auslösenden Gruppe entfernen
  • das Attribut auf 0 setzen oder löschen
  • die Sicherheits-Berechtigungen für das Benutzerobjekt korrigieren, denn die originalen Berechtigungen wurden mit den Vorgaben von AdminSDHolders ersetzt.

Grüße

lcer

Edit: XML-Sensor
Edit: Typos

Content-ID: 5735080246

Url: https://administrator.de/contentid/5735080246

Ausgedruckt am: 25.11.2024 um 12:11 Uhr

Dani
Dani 31.01.2023 um 19:41:19 Uhr
Goto Top
Moin,
Der Sensor wird als Custom Skript in PRTG eingebunden. Als Parameter gibt man die URL des Sperrliste an.
Was hast eine Sperrliste mit dem Sensor zu tun?

Für den Sensor legt man dann in der PRTG-UI Grenzwerte fest, so dass er bei Änderungen von Grün auf Rot schaltet. Dabei sieht besser aus, wenn man mit +-0,5 arbeitet, damit man den Grünen Bereich auch gut sehen kann. Bei uns sind 6 Konten "normal". "Oberer Grenzwert für Fehler (#)" steht auf 6,5 und "Unterer Grenzwert für Fehler (#)" auf 5,5.
in wie fern sieht das besser aus?


Gruß,
Dani
lcer00
lcer00 31.01.2023 um 20:53:18 Uhr
Goto Top
Zitat von @Dani:

Moin,
Der Sensor wird als Custom Skript in PRTG eingebunden. Als Parameter gibt man die URL des Sperrliste an.
Was hast eine Sperrliste mit dem Sensor zu tun?
Doofer copy&paste fehler.
Für den Sensor legt man dann in der PRTG-UI Grenzwerte fest, so dass er bei Änderungen von Grün auf Rot schaltet. Dabei sieht besser aus, wenn man mit +-0,5 arbeitet, damit man den Grünen Bereich auch gut sehen kann. Bei uns sind 6 Konten "normal". "Oberer Grenzwert für Fehler (#)" steht auf 6,5 und "Unterer Grenzwert für Fehler (#)" auf 5,5.
in wie fern sieht das besser aus?
Na wenn 6 ok ist und 5 und 7 falsch ist, ist bei der linearen PRTG-Skala nur ein nicht sichtbarer grüner Strich. Alternativ kann man lookups basteln. Die Sache mit dem Komma tut es halt auch. Aber wenn Du eine bessere Idee hast… übernehme ich gerne.

Grüße

lcer
lcer00
lcer00 22.02.2023 um 12:43:42 Uhr
Goto Top
Hallo,

Aufgrund dieses Threads: Wie überwacht man effektiv Änderungen an Domain Administrator Konten? habe ich eine kleine Erweiterung gebastelt:

param ($hash0)
$stringAsStream = [System.IO.MemoryStream]::new()
$writer = [System.IO.StreamWriter]::new($stringAsStream)
$admins = get-aduser -Filter {admincount -gt 0 } -Properties adminCount | sort-object -Property DistinguishedName | fl -Property DistinguishedName, adminCount, Enabled
$writer.write($admins.ToString())
$writer.Flush()
$stringAsStream.Position = 0
$hash1 = Get-FileHash -InputStream $stringAsStream | Select-Object Hash

if ($hash1.Hash -eq $hash0) { 
    $hashdiff = 0
} else {
    $hashdiff = 1
}



$admincount1 = [math]::truncate((get-aduser -Filter {admincount -gt 0 } -Properties adminCount).count)
$admincount2 = [math]::truncate((get-aduser -Filter {(admincount -gt 0) -and (enabled -eq $true) } -Properties adminCount).count)
$admincount3 = [math]::truncate((get-aduser -Filter {(admincount -gt 0) -and (enabled -eq $false) } -Properties adminCount).count)


$StringWriter = New-Object System.IO.StringWriter;
$xmlWriter = New-Object System.Xml.XmlTextWriter $StringWriter
$xmlWriter.Formatting = [System.Xml.Formatting]::Indented
$xmlWriter.Indentation = 2;
$xmlWriter.WriteStartElement("prtg")  
    $xmlWriter.WriteStartElement("result")  
        $xmlWriter.WriteElementString("channel","adminCountUsers")  
        $xmlWriter.WriteElementString("value",$admincount1)  
    $xmlWriter.WriteEndElement()
    $xmlWriter.WriteStartElement("result")  
        $xmlWriter.WriteElementString("channel","enabled adminCountUsers")  
        $xmlWriter.WriteElementString("value",$admincount2)  
    $xmlWriter.WriteEndElement()
    $xmlWriter.WriteStartElement("result")  
        $xmlWriter.WriteElementString("channel","disabled adminCountUsers")  
        $xmlWriter.WriteElementString("value",$admincount3)  
    $xmlWriter.WriteEndElement()
    $xmlWriter.WriteStartElement("result")  
        $xmlWriter.WriteElementString("channel","Hash")  
        $xmlWriter.WriteElementString("value",$hashdiff)  
    $xmlWriter.WriteEndElement()
$xmlWriter.WriteEndElement()
Write-Output $StringWriter.ToString();

zuerst erstell man eine Liste mit allen Adminkonten:
get-aduser -Filter {admincount -gt 0 } -Properties adminCount | sort-object -Property DistinguishedName | fl -Property DistinguishedName, adminCount, Enabled

Diese Liste wird in einen Hash umgewandelt.
$stringAsStream = [System.IO.MemoryStream]::new()
$writer = [System.IO.StreamWriter]::new($stringAsStream)
$admins = get-aduser -Filter {admincount -gt 0 } -Properties adminCount | sort-object -Property DistinguishedName | fl -Property DistinguishedName, adminCount, Enabled
$writer.write($admins.ToString())
$writer.Flush()
$stringAsStream.Position = 0
$hash1 = Get-FileHash -InputStream $stringAsStream | Select-Object Hash
$hash1

führt man dieses Code in der Powershell-Konsole aus, wird der Hash angezeit. Dieser Hash wird als Parameter an den PRTG-Sensor übergeben. Der zusätzliche Kanal kann zeigt eine 0 an, wenn der Hash identisch ist, eine 1 wenn nicht.

Jede Änderung der Zusammensetzung der Admins (DN, Konto aktiviert) wird dann mit 1 angezeigt.

Grüße

lcer