LDAP Security
Über das Protokoll LDAP werden sehr viel auch für Angreifer interessante Informationen übertragen oder zugänglich gemacht. Diese Seite thematisiert die "Sicherheit" zu LDAP.
Risiken
Über LDAP können nicht nur Spamfilter, Drucker u.a. Geräte z.B. die Mailadressen von Anwendern im Active Directory lesen. Auch Administratoren "verwalten" über LDAP die Objekte und es es einem Angreifer gelänge, hier seine Aktionen einzuschmuggeln oder sogar Zugriffsdaten zu erlangen, dann wäre das Active Directory kompromittiert. Es gibt zwar noch andere Wege wie Kerberos (88/TCP), RPC (135,137-139/TCP) ADWS (9389/TCP) etc. aber betrachten wir erst einmal LDAP über Port 389/TP, 636/TLS und den Global Catalog über 3268/TCP und 3269/TLS). Folgende Risiken sehe ich in erster Betrachtung:
Vektor | Beschreibung | Lösung |
---|---|---|
"Mitlesen" |
Eine einfache Verbindung per LDAP über Port 389 ist erst einmal "unverschlüsselt" und wer z.B. mit WireShark die Verbindung mitlesen kann, sieht nicht nur die Anfragen und Antworten, sondern auch den Anmeldeprozess. Kommen hier dann unsichere Anmeldeverfahren zum Einsatz, dann hat der Angreifer alle Informationen für einen Angriff oder Missbrauch. |
Es gibt mehrere Optionen dies abzusichern, die auch kombiniert werden können:
|
Verändern/Replay |
Wenn sich der Angreifer "zwischen" den Client und den Server einfügen kann, dann kann er vielleicht die sichere Anmeldung nicht mitschneiden aber z.B. die Nutzdaten dennoch verändern. Der Admin möchte einen Benutzer in einer Abteilungsgruppe addieren aber der Angreifer macht daraus ein "Mein Benutzer in die DomainAdmin-Gruppe addieren. |
Solche Veränderungen können durch eine Signierung der Übertragung gesichert werden, z.B. mit:
|
DoS |
Zuletzt kann ein Angreifer natürlich einfach den erreichbaren TCP-Port mit Paketen, Verbindungsversuchen und Anmeldeversuchen belasten. Zu viele Fehlerversuche bei der Anmeldung können z.B. das Konto sperren. |
Der Schutz hiergegen ist Aufgabe einer zwischen Angreifer und LDAP-Service agierenden Firewall z.B. mit einer PreAuth-Prüfung. Auf dieses Risiko gehe ich auf dieser Seite nicht weiter ein. |
LDAP-Lücke |
Software ist nie fehlerfrei und daher ist davon auszugehen, dass in jedem LDAP-Server, sei es ein Windows Active Directory aber auch ein OpenLDAP-Server o.a. noch unterkannte Lücken schlummern, die irgendwann auffallen oder erst durch ein Updates sogar Einzug erhalten. |
Halten Sie ihre Server möglichst aktuell und abonnieren Sie die Nachrichtenkanäle der jeweiligen Hersteller. Auf dieses Risiko gehe ich auf dieser Seite nicht weiter ein. |
Client |
Eine "Integrierte" Anmeldung ist immer bevorzugt, weil der Anwender dann nicht nur einfacher und schneller auf den Service zugreifen kann, sondern jede Kennworteingabe könnte auch ein Phishing-Versuch sein und sollte reduziert werden. Wenn hier dann ein Angreifer natürlich den Client übernommen hat, dann kann er auch "als dieser User" arbeiten. |
Für den Schutz der Clients sind die gängigen Endpoint Protection Lösungen, z.B. Antivirenprogramme etc. zuständig. Über Richtlinien können Administratoren z.B. eine "Allow-List" von Programmen vorgebeben die gestartet werden können etc. |
Damit sollten die meisten Vektoren beschrieben sein.
Transport oder Applikation
Wenn wir uns rein auf die Verbindung über das Netzwerk konzentrieren, dann spricht ein Client per LDAP mit einem Server. Ich verzichte nun auf das komplette 7-Schicht OSI-Modell und übergehe dinge wie Namensauflösung, ARP-Resolution, IP-Routing, TCP-Handshake etc. und beschränkt mich auf die beiden großen Blöcke:
- Applikation (Client/Server)
Der LDAP-Client möchte eine Aktion auslösen und verbindet sich mit dem LDAP-Server auf der anderen Seite, der einfach das Protokoll "LDAP" versteht. Hier ist auch eine Authentifizierung möglich und natürlich kann auch die Anwender selbst die Daten signieren und verschlüsseln, wenn Sie nicht auf den Transport vertraut - Transport
Die Kommunikation zwischen Client und Server erfolgt fast immer über ein Netzwerk und TCP oder UDP over IP. Andere Protokolle vernachlässige ich hier weiter. TCP ist gegenüber UDP gegen Paketverluste und der Reihenfolge abgesichert, d.h. das darauf aufbauende Protokoll kann davon ausgehen, dass der Datenstrom komplett und in der korrekten Abfolge ist aber nicht, dass er unverändert und unlesbar übertragen wurde. Diese Funktion erhalten Sie mit dem Einsatz von TLS, damit Pakete auf dem Kabel verschlüsselt und signiert werden.
Auf beiden Ebenen können Sie aber hinsichtlich einer Absicherung entsprechende Vorkehrungen treffen, um Angreifer auszusperren. Der "Worst Case" ist sicherlich eine Anmeldung per LDAP ober TCP ohne Transportverschlüsselung und ohne Applikationsabsicherung mit einfachen Anmeldedaten. Die präsentieren so die Anmeldedaten auf dem Tablett und sollten sich nicht über Missbrauch wundern.
Unverschlüsselte Verbindungen würde ich nur nutzen, wenn der Client sich gar nicht anmelden muss und der LDAP-Server nur eine ganz beschränkte Menge an Informationen an anonyme Anfragen ausliefert. Die meisten LDAP-Server erlauben eine unverschlüsselte Verbindung ohne Anmeldung, um zumindest die unterstützten Protokolle und Partitionen zu melden. So liefert mein Windows 2022 DC in der MSXFAQDEV-Domain bei der Verbindung per LDP.EXE allein folgende Daten:
Ein interner Angreifer kann so schon einmal erkennen, dass es vermutlich ein DC ist und Informationen über die Zeit, Partitionen, Features, Policies und LDAP-Versionen erhalten. Security by obscurity hat aber noch nie funktioniert und auch ein Mailserver oder Webserver nehmen immer erst einmal Verbindungen an und melden entsprechende Fehler. Schließlich muss ein Client ja wissen, welche Funktionen er aufrufen kann. Bei der Anmeldung kann ich in LDP sehr umfangreich Optionen steuern und sie sehen, dass mein Windows 2022 DC in der Standardkonfiguration über unverschlüsselte Verbindungen keine "Einfache Anmeldung", d.h. "BasicAuth" erlaubt und bei der "besseren" Anmeldung auch eine Verschlüsselung nutzen kann.
Natürlich habe ich mir das auch per Wireshark angeschaut und obwohl der DC die "einfache Anmeldung" ablehnt, kann er nicht den Versuch des Clients verhindern.
Sie sollten als auf jeden Fall die "Simple Bind"-Methode über 389 ohne TLS-Verschlüsselung unterbinden.
Übrigens können Sie natürlich auch auf dem IP-Stack selbst per IPSEC einzelne oder im Extremfall alle Verbindungen verschlüsselt. Das wäre eine dritte Schutzmöglichkeit, die LDAP-Verbindung abzusichern.
LDAP Auditing
Der Domain Controller protokolliert solche Versuche allerdings nicht per Default im "Directory Service"-Eventlog. Es obliegt also dem Client, wie schlecht er seine Kennworte absichert. Als Administrator sollten Sie daher prüfen, ob sie dieses Logging aktivieren und im Eventlog solche Zugriffe auswerten.
Mit dem aktuellen Service Pack ist diese Aktion nicht mehr erforderlich. Es reicht das LDAP-Signing anzubieten, um die Events zu finden
Nur wenn sie noch ganz alte Server haben, lass ich den Key hier noch stehen.
New-ItemProperty ` -Path 'HKLM:\SYSTEM\CurrentControlSet\Services\NTDS\Diagnostics' ` -Name "16 LDAP Interface Events" ` -PropertyType DWORD ` -Value 2 ` -Force
Oder sie importieren folgende REG-Datei:
Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NTDS\Diagnostics] "16 LDAP Interface Events"=dword:00000002
Die Änderungen wurden ohne Neustart aktiv. Danach suchen Sie nach den EventID 2889 im Eventlog.
- Event ID 2889 — LDAP signing
https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/dd941849(v=ws.10) - 2020, 2023, and 2024 LDAP channel
binding and LDAP signing requirements for
Windows (KB4520412)
https://support.microsoft.com/en-us/topic/2020-2023-and-2024-ldap-channel-binding-and-ldap-signing-requirements-for-windows-kb4520412-ef185fb8-00f7-167d-744c-f299a66fc00a - How to Audit LDAP Signing in an Active
Directory Domain
https://petri.com/how-to-audit-ldap-signing-in-an-active-directory-domain/
LDAP Absicherung
Wenn Sie schon im Eventlog sind und die aktuellen Updates installiert haben, dann sollten Sie auch die folgenden "Warnungen" sehen, wenn Sie noch die schwächeren Sicherheitseinstellungen haben:
Ein zweiter Eintrag ist:
Spätestens jetzt sollte es jedem Administrator bewusst sein, dass er LDAP Signing und LDAP Channel Bindung bitte direkt aktiviert oder über einen Prozess einführt. Sie sollten:
- Auf allen Client und Servern per Gruppen
Richtlinien LDAP Signing/Channel Binding
aktivieren
Das sollte niemand stören aber sicherstellen, dass es jeder Client und jeder Server anbietet und nutzt, wenn es die andere Seite auch kann. Das allein ist aber noch kein Schutz, denn ein Angreifer könnte ja gezielt die Pakete so verändern, dass die andere Seite glaubt, der Andere könnte dies nicht. - Zugriffe kontrollieren
Daher müssen wir dann auf allen DCs kontrolliere, welche LDAP-Zugriff noch mit den alten unsicheren Verfahren erfolgen. Gibt es noch Clients, die wirklich ein "Simple Bind" machen oder die vielleicht schon mit einer starken Anmeldung ankommen aber die LDAP Signing und Channel Binding nicht umsetzen. Unser Ziel ist es, dass alle Clients die neuen sicheren Wege auch über unverschlüsseltes LDAP über Port 389/TCP nutzen. - LDAP Signing und Channel Bindung
erzwingen
Wenn alle Systeme entsprechend angepasst wurden und es keine inkompatiblen Anmeldungen mehr gibt, dann können und sollten wir die beiden Funktion LDAP Signing und Channel Bindung erzwingen. Diese Funktion gibt es seit Windows 2008R2, also ist auch schon viele Jahre verfügbar aber auch 2024 immer noch nicht als "Default" aktiv.
Mit dem letzten Schritt ist das System auch ohne TLS-Verschlüsselung und Signierung sehr sicher. Microsoft beschreibt dies sehr deutlich.
You can significantly improve the
security of a directory server by configuring the server to
reject Simple Authentication and Security Layer (SASL) LDAP
binds that do not request signing (integrity verification),
or to reject LDAP simple binds that are performed on a clear
text (non-SSL/TLS-encrypted) connection. SASL binds may
include protocols such as Negotiate, Kerberos, NTLM, and
Digest.
Unsigned network traffic is susceptible to replay attacks.
In such attacks, an intruder intercepts the authentication
attempt and the issuance of a ticket. The intruder can reuse
the ticket to impersonate the legitimate user. Additionally,
unsigned network traffic is susceptible to man-in-the-middle
(MIM) attacks in which an intruder captures packets between
the client and the server, changes the packets, and then
forwards them to the server. If this occurs on an LDAP
server, an attacker can cause a server to make decisions
that are based on forged requests from the LDAP client.
Quelle: How to enable LDAP signing in Windows Server
https://learn.microsoft.com/en-us/troubleshoot/windows-server/active-directory/enable-ldap-signing-in-windows-server
Die Replay-Attacken können Sie mit LDAP Signing verhindern. Die Konfiguration erfolgt idealerweise per Gruppenrichtlinie.
Stellen Sie in der ersten Stufe ein, dass die Funktion angeboten wird und nach der Kontrolle nicht kompatibler Anmeldungen und deren Konfiguration können Sie dann auf "muss" umstellen.
- Windows Security Changes 2023
- Event 2887, Event 2889 und LDAP Signing
- LDAP Security: LdapEnforceChannelBinding
-
LDAP channel binding
https://support.microsoft.com/en-us/help/4034879/how-to-add-the-ldapenforcechannelbinding-registry-entry -
LDAP signing
https://support.microsoft.com/en-us/help/935834/how-to-enable-ldap-signing-in-windows-server-2008 -
How to enable LDAP signing in Windows Server
https://learn.microsoft.com/en-us/troubleshoot/windows-server/active-directory/enable-ldap-signing-in-windows-server -
2020, 2023, and 2024 LDAP channel binding and LDAP signing
requirements for Windows (KB4520412)
https://support.microsoft.com/en-us/topic/2020-2023-and-2024-ldap-channel-binding-and-ldap-signing-requirements-for-windows-kb4520412-ef185fb8-00f7-167d-744c-f299a66fc00a -
Microsoft Guidance for Enabling LDAP Channel Binding and LDAP
Signing
https://msrc.microsoft.com/update-guide/advisory/ADV190023 -
KB4034879: Use the LdapEnforceChannelBinding registry entry to
make LDAP authentication over SSL/TLS more secure
https://support.microsoft.com/en-us/topic/kb4034879-use-the-ldapenforcechannelbinding-registry-entry-to-make-ldap-authentication-over-ssl-tls-more-secure-e9ecfa27-5e57-8519-6ba3-d2c06b21812e -
RFC5056 On the Use of Channel Bindings to Secure Channels
https://www.rfc-editor.org/rfc/rfc5056.html
Domaincontroller und TLS
Auch wenn LDAP Channel Binding und LDAP Signing als sicher gelten, kann TLS eine zusätzliche Sicherheit bieten oder einen sicheren Zugang für Clients bereitstellen, die kein LDAP Signing und Channel Bindung unterstützen. Sie können beide Optionen kombinieren, z.B. den Transport per TLS verschlüsseln und zusätzlich LDAP Signing und Channel Binding verwenden, was die Sicherheit natürlich erhöht.
- KB4034879: Use the LdapEnforceChannelBinding registry entry to make LDAP
authentication over SSL/TLS more secure
https://support.microsoft.com/en-us/topic/kb4034879-use-the-ldapenforcechannelbinding-registry-entry-to-make-ldap-authentication-over-ssl-tls-more-secure-e9ecfa27-5e57-8519-6ba3-d2c06b21812e
Voraussetzung ist dazu natürlich ein geeignetes Zertifikat auf den Domain Controllern. In der Standardinstallation stellt sich ein DC nämlich kein "SelfSigned"-Zertifikat aus und damit schlägt die Verbindung zum Domain Controller per LDAPS auf Port 636 erwartungsgemäß fehlt:
Damit stellt sich die Frage, woher sie die Zertifikate nehmen sollen. Es gibt, wie so oft, mehrere Möglichkeiten:
- Self Signed
Das ist sicher nicht ratsam aber für ein Testfeld oder erste Versuche durchaus möglich. Mit "New-SelfSignedCertificate" können Sie ein passendes Zertifikat auf dem DC selbst erstellen und der LDAP-Service wird dieses automatisch nutzen. Allerdings können die Client beim Verbinden nicht prüfen, ob das Zertifikat korrekt ist. Selbst wenn der Name und das Datum passen, ist der Aussteller nicht vertrauenswürdig und sie sollte nicht damit anfangen, so ein SelfSigned-Zertifikat auch noch bei allen Clients in den "Trusted Root Store" zu lesen. Das skaliert nicht und ist nicht sicher und je mehr DCs sie haben, desto mehr Zertifikate werden regelmäßig zu tauschen sein. Für ein Testfeld mit einem Single-DC können Sie damit aber experimentieren. - Eigene PKI
Wenn der LDAP-Dienst nur von ihren eigenen Clients erreicht werden soll, dann können Sie über eine kleine "Firmen-PKI" nachdenken, die sie nur für interne Zertifikate nutzen. Wenn Sie auf SMIME, EFS etc. verzichten und z.B. nur Zertifikate für Transportverschlüsselung (LDAP, HTTP, POP, IMAP, SMTP, RDP) oder die Anmeldung (Smartcard, Computerzertifikate) ausstellen, und auf der Zertifizierungsstelle kein "Key Recovery" brauchen, dann kann eine AD-Integrierte RootCA mit diesen wenigen Templates die beste Lösung sein. Siehe auch Die Zertifikatsstelle in der eigenen Firma. Das "Vertrauen" in diese CA wird durch das AD zumindest für alle Domainmitglieder sichergestellt. - Öffentliche Zertifikate
Der Betrieb einer eigenen PKI ist natürlich auch nicht "kostenfrei". Sie müssen etwas Wissen und Administration einrechnen und eine VM für einen Member-Server. Es kann daher auch sinnvoll sein, Zertifikate von einer öffentlichen PKI für den LDAP-Dienst zu kaufen. Das hat den Charme, dass diese Zertifikate auch von Systemen als gültig angesehen werden, die nicht AD-Mitglied sind.
Ein SelfSigned-Zertifikat können Sie direkt per PowerShell generieren. Hier habe ich ein Beispiel, welches ein SAN-Zertifikate für zwei DCs (DC01 und DC02) und dem Alias "ldap" als Subject Alternate Name" generiert.
# Zertifikat anlegen $Certificate = New-SelfSignedCertificate ` -Subject ldap.msxfaqdev.de ` -DNSName "ldap.msxfaqdev.de","dc01.msxfaqdev.de","dc01","dc02.msxfaqdev.de","dc02" ` -CertStoreLocation Cert:\LocalMachine\My ` -KeyExportPolicy Exportable
Welches Zertifikat der LDAP-Service gebunden hat, können Sie einfach mit einer TLS-Verbindung auf Port 636 oder 3269 prüfen. Programme wie LDP zeigen leider das Zertifikat nicht an
Dafür gibt es dann aber andere Werkzeuge wie OpenSSL oder Get-TCPCert. Natürlich können Sie bis TLS 1.2 auch mittels WireShark den TLS Handshake anschauen. Sollte ich das Zertifikat nicht binden, dann können Sie z.B. über CAPI2-Debugging ggfls. den Fehler im Eventlog finden.
Auch wenn TLS gerne als Allzweckwaffe zur
Absicherung per Signierung und Verschlüsselung gepriesen
wird, ist auch TLS nicht 100% sicher", denn es gibt sehr
wohl Deep Inspection Proxy-Systeme, über die Eine Firma auch
TLS-Kommunikation aufbrechen kann. Dies kann über
ExtendedProtection, Zertifikats-Pinning etc. erschwert
werden.
Das machen mittlerweile einige Smartphone-Apps
(Homebanking), um solche Angriffe zu erkennen. Allerdings
muss ein Zertifikatstausch dann auch immer mit einem
App-Update einhergehen, was nicht immer einfach ist.
- AD LDS Zertifikate für LDAPS
- AD LDS-Server
- SelfSSL
- Offizielle Zertifikate / SAN-Zertifikate
-
Configuring a Certificate
Template for Domain Controllers
https://www.gradenegger.eu/en/configuring-a-certificate-template-for-domain-controllers/ - Tutorial: Configure secure LDAP for a
Microsoft Entra Domain Services managed
domain
https://learn.microsoft.com/en-us/entra/identity/domain-services/tutorial-configure-ldaps - Enable LDAP over SSL with a third-party certification authority
https://learn.microsoft.com/en-us/troubleshoot/windows-server/active-directory/enable-ldap-over-ssl-3rd-certification-authority - LDAPS with self-signed certificate
https://blog.alexmags.com/posts/ldaps-with-self-signed-cert/ - Troubleshoot LDAP over SSL connection
problems
https://learn.microsoft.com/en-us/troubleshoot/windows-server/identity/ldap-over-ssl-connection-issues
Windows Clients?
Wenn Sie auf dem Server nun alle Prüfungen durchlaufen und zumindest LDAP Signing und LDAP Challenge Binding erzwungen und optional auch noch TLS aktiviert haben, dann steht die Frage aus, wie man den Client härtet. Als Client kann ich aber nur machen, was der Server zulässt. Wenn dieser LDAP Signing und LDAP Challenge Binding erzwingt, dann kann ich gar keine schwache Anmeldung mehr durchführen. Das verhindert aber nicht, dass der Client es nicht doch versucht oder auf 389/TCP statt 636/TLS eine Verbindung aufbaut
Ich habe bisher noch keinen Weg gefunden, wie ich einen Windows Client dazu bringen kann, nur noch LDAPS über 636/TLS zu sprechen. Bislang haben alle meine Client auch immer eine Verbindung per LDAP (389/TCP, 3268/TCP) versucht und sich "sicher" angemeldet.
Das "Sicher Anmelden" kann ich aber auf dem Client sehr wohl fordern und damit verhindern, dass sich zumindest Windows und alle Programe, die ADSI nutzen, mi einer schwachen Anmeldung authentifiziere. Das kann natürlich dazu führen, dass ich mich dann nicht per per LDAP zu Servern verbinden kann, die LDAP-Signing und LDAP Channel Binding nicht unterstützen. Das sollte mir die Sicherheit aber wert sein. Die Konfiguration ist wie bei den Domain Controllern per RegEdit oder besser noch per Gruppenrichtlinie steuerbar.
Beachten Sie du den jeweiligen Einstellungen auch die Hinweise, auf die Sie die GPO auch verweist
- Client, service, and program issues can occur if you change security
settings and user rights assignments
https://support.microsoft.com/en-us/topic/client-service-and-program-issues-can-occur-if-you-change-security-settings-and-user-rights-assignments-0cb6901b-dcbf-d1a9-e9ea-f1b49a56d53a
Weitere Links
- Event 2887, Event 2889 und LDAP Signing
- LDAP Security: LdapEnforceChannelBinding
- Checkliste Active Directory Absicherung
- WireShark
- Windows Security Changes 2023
- IIS Extended Protection
- Die Zertifikatsstelle in der eigenen Firma
- OpenSSL
- Get-TCPCert
- TLS Handshake
- CAPI2-Debugging
- Windows Security Changes 2023
- ADV190023 Security Advisory Microsoft Guidance for Enabling LDAP
Channel Binding and LDAP Signing
https://msrc.microsoft.com/update-guide/advisory/ADV190023 - How to enable LDAP signing in Windows Server
https://learn.microsoft.com/en-us/troubleshoot/windows-server/active-directory/enable-ldap-signing-in-windows-server - KB4034879: Use the LdapEnforceChannelBinding registry entry to make LDAP
authentication over SSL/TLS more secure
https://support.microsoft.com/en-us/topic/kb4034879-use-the-ldapenforcechannelbinding-registry-entry-to-make-ldap-authentication-over-ssl-tls-more-secure-e9ecfa27-5e57-8519-6ba3-d2c06b21812e - 2020, 2023, and 2024 LDAP channel binding and LDAP signing requirements for
Windows (KB4520412)
https://support.microsoft.com/en-us/topic/2020-2023-and-2024-ldap-channel-binding-and-ldap-signing-requirements-for-windows-kb4520412-ef185fb8-00f7-167d-744c-f299a66fc00a - Decrypt Kerberos/NTLM “encrypted stub data” in Wireshark
https://medium.com/tenable-techblog/decrypt-encrypted-stub-data-in-wireshark-deb132c076e7 - HTTP Public Key Pinning
https://de.wikipedia.org/wiki/HTTP_Public_Key_Pinning - LDAP 389 - Can we disable it
https://techcommunity.microsoft.com/t5/microsoft-defender-for-identity/ldap-389-can-we-disable-it/m-p/3774819