Timeouts mit Apache/Windows/LDAP/Active Directory

Ich hatte eine ganze Zeit lang versucht ein Timeout-Problem bei einem Apache-Server zu analysieren. Das Muster sah folgendermaßen aus:

Bei jedem ersten Zugriff auf den Server fragte der Server sofort nach Benutzernamen und Passwort, danach wartete der Server exakt eine Minute bevor er die Antwort sendete.

Timeouts mit Apache/Windows/LDAP/Active Directory weiterlesen

HAProxy für Active Directory LDAP

Prinzipiell ist Active Directory auf Redundanz ausgelegt, mehrere Domain Controller sorgen dafür dass immer einer verfügbar ist. AD nutzt hierfür allerdings SRV-DNS-Records, die von Clients die per LDAP auf das Active Directory zugreifen in der Regel nicht beachtet werden. Das hat den Effekt, dass Anwendungen (wenn sie überhaupt die Möglichkeit bieten mehrere LDAP-Server anzugeben) öfter mal stocken wenn der DC der als erstes eingetragen ist nicht erreichbar ist. In der Regel warten sie dann auf einen Timeout bis sie den nächsten DC probieren. Und das bei jeder Abfrage.

HAProxy für Active Directory LDAP weiterlesen

Endlosschleife bei Gruppen im Active Directory finden

Im Active Directory kann man bekanntlich Gruppen als Mitglied von anderen Gruppen eintragen. Wenn man dabei nicht aufpasst hat man in Active Directory ruck zuck eine Endlosschleife gebastelt, indem man Gruppe A als Mitglied von Gruppe B und Gruppe B als Mitglied von Gruppe A einträgt. Scripte oder Programme, die Benutzergruppen auflösen können hier schnell Probleme mit haben.

Ein schönes PowerShell-Script, das die Gruppen durchgeht und nach Endlosschleifen sucht gibt auf der Website von Richard L. Mueller.

Maximale Feldlänge im Active Directory

Bereits Freitag beschäftigte mich das Problem, dass ich bei einigen Usern keine neuen Einträge in das Notizfeld im Active Directory schreiben konnte (das Feld wird von uns als Protokoll für den Benutzer betreffenden Aktionen genutzt). Anfangs ging es recht problemlos mit diesen Befehlen:

$user = Get-QADUser -Identity $uid
$note += "`r`n" + $user.Info
Set-QADUser $user -Notes $note

Hier wird einfach das Info-Feld ausgelesen, die neue Zeile davor gesetzt und dann beim User wieder gesetzt.

Neuerdings trat dabei immer wieder der recht wenig aussagekräftigen Fehler A constraint violation occurred auf. Ein Umschreiben auf die entsprechenden Befehle von Microsoft gab dann eine etwas brauchbarere Meldung: A value for the attribute was not in the acceptable range of values.

$user = Get-ADUser -Identity $uid
$note += "`r`n" + $user.Info
$user |Set-ADUser -Replace @{Info=$note}

Diese Information brachte mich auf die richtige Spur: Attribute im AD haben (nicht wirklich überraschend) eine Maximallänge, beim Info-Feld sind es anscheinend 1024 Zeichen.

Als Workaround habe ich das Skript so umgeschrieben, dass direkt im Notizfeld nur die letzten 10 Meldungen gespeichert werden. Die Meldungen wurden ohnehin schon zusätzlich in einer Datenbank abgelegt, so dass hier nichts verloren geht. Hier das vollständige Skript:

param( [string]$uid, [string]$note )
# Fehler abfangen und als sauberen Text ausgeben
trap [Exception] { 
"ERROR: " + $_.Exception.Message
exit
}
# Einschränken was vom AD-Modul geladen wird
$env:ADPS_LoadDefaultDrive = 0
Import-Module ActiveDirectory -Cmdlet Get-ADUser,Set-ADUser
# User-Objekt holen
$user = Get-ADUser -Identity $uid -Properties Info
# Neue Notiz am Anfang einfügen
$note += "`r`n" + $user.Info
# notiz in zeilen auftrennen, erste 10 nehmen, wieder zu string zusammenfügen
$note = (($note -split '[\r\n]+') | Select-Object -First 10) -join [environment]::NewLine
# Neue Notizen wieder ins User-Objekt schreiben
$user |Set-ADUser -Replace @{Info=$note}
"SUCCESS: Die Notiz wurde hinzugefuegt"

Domain Controller remote über MMC verwalten

Heute habe ich mir auf meinem lokalen Rechner mit Windows 7 die “Remote Server Administration Tools for Windows 7” installiert um damit direkt auf unsere Domain Controller zugreifen zu können ohne jedes Mal erst eine RDP-Verbindung aufmachen zu müssen. Das ganze war eigentlich nicht sonderlich kompliziert, aber auch nicht wirklich offensichtlich, daher hier die Zusammenfassung.

Domain Controller remote über MMC verwalten weiterlesen

The server is unwilling to process the request

Manchmal hasse ich Active Directory. Und manchmal habe ich das Gefühl, das beruht auf Gegenseitigkeit. Zwei Tage habe ich jetzt versucht herauszufinden wieso meine Scripte, die einen Benutzer-Account anlegen beim setzen von Attributen abbricht. Alles was der Domain Controller dazu zu sagen hat, ist:

The server is unwilling to process the request.

Irgendwann habe ich mehr durch Trial und Error herausgefunden dass er sich weigert die primaryGroupID des Users zu setzen, allerdings nicht warum. Die Auflösung kam mehr durch Zufall in diesem Tipp: Es existierte bereits ein anderer Account mit dem gleichen Namen in einem anderen Ast. Weitere Nachfragen ergaben dann: Es handelte sich um die selbe Person, der Account hätte gar nicht neu angelegt werden müssen, nur umgezogen.

Wieder mal einige Stunden Arbeitszeit verschwendet.

Active Directory Primärgruppe eines Users mit PHP finden

Versucht man über LDAP Infos über Benutzeraccounts aus dem Active Directory zu laden, dann wird ein nicht ganz unwichtiges Detail unterschlagen: Die Primary Group des Benutzers. Eine LDAP-Abfrage nach memberOf liefert alle Gruppen, mit Ausnahme der primären. Stattdessen wird im Benutzer-Objekt eine numerische primaryGroupID abgespeichert. Diese ID taucht jedoch im Objekt der Gruppe auf den ersten Blick nicht auf. Das ganze geht sogar noch weiter: Gruppen enthalten mit dem member-Attribut alle Mitglieder. Es liegt also nahe, mit der Abfrage “(&(member=$userDN)(objectType=group))” alle Gruppen zu finden in denen sich der Benutzer befindet. Leider macht uns das Active Directory hier auch einen Strich durch die Rechnung, es liefert wieder nur alle Gruppen ohne die Primärgruppe. Active Directory Primärgruppe eines Users mit PHP finden weiterlesen