Part 6 of the secure LDAP series combining connection login and account controls
|

Are You Hoping Your LDAP Is Secure – or Do You Know? (Part 6 of 6)

Enabling businesses to self-secure providing enterprise-grade security practices, regardless of size. Businesses shouldnโ€™t REQUIRE massive IT security teams to keep their business safe.

Part 6 of 6 ยท Moving Past LDAP Simple Bind

This is the finale, but don’t worry if it’s your first stop – it stands on its own. The idea the whole series is built on: securing LDAP isn’t one task, it’s three – the connection, the login, and the account – and the trick is doing all three, in the right order. This part is where they come together.

This series has separated “securing LDAP” into three jobs – the connection (A), the login (B), and the account (C) – and shown that doing one is not doing the other two. The earlier parts took each in turn: the exposure and the 2025 changes (Part 2), then the connection (Part 3), the login (Part 4), and the account (Part 5). This final part puts the pieces in order, handles the one infrastructure question that always comes up (the F5), and documents the escape hatch for the legacy system that just will not move yet.

๐—” ๐—บ๐—ถ๐—ด๐—ฟ๐—ฎ๐˜๐—ถ๐—ผ๐—ป ๐—ฝ๐—ฎ๐˜๐—ต ๐˜๐—ต๐—ฎ๐˜ ๐—ฟ๐—ฒ๐˜€๐—ฝ๐—ฒ๐—ฐ๐˜๐˜€ ๐—ฎ๐—น๐—น ๐˜๐—ต๐—ฟ๐—ฒ๐—ฒ ๐—ฐ๐—ผ๐—ป๐—ฐ๐—ฒ๐—ฟ๐—ป๐˜€

So where do you actually start? Not by flipping a setting – by looking. This sequence deliberately tackles all three concerns rather than just the one that is easiest to turn on:

  1. ๐——๐—ถ๐˜€๐—ฐ๐—ผ๐˜ƒ๐—ฒ๐—ฟ – turn on LDAP Interface Events (level 2); collect Event IDs 2887/2889 across all DCs to inventory every cleartext or unsigned bind (Concerns A and B in plain sight). This is the Part 2 audit.

  2. ๐—ฃ๐—ฟ๐—ถ๐—ผ๐—ฟ๐—ถ๐˜๐—ถ๐˜‡๐—ฒ – map each finding to an owner and a target: move to Kerberos/SASL (B), wrap in LDAPS/StartTLS (A), move to a gMSA/dMSA and trim rights (C), or retire it.

  3. ๐—•๐˜‚๐—ถ๐—น๐—ฑ ๐˜๐—ต๐—ฒ ๐—ฐ๐—ต๐—ฎ๐—ป๐—ป๐—ฒ๐—น (๐—”) – confirm AD CS issues DC certificates, clients trust the chain, and 636/3269 are open; then verify TLS version and ciphers.

  4. ๐—™๐—ถ๐˜… ๐˜๐—ต๐—ฒ ๐—ฏ๐—ถ๐—ป๐—ฑ (๐—•) – convert clients to SASL/Kerberos where supported; otherwise LDAPS/StartTLS with channel binding.

  5. ๐—™๐—ถ๐˜… ๐˜๐—ต๐—ฒ ๐—ฎ๐—ฐ๐—ฐ๐—ผ๐˜‚๐—ป๐˜ (๐—–) – replace static service accounts with gMSA/dMSA and least privilege.

  6. ๐—˜๐—ป๐—ณ๐—ผ๐—ฟ๐—ฐ๐—ฒ – set signing to Require and channel binding to Always via GPO, one at a time; for F5-fronted services use pass-through or bridging, never cleartext offload (see below).

  7. ๐—ฉ๐—ฒ๐—ฟ๐—ถ๐—ณ๐˜† – confirm 2889 events reach zero, validate each remediated client, then promote or upgrade to 2025 DCs with confidence.

all three concerns, closed in the right order

all three concerns, closed in the right order

๐—ข๐—ฟ๐—ฑ๐—ฒ๐—ฟ ๐—ผ๐—ณ ๐—ฝ๐—ฟ๐—ฒ๐—ณ๐—ฒ๐—ฟ๐—ฒ๐—ป๐—ฐ๐—ฒ, ๐—ถ๐—ป ๐—ผ๐—ป๐—ฒ ๐—น๐—ถ๐—ป๐—ฒ: SASL/Kerberos (B) inside LDAPS (A), on a gMSA/dMSA with least privilege (C). That is all three concerns covered on purpose. “We enabled LDAPS” is a good start on one of the three – not a finish line.

