Erstellen eines Python-Dienstes zum Abfragen von AD-Attributen
Ich integriere unser AD in Webdienste, auf denen Python unter Linux ausgeführt wird, und verwende Python-LDAP über SASL (DIGEST-MD5), um AD 2012-Benutzerattribute (Abteilung, Abteilung, Telefonerweiterung, E-Mail usw.) abzufragen. Nachdem ich die für meinen Dienst spezifischen Probleme mit einem AD 2003 behoben hatte, trat bei unserem neuen AD 2012 ein SPN-Fehler auf, bei dem der Digest-Uri nicht mit den SPNs auf dem Server übereinstimmte. Ich habe die SPN-Liste für beide Server referenziert und sie enthalten identische Analoga voneinander.
Der Fehler: Die Digest-URL entspricht nicht den für diesen Server registrierten LDAP-SPNs
Die Reparatur?
Dies wurde behoben durch Ausführen von:
setspn -A ldap/<Domain_Name> <Computer_Name>
Beachten Sie, dass das Erstellen eines Dienstkontos meinen SPN-Fehler nicht behoben hat, selbst wenn der folgende Befehl ausgeführt wurde:
setspn -A ldap/<Domain_Name> <Domain_Name>/<Service_Account_Name>
simple_bind_s () benötigt keinen SPN, sasl_interactive_bind_s () benötigt SPN
Nur das Hinzufügen des SPN zur SPN-Liste des lokalen Computers funktionierte für meinen Python-LDAP-Dienst mit sasl_interactive_bind_s (). Ich sollte auch beachten, dass der SPN-Schritt übersprungen werden kann, wenn ich simple_bind_s () verwende, diese Methode jedoch Anmeldeinformationen im Klartext sendet, was nicht akzeptabel ist.
Ich habe jedoch festgestellt, dass der Datensatz nur etwa eine Minute auf der SPN-Liste bleibt, bevor er verschwindet. Es gibt keine Fehler, wenn ich den Befehl setspn ausführe, die Ereignisprotokolle sind vollständig leer, es gibt nirgendwo Duplikate, die mit der Wald-weiten Suche auf der Basis dn überprüft wurden und nichts. Ich habe den SPN hinzugefügt und versucht, ihn erneut hinzuzufügen, zu entfernen und von Objekt zu Objekt zu verschieben, um sicherzustellen, dass er sich nirgendwo versteckt. In der Sekunde, in der ich das Objekt irgendwo hinzufüge und dann versuche, es erneut hinzuzufügen, werde ich über ein Duplikat informiert. Ich bin also sehr zuversichtlich, dass irgendwo kein Duplikat versteckt ist.
Der Hack
Im Moment habe ich eine geplante Aufgabe, die den Befehl erneut ausführt, um die Aufzeichnung in der Liste zu halten, damit mein Dienst mit dem passenden Namen "SPN Hack" funktioniert.
cmd.exe /C "setspn -A ldap/<Domain_Name> <Computer_Name>"
bis ich herausfinden kann, warum der SPN von der Liste gestrichen wird.
Ich bin nicht der Hauptadministrator für diese bestimmte AD. Könnte der Administrator einen Dienst ausführen, der den SPN von einem anderen Dienst auf der AD synchronisiert, und sich dessen nicht bewusst sein? Mein Titel ist Web Developer, nicht als Entschuldigung, sondern um meine Unwissenheit über Active Directory zu erklären. Mir wurde gesagt, dass ich die AD zur Hauptbenutzer-Datenbank machen soll, und ich habe viel gelesen, aber ich kann nirgendwo finden, wo Leute ein Problem damit haben, dass der SPN regelmäßig "überschrieben" oder "bereinigt" wird und keiner der Administratoren sind mit SPN außerhalb von SQLServer-Einträgen sehr vertraut.
Warum brauche ich den Hack?
Bisher scheint mein Hack keine Probleme für Benutzer oder Dienste verursacht zu haben und hat keine Fehler generiert. Der Administrator sagt also, er lasse es einfach laufen und ich werde weiter suchen. Aber dann befinde ich mich in der prekären Situation, einen Dienst zu schreiben, auf dessen Implementierung aufgebaut ist, im Wesentlichen ein Cron-Hack / Shiver ... Also wäre jede Hilfe dankbar.
Aktualisieren
Nach einem Gespräch mit dem Systemadministrator hat er zugestimmt, dass das Erstellen eines Dienstes auf einem Hack keine Lösung darstellt. Daher hat er mir die Erlaubnis erteilt, einen lokalen Dienst mit Endpunktverschlüsselung zu starten, den ich für meine Zwecke verwenden kann. Das Ergebnis ist dasselbe . Ich werde ein Auge darauf werfen, was dazu führt, dass der SPN gelöscht wird. Lokale Bindungen sind mit Python-LDAP kein Problem, und der lokale Dienst ist bereits nach etwa einer Stunde betriebsbereit. Es ist bedauerlich, dass ich im Wesentlichen Funktionen einbinde, die in LDAP integriert sind, aber wir tun, was wir tun müssen.
quelle
Antworten:
Dies ist ein wirklich interessantes (und nerviges) Phänomen, und ich bestehe darauf, dass wir herausfinden, was hier vor sich geht.
Glücklicherweise verfügt Windows Server seit 2008 über einige detaillierte Überwachungsrichtlinien, und wir können die Überwachung verwenden, um festzustellen, wer dies getan hat. Dazu müssen wir:
Finden Sie heraus, wo die SPN-Änderung auftritt:
Öffnen Sie eine Eingabeaufforderung mit erhöhten Rechten auf einem Domänencontroller und geben Sie diesen Befehl ein:
Die Ausgabe enthält den Namen des Domänencontrollers, der ursprünglich die aktuelle Version des Attributwerts servicePrincipalName geschrieben hat:
Aktivieren Sie die AD DS-Objektänderungsüberwachung:
Wenn noch keine globale Überwachungsrichtlinie definiert ist, können Sie diese Änderung an der im vorherigen Schritt angegebenen lokalen Sicherheitsrichtlinie auf dem Domänencontroller vornehmen
Öffnen Sie die Group Policy Management Console (
gpmc.msc
), suchen Sie dieDefault Domain Controllers Policy
und bearbeiten Sie sie.Computer Configuration -> Windows Settings -> Security Settings
Local Policies -> Security Options
Advanced Audit Policy -> Audit Policies -> DS Access
Legen Sie einen Überwachungs-ACE für das Objekt fest:
Öffnen Sie Active Directory-Benutzer und -Computer (
dsa.msc
) und überprüfen Sie die Einstellung "Erweiterte Funktionen" im Menü "Ansicht".Navigieren Sie zum Computerkontoobjekt, klicken Sie mit der rechten Maustaste darauf und wählen Sie Eigenschaften. Wählen Sie die Registerkarte Sicherheit und klicken Sie auf die Schaltfläche "Erweitert".
In der Eingabeaufforderung wählen Sie die Revision Registerkarte und stellen Sie sicher , dass „Schreiben alle Eigenschaften“ für geprüfte wird jeder . Wenn nicht oder wenn Sie Zweifel haben, fügen Sie einen neuen Eintrag hinzu:
( Wenn Sie faul sind, können Sie einfach "Alle Eigenschaften schreiben" auswählen. )
Reproduzieren Sie den Fehler
Aus Ihrer Frage geht hervor, dass der SPN jede Minute oder so gelöscht wird. Dies ist wahrscheinlich der einfachste Schritt. Nehmen Sie in der Zwischenzeit eine 1-minütige Musikstunde .
Überprüfen Sie das Sicherheitsprotokoll auf dem fehlerhaften DC
Nachdem eine Minute vergangen ist, überprüfen wir das Sicherheitsprotokoll auf dem Domänencontroller, der in Schritt 1 als Urheber identifiziert wurde. Dies kann in großen Domänen schmerzhaft sein, aber das Filtern kann dabei helfen:
Windows Logs -> Security
<All Event IDs>
" 5136 ein (dies ist die Ereignis-ID für die Änderung des Verzeichnisobjekts).Sie sollten nun in der Lage sein, einen Ereigniseintrag für jede Änderung des
servicePrincipalName
Attributs auf dem Computerkonto zu finden.Identifizieren Sie den "Betreff", der für die Änderung verantwortlich ist, und sehen Sie, woher sie stammt. Töte diesen Prozess / diese Maschine / dieses Konto mit Feuer!
Wenn das Subjekt identifiziert als
SYSTEM
,ANONYMOUS LOGON
oder eine ähnlich allgemeine Beschreibung, sind wir mit der internen Verarbeitung auf dem Domänencontroller selbst zu tun, und wir werden einige NTDS - Diagnoseprotokollierung ausbrechen müssen , um herauszufinden , was los ist . Bitte aktualisieren Sie die Frage, wenn dies der Fall istquelle