๐—ฃ๐˜‚๐—ฏ๐—น๐—ถ๐˜€๐—ต๐—ถ๐—ป๐—ด ๐˜€๐—ฒ๐—ฐ๐˜‚๐—ฟ๐—ฒ ๐—Ÿ๐——๐—”๐—ฃ ๐—ฏ๐—ฒ๐—ต๐—ถ๐—ป๐—ฑ ๐—ฎ๐—ป ๐—™๐Ÿฑ ๐—•๐—œ๐—š-๐—œ๐—ฃ

An F5 BIG-IP virtual server fronts a pool of DCs to give clients one resilient endpoint. It delivers Concern A at scale, but it does not change the bind type or the account – and done wrong it can quietly undo the transit protection. The only security-critical decision is what it does with TLS.

The F5 is a smart receptionist in front of several identical DCs. The question that matters is what it does with the sealed envelope:

  • Pass-through hands it on still sealed – safest, and it keeps channel binding intact. Preferred.

  • Bridging opens and immediately reseals it (re-encrypt) – still safe, use it only if you need layer-7 features.

  • Offload opens it and forwards the contents in the open – which recreates the original cleartext problem and must never be used for directory logins.

never offload - it recreates the cleartext problem

never offload – it recreates the cleartext problem

๐—›๐—ผ๐˜„ ๐˜๐—ผ ๐—ฐ๐—ผ๐—ป๐—ณ๐—ถ๐—ด๐˜‚๐—ฟ๐—ฒ, ๐—ฏ๐—ฟ๐—ถ๐—ฒ๐—ณ๐—น๐˜†:

  • Create a pool of the DCs with an LDAPS health monitor (a TLS check on 636, or a test-bind monitor).

  • Preferred: a TCP (layer-4) virtual server on 636 with no SSL profiles – pure pass-through – so client TLS and channel binding terminate on the DC.

  • If you need layer-7 features, use bridging: a client-SSL profile (VIP cert) and a server-SSL profile that trusts the DC CA.

  • Set persistence so a client’s multi-step session stays on one DC, and restrict the VIP to authorized client subnets.

  • Disable any plain-389 VIP.

๐—ง๐˜„๐—ผ ๐˜๐—ฟ๐—ฎ๐—ฑ๐—ฒ-๐—ผ๐—ณ๐—ณ๐˜€ ๐˜๐—ผ ๐—ฝ๐—น๐—ฎ๐—ป ๐—ณ๐—ผ๐—ฟ.

  • First, putting LDAPS behind a VIP costs you client source-IP visibility on the DC (Event ID 2889 will show the balancer, not the real client) so lean on application-side logging where that matters, and prefer pass-through.

  • Second, terminating TLS on the F5 changes the session the channel-binding token binds to; if you enforce channel binding to “Always,” prefer pass-through so the client TLS reaches the DC intact.

๐—ง๐—ต๐—ฒ ๐—ฐ๐—ผ๐—ป๐˜๐—ฟ๐—ผ๐—น๐—น๐—ฒ๐—ฑ ๐—ถ๐—ป๐˜๐—ฒ๐—ฟ๐—ถ๐—บ ๐—ฒ๐˜…๐—ฐ๐—ฒ๐—ฝ๐˜๐—ถ๐—ผ๐—ป – ๐˜๐—ฒ๐—บ๐—ฝ๐—ผ๐—ฟ๐—ฎ๐—ฟ๐—ถ๐—น๐˜† ๐—ฎ๐—น๐—น๐—ผ๐˜„๐—ถ๐—ป๐—ด ๐˜€๐—ถ๐—บ๐—ฝ๐—น๐—ฒ ๐—ฏ๐—ถ๐—ป๐—ฑ

Sometimes a legacy system genuinely cannot move before the deadline. There is a documented way to keep it working – as a last resort, not a permanent state. Every step here weakens a protection that 2025 turns on for good reason. Treat it as a time-boxed exception with an owner, a ticket, and a hard expiry date, scoped to the fewest possible DCs.

Think of the 2025 defaults as locks the building now ships locked. This is the documented way to prop one door open – on a couple of side entrances, with a guard watching, and a firm date to lock it again. A temporary, logged exception for one tenant who hasn’t replaced their old key – not turning off the alarm for the whole building.

a time-boxed exception with a hard expiry date

a time-boxed exception with a hard expiry date

๐—™๐—ถ๐—ฟ๐˜€๐˜, ๐—ฎ๐˜€๐—ธ ๐˜๐—ต๐—ฒ ๐—ต๐—ผ๐—ป๐—ฒ๐˜€๐˜ ๐—พ๐˜‚๐—ฒ๐˜€๐˜๐—ถ๐—ผ๐—ป. Even with signing required, a simple bind already works inside TLS. What 2025 blocks by default is the unsigned, cleartext simple bind on port 389. So: can the legacy client really not use LDAPS, StartTLS, or Kerberos? If there is any path to one of those, take it – each is far safer than what follows.

๐—ง๐—ต๐—ฒ ๐˜€๐—ฒ๐˜๐˜๐—ถ๐—ป๐—ด ๐—ฐ๐—ผ๐—บ๐—ฏ๐—ถ๐—ป๐—ฎ๐˜๐—ถ๐—ผ๐—ป (๐˜€๐—ฐ๐—ผ๐—ฝ๐—ฒ๐—ฑ ๐˜๐—ผ ๐—ฒ๐˜…๐—ฐ๐—ฒ๐—ฝ๐˜๐—ถ๐—ผ๐—ป ๐——๐—–๐˜€ ๐—ผ๐—ป๐—น๐˜†):

  • LDAP server signing requirements ENFORCEMENT โ†’ Disabled. Turns off the 2025 default that forces signing; overrides the classic policy.

  • LDAP server signing requirements (classic) โ†’ None. Writes LDAPServerIntegrity = 1 (negotiate, do not require). Should be None, not Require.

  • LDAP server channel binding token requirements โ†’ Never (or When supported). LdapEnforceChannelBinding = 0 or 1. Avoid Always for the window.

  • Network security: LDAP client signing requirements โ†’ Negotiate signing. Leave clients able to negotiate; do not set Require on affected clients.

Registry, scoped to exception DCs only:

– reg add “HKLM\SYSTEM\CurrentControlSet\Services\NTDS\Parameters” /v LDAPServerIntegrity /t REG_DWORD /d 1 /f (1 = None/negotiate; 2 = Require)

– reg add “HKLM\SYSTEM\CurrentControlSet\Services\NTDS\Parameters” /v LdapEnforceChannelBinding /t REG_DWORD /d 0 /f

(The 2025 ‘enforcement’ policy is set to Disabled via GPO, not a single reg value.)

๐—ฆ๐—ฐ๐—ผ๐—ฝ๐—ฒ ๐—ถ๐˜ ๐—ฝ๐—ฟ๐—ผ๐—ฝ๐—ฒ๐—ฟ๐—น๐˜† – ๐—ฑ๐—ผ ๐—ป๐—ผ๐˜ ๐—ฒ๐—ฑ๐—ถ๐˜ ๐˜๐—ต๐—ฒ ๐—ฑ๐—ฒ๐—ณ๐—ฎ๐˜‚๐—น๐˜ ๐—ฝ๐—ผ๐—น๐—ถ๐—ฐ๐˜†. All DCs sit in the Domain Controllers OU, and the Default Domain Controllers Policy hits every one; editing it would re-expose the entire domain. Instead, create a dedicated, security-filtered GPO:

  • Create a new GPO (e.g. LDAP-Simple-Bind-Exception-TEMP) and link it to the Domain Controllers OU.

  • Raise its link order above the Default Domain Controllers Policy (lower number wins).

  • Add a security group (e.g. GRP-DC-LDAP-Exception) containing only the exception DCs’ computer accounts. On the GPO Scope tab, remove Authenticated Users from Apply and add this group with Read + Apply – so it lands only on those DCs.

  • Optionally add a WMI filter on host name as a second guard.

  • Record the DC list, the requesting system, the owner, the ticket, and a hard expiry date in the GPO description.

  • Run gpupdate /force on the targets and verify; no reboot needed for these settings.

๐—ง๐—ต๐—ฒ๐—ป ๐—ฒ๐˜…๐—ฝ๐—ถ๐—ฟ๐—ฒ ๐—ถ๐˜. Pin the legacy client to those DC names or IPs, keep LDAP Interface Events at level 2 on the exception DCs, and watch Event ID 2889 to track exactly which client and account still bind in cleartext. Drive that to zero, remove the exception GPO, restore the 2025 defaults, and close the ticket. The exit criterion is simple: the legacy client moves to LDAPS, StartTLS, or Kerberos and its 2889 events read zero. Do not let the exception outlive its expiry date.

๐—ช๐—ต๐—ฒ๐—ฟ๐—ฒ ๐˜๐—ต๐—ฒ ๐˜€๐—ฒ๐—ฟ๐—ถ๐—ฒ๐˜€ ๐—น๐—ฒ๐—ฎ๐˜ƒ๐—ฒ๐˜€ ๐˜†๐—ผ๐˜‚

Three jobs, done on purpose: a SASL/Kerberos bind, inside an LDAPS tunnel on strong TLS, on a gMSA or dMSA with least privilege – discovered through the 2887/2889 audit, rolled out one setting at a time, with any exception scoped and time-boxed. That is what “secured LDAP” actually means. Not a switch you flip, but three gaps you close deliberately, knowing which is which.

not a switch you flip - three gaps closed on purpose

not a switch you flip – three gaps closed on purpose

๐—ง๐—ต๐—ถ๐˜€ ๐—ถ๐˜€ ๐—ฃ๐—ฎ๐—ฟ๐˜ ๐Ÿฒ ๐—ผ๐—ณ ๐Ÿฒ – ๐˜๐—ต๐—ฒ ๐—ณ๐—ถ๐—ป๐—ฎ๐—น๐—ฒ ๐—ผ๐—ณ ๐˜๐—ต๐—ฒ ๐˜€๐—ฒ๐—ฟ๐—ถ๐—ฒ๐˜€.

Previously – Part 5: When Did That Service Account Last Rotate?

New to the series? Start at Part 1: Did You Really Secure LDAP – or Just One-Third of It? The three-jobs framing everything builds on.

Full series:

Which of the three jobs had your environment quietly skipped? For most teams it’s B or C.

That’s the series. If it moved you from “hoping” to “knowing” on even one of the three gaps, repost the whole series for your team โ€” and start with the discovery audit, not a setting. Follow if you want more like this; new readers can start at Part 1.

If you read all six – thank you, genuinely. Tell me in the comments which of the three jobs your environment had quietly skipped (for most teams it’s B or C), and repost the series for someone who’s still on “we turned on LDAPS.”

A Complete LDAP Security Migration Plan supporting illustration

๐—ฅ๐—ฒ๐—ณ๐—ฒ๐—ฟ๐—ฒ๐—ป๐—ฐ๐—ฒ๐˜€:

๐—š๐—น๐—ผ๐˜€๐˜€๐—ฎ๐—ฟ๐˜†

  • F5 BIG-IP: a load balancer that fronts a pool of domain controllers to give clients one resilient endpoint.

  • VIP: virtual server / virtual IP; the single endpoint on the load balancer that clients connect to.

  • Pass-through: F5 mode that forwards traffic still encrypted to the DC (preferred; keeps channel binding intact).

  • Bridging: F5 mode that decrypts and immediately re-encrypts (safe; used for layer-7 features).

  • Offload: F5 mode that decrypts and forwards in cleartext; never use for directory logins.

  • GPO: Group Policy Object; the mechanism Windows uses to apply settings consistently across a domain.

  • OU: Organizational Unit; a container in Active Directory used to group objects so policy can be targeted at them.

  • Default Domain Controllers Policy: the built-in GPO that applies to every DC in the domain by default.

  • WMI filter: a Group Policy condition that restricts which machines a GPO applies to, based on system attributes.

  • Event ID 2889: the Directory Service log event that names the client and account behind each unsigned or cleartext bind.

  • Channel binding: the control that ties a login to its exact TLS session; affected by where TLS terminates on the F5.

  • LDAPS / StartTLS / Kerberos: the secure paths a legacy client should move to before any exception expires.

#ActiveDirectory #LDAP #WindowsServer2025 #IdentitySecurity #CyberSecurity

Similar Posts

Leave a Reply

Your email address will not be published. Required fields are marked *