Who is allowed to log in where? The KDC-side answer to credential theft in Active Directory
A 28-year arc from Paul Ashton's pass-the-hash demonstration to the 2026 reference deployment of Tiering, Protected Users, and Authentication Policy Silos.
Permalink1. Two accounts, one TGT, every domain controller
On a Tuesday morning in April 1997, an independent researcher named Paul Ashton posted to the NTBugtraq mailing list. His patched Samba smbclient did not accept a password. It accepted the hash, and the file server gave it everything [1]. The directory had no answer for the next sixteen years.
Skip forward to today. A domain admin's laptop is compromised by a phishing payload. The attacker runs Mimikatz against lsass.exe, recovers a Kerberos ticket-granting ticket for the admin account, and from that TGT every domain controller in the forest is reachable. The detection engineer who pulls the incident report knows exactly what happened. The architect on the other side of the table knows the answer was never going to come from the workstation, from the smartcard, or from the RDP client. It had to come from the directory.
This is what every credential-theft chain reduces to: a question about which accounts the directory will authenticate, from which machines, with which credential materials, for how long, and to whom they may delegate. Until October 2013, Active Directory had no place to answer that question. It had access-control lists, group memberships, and an AdminSDHolder template that re-stamped privileges every hour [2]. None of those mechanisms could refuse to issue a stolen credential, because on the wire a stolen credential is identical to a legitimate one.
Windows Server 2012 R2 changed that on October 18, 2013 [3]. In a single release, the directory acquired three controls that compose into one operational answer. The tier model names which accounts and machines belong to which control plane: T0 holds the domain controllers and the systems that manage them, T1 holds servers and business data, T2 holds workstations [4]. The Protected Users security group (well-known RID 525) imposes a non-configurable credential-restriction set: no NTLM, no DES or RC4 in Kerberos, no delegation, no cached offline-sign-in verifier, and a four-hour non-renewable TGT cap [5]. Authentication Policies and Authentication Policy Silos are directory objects that tell the Key Distribution Center (KDC) which source machines may authenticate which accounts, at AS-REQ time, before any TGT exists to be stolen [6].
If you arrived here from the earlier posts in this series: this is the operational counterpart to the NTLM relay story, to the Kerberoasting story, and to the Credential Guard story. Silos are how the KDC says no; Credential Guard is how the host says no; Conditional Access is how the cloud says no. The three planes are independent and they compose.The on-prem AD KDC, keyed on directory state read at issuance time, is the operational answer to credential-theft attack chains. The directory decides which accounts may authenticate, from which machines, with which credential materials, for how long, and to whom they may delegate. The three controls -- tier model, Protected Users, Authentication Policy Silos -- compose into that decision.
The rest of this article pays off the question Ashton's 1997 post raises. Why did the directory have no answer for sixteen years? What changed in October 2013 that the pre-2013 controls could not deliver? What does a working 2026 deployment look like, and what does it still leave open?
2. Why the directory had no answer for a decade
Ashton's 1997 demonstration was not subtle. The NT hash is, on the wire, the credential. Windows NT 4's challenge-response authentication used the LanMan or NT one-way function output as the long-term key; anyone who could read that value from the SAM, from a network capture, or from lsadump could authenticate as the principal without ever knowing the password [1]. Wikipedia's secondary anchor attributes the first public demonstration to Ashton and dates it to 1997 [7]; the Exploit-DB mirror of the original patch preserves file modification timestamps that narrow the day to Tuesday, April 8, 1997 [1].
A credential-theft technique that uses an account's NT one-way function output (the NT hash) to authenticate, instead of the plaintext password. Because the Windows NTLM protocol uses the hash itself as the long-term key, an attacker who reads the hash from memory or from disk can authenticate as the account without ever cracking the password.
For more than a decade after Ashton's post, Microsoft's institutional position was that this was a protocol legacy, not a vulnerability. The reasoning was internally consistent: the hash IS the long-term key in the protocol's design; refusing to honour it would break every existing Windows client. The 2008 Pass-the-Hash Toolkit, written by Hernan Ochoa [7], turned the academic demonstration into a single-binary Windows-native tool that read NT hashes from lsass.exe and injected them into a running logon session [7]. Microsoft's Privileged access strategy page now records the 2008 release of the Pass-the-Hash Toolkit as the proximate cause of the escalation in attacker tooling [8].
The escalation that finally broke the institutional posture was Benjamin Delpy's Mimikatz, released publicly in May 2011 (closed source) on his personal blog [10]. Wired's biographical piece records the date verbatim: "He released it publicly in May 2011, but as a closed source program" [9]. The GitHub repository at github.com/gentilkiwi/mimikatz opened in April 2014; the sekurlsa::logonpasswords command on a SYSTEM-level shell printed plaintext passwords, NT hashes, and Kerberos session keys directly from lsass.exe [11]. Within twenty-four months it was the default post-exploitation credential dumper in every public AD attack-and-defence talk [12][9].
Microsoft's first institutional acknowledgement arrived in December 2012 as Mitigating Pass-the-Hash, Version 1. The canonical Microsoft Download Center URL for that version has not survived the company's reorganisations and now returns HTTP 404; the document is preserved through references inside its successor, the 2014 Version 2 paper, which is still hosted [13]. Version 2 introduces tiered administrative segmentation as a deployment shape and is unambiguous about why the previous decade of mitigations had not worked.
"Pass-the-Hash and similar credential theft attacks are 100% successful when an attacker gains administrative privileges on a computer, because once a computer is compromised, the attacker can read any credential stored on that computer." -- Microsoft, Mitigating Pass-the-Hash, Version 2 (2014) [13]
That sentence is the institutional pivot. It moves the framing from "protocol feature, defend the host" to "credentials, once stolen, win." The defence cannot live in the host, because the host is where the attacker has already won. It also cannot live in the ACL, because the ACL evaluates the principal that is authenticating, and the stolen credential authenticates as the legitimate principal. If access-control lists cannot stop a stolen credential, what can?
3. Five generations of pre-2013 controls and why each one failed
Between 1997 and 2013, operators tried five distinct families of controls. Each targeted a different part of the stack. Each failed in the same structural way.
The first family was operational discipline: give every administrator two accounts, alice for daily work and alice.da for domain-administrative work, and trust her not to use the privileged identity from her daily workstation. NT 4 (RTM July 31, 1996) shipped with this as the operating model [14]. As a control it is a procedure, not an enforcement: there is no directory mechanism that prevents alice.da from interactively logging on to a tier-2 workstation. The Microsoft 2014 paper named the failure mode plainly: once alice.da runs anywhere an attacker also runs, the credential material sits in that machine's LSASS and is replayable forest-wide [13].
The second family was directory-ACL hardening. AdminSDHolder is an object under CN=System in the directory that stores a template security descriptor. A background task called SDProp runs every 60 minutes on the PDC emulator and re-stamps that ACL onto every account with adminCount=1 -- Domain Admins, Enterprise Admins, Schema Admins, and the rest of the protected groups [2]. The intent is to prevent ACL drift: a helpdesk operator's misconfigured permission cannot weaken Domain Admin protections for more than an hour. The mechanism survives in modern AD, but its original threat-model framing as a pass-the-hash mitigation is dead. ACLs evaluate the principal; a stolen credential authenticates as the legitimate principal. Worse, Sean Metcalf's Sneaky Active Directory Persistence #15 documents the inverse abuse: AdminSDHolder is not protected by AdminSDHolder, so an attacker who writes a Full-Control ACE into it once gets that ACE propagated across every protected member within sixty minutes [2].
CN=AdminSDHolder,CN=System,DC=... stores a template security descriptor. The SDProp (Security Descriptor propagator) task runs every 60 minutes on the PDC emulator and copies that ACL onto every member of the protected groups -- objects with adminCount=1. The mechanism prevents ACL drift on privileged accounts but does not stop credential theft.
The third family was smartcard-required admin accounts. Setting the SMARTCARD_REQUIRED flag (UAC bit 0x40000) on a privileged account causes the KDC to refuse any AS-REQ that is not a PKINIT request -- the user must present a certificate chain rooted in the domain, with the matching private key on a smartcard [15]. The phishing-credential-into-fake-portal vector is closed: the operator does not know a password to type. But the PKINIT exchange produces a derived long-term key that lives on the workstation as a normal NT hash. The 2014 Mitigating Pass-the-Hash paper is unambiguous in §6: "Smart cards do not protect against the Pass-the-Hash credential theft attack vector. When a smart card is used to log in to a system, the system computes a derived NT hash of the password and stores it on the system" [13]. Mimikatz extracts the derived hash like any other.
The Public Key Cryptography for Initial Authentication in Kerberos extension, specified in RFC 4556. PKINIT lets a client present a certificate (typically held on a smartcard or a TPM) in its AS-REQ instead of a password-derived pre-authentication blob. The KDC validates the certificate against an account binding and issues a TGT. The resulting long-term key still lives in the host's LSASS process.
The fourth family was host-side credential protection: LSA Protection (RunAsPPL), WDigest plaintext disablement, and the TokenLeakDetectDelaySecs registry setting. LSA Protection runs lsass.exe as a Protected Process Light, refusing handles with PROCESS_VM_READ to anything not signed at PPL level [16]. WDigest plaintext disablement (via UseLogonCredential=0, shipped in KB 2871997 in May 2014) stops the WDigest SSP from caching the user's plaintext password [17]. Both moved the bar; neither closed the attack. PPL is enforced by the kernel; on pre-VBS Windows an attacker with a signed kernel driver clears the protection bit, and Mimikatz ships mimidrv.sys for exactly this purpose [11] (on modern hardware-rooted HVCI/VBS, the VTL1 secure kernel closes the signed-driver bypass, but the discussion then moves to where the §6 Credential Guard primitive lives [18]). WDigest disablement removes plaintext from memory but does nothing to the NT hash or to Kerberos session keys, which are the actually-replayable material.
The fifth family was Restricted Admin Mode for RDP, shipped via the October 14, 2014 revision of KB 2871997 [17]. The intent was to interrupt lateral movement: mstsc /restrictedadmin causes the RDP client to send a CredSSP-wrapped network logon to the target. The target creates a network-logon token instead of an interactive one, and the user's NT hash or Kerberos session keys never land on the target [19][20]. Within months, Benjamin Delpy demonstrated the inverse: because the RDP client authenticates with the user's existing credential material, an attacker on the client can pass a stolen NT hash directly into the RDP session with sekurlsa::pth /user:alice.da /domain:CORP /ntlm:<hash> /run:"mstsc /restrictedadmin" [11]. The defence became the lateral move. Microsoft updated KB 2871997 to acknowledge this, and Restricted Admin is off by default client-side on modern Windows [17].
Diagram source
flowchart TD
Op["Operator discipline (two-account pattern, 1990s)"] --> Op_x["Procedure, not enforcement: one mistake compromises the forest"]
ACL["AdminSDHolder + SDProp (NT 4 / 2000)"] --> ACL_x["ACLs evaluate the principal, and a stolen credential authenticates as the legitimate principal"]
SC["Smartcard-required (Server 2003+)"] --> SC_x["PKINIT changes only the AS-REQ method, and the derived NT hash still lives in LSASS"]
HS["LSA Protection / WDigest off (2013-14)"] --> HS_x["PPL bypassable by a signed kernel driver, with NT hash and Kerberos keys still in memory"]
RA["Restricted Admin Mode for RDP (Oct 2014)"] --> RA_x["Inverse-of-intent: enables pass-the-hash via RDP from the compromised client"]
Op_x --> Sink["All five enforce in a layer that does not see the directory's authoritative view of who-may-issue-credentials-from-where"]
ACL_x --> Sink
SC_x --> Sink
HS_x --> Sink
RA_x --> Sink If the operator cannot be trusted, the ACL cannot enforce, the smartcard-derived hash still lives in LSASS, the host-side protections can be bypassed by anyone with privilege to deploy them, and the RDP mode meant to interrupt lateral movement enables it -- where does the decision have to move?
4. October 18, 2013: the directory acquires a vocabulary
The Microsoft Server team's August 14, 2013 save-the-date blog post fixed the General Availability of Windows Server 2012 R2 for October 18, 2013 [3]. In that single release, three new directory-side primitives appeared: the Protected Users built-in security group with well-known RID 525, the msDS-AuthNPolicy AD object class for Authentication Policies, and the msDS-AuthNPolicySilo AD object class for Authentication Policy Silos [21]. The legacy Windows Server 2012 R2 TechNet documentation, preserved on Microsoft Learn, states the introduction verbatim: "This group was introduced in Windows Server 2012 R2" [21]. The architectural decision visible in the wire format: the KDC, not the application, now decides whether a TGT may be issued, what its lifetime will be, and what delegation operations on it will succeed.
The Kerberos authentication service, specified in RFC 4120. The KDC handles AS-REQ (issuing a Ticket-Granting Ticket from a long-term key) and TGS-REQ (issuing a service ticket from a TGT). On Windows domains, every domain controller runs a KDC; the KDC reads its policy state from the directory at request time, which is the property the Server 2012 R2 controls exploit [22].
A Microsoft authorisation-data overlay carried inside Kerberos TGTs and service tickets, specified in [MS-PAC]. The PAC's PAC_LOGON_INFO buffer contains the user's SID, primary-group SID, and a GroupIds array of well-known group memberships. Protected Users membership is encoded as RID 525 inside that array. There is no separate Protected Users flag bit [23].
The detail that matters: there is no dedicated "Protected Users bit" in the PAC. The encoding is the well-known group SID S-1-5-21-<domain>-525 carried in PAC_LOGON_INFO.GroupIds ([MS-PAC] §2.5) [23][21]. The KDC reads that array at AS-REQ and TGS-REQ time the same way it reads it for every other group; what changes is the behaviour the KDC takes when it sees RID 525.
The down-level half of the shipment arrived seven months later. On May 13, 2014, Microsoft Security Advisory KB 2871997 backported the client-side honoring of Protected Users and Authentication Policies to Windows 7, Windows 8, Server 2008 R2, and Server 2012 [17]. KB 2871997 is not the introduction of Protected Users. It is the down-level backport that closed the long-tail Silo-bypass class an enterprise would hit if its 2014-era fleet could not honour the new restriction list. Five months later, the October 14, 2014 revision of the same KB shipped Restricted Admin Mode for RDP -- the mode §3 already taught the reader to treat as a cautionary tale.
The version-mismatch story matters for the operator who finds a 2014 KB cited as the "introduction" of Protected Users in older blog posts. It is not. The introduction is Server 2012 R2 GA on October 18, 2013; the backport is KB 2871997 on May 13, 2014. The legacy Microsoft Learn page records the introduction date plainly [21].Microsoft followed the primitive with a deployment shape. The Securing Privileged Access reference material, originally published on TechNet circa 2014-2015 and preserved on Microsoft Learn at the privileged-access-workstations root [24], codified the clean-source principle: a higher-tier secret must never be exposed to a lower-tier host. T0 holds domain controllers, the PKI root, the identity-sync infrastructure, and the DC backup system. T1 holds servers and business data. T2 holds workstations [4]. T0 credentials never authenticate to T1 or T2; T1 credentials never authenticate to T2. The Privileged Access Workstation (PAW) is the dedicated source machine for T0 administration. Server 2012 R2 gave operators the primitives; SPA gave them the shape.
Diagram source
flowchart LR
A["Apr 8, 1997: Paul Ashton, NTBugtraq -- hash IS the credential"] --> B["2008: Hernan Ochoa, Pass-the-Hash Toolkit"]
B --> C["May 2011: Benjamin Delpy, Mimikatz public release"]
C --> D["Dec 2012: Microsoft, Mitigating Pass-the-Hash v1"]
D --> E["Oct 18, 2013: Windows Server 2012 R2 GA -- Protected Users, Authentication Policies, Silos"]
E --> F["May 13, 2014: KB 2871997 down-level backport"]
F --> G["Oct 14, 2014: KB 2871997 adds Restricted Admin RDP"]
G --> H["2014-2015: Securing Privileged Access reference material"]
H --> I["Dec 15, 2020: ESAE retired, Enterprise Access Model begins"]
I --> J["Nov 9, 2021: KB 5008380 PAC hardening"]
J --> K["May 10, 2022: KB 5014754 PKINIT strong mapping"]
K --> L["Feb 11, 2025: KB 5014754 Full Enforcement default"]
L --> M["Sep 9, 2025: KB 5014754 Compatibility-mode revert removed"] The KDC, not the application, decides whether a TGT may be issued, what its lifetime is, and what delegation operations on it will succeed. The decision is made by reading directory state -- group SID 525 in
PAC_LOGON_INFO.GroupIdsfor Protected Users,msDS-AssignedAuthNPolicySiloandmsDS-AssignedAuthNPolicyfor Silo and Policy bindings -- at request time. This is the architectural pivot. The credential-on-the-wire identity property no longer matters, because the credential never gets issued in the first place to be stolen.
Three controls, one ship. But how do they compose, exactly -- which decision does the KDC actually make at AS-REQ time, what does it read from the directory, and what does it refuse?
5. How the three controls compose: a mechanism walkthrough
If you have time to read only one section of this article, read this one. The Server 2012 R2 controls compose into a precise decision the KDC makes at AS-REQ and TGS-REQ time. The mechanism has four moving parts.
5.1 The tier model as policy intent
The tier model is policy intent, not enforcement. Tier 0 is the control plane: every domain controller, every certificate authority that issues domain-trust certificates, the Microsoft Entra Connect server that synchronises identity to the cloud, and the backup systems that can restore any of those. Tier 1 is the management and data plane: servers, business applications, and the database engines that hold the data the organisation actually cares about. Tier 2 is the user plane: workstations and the devices users carry [4]. The rule that defines the model is the clean-source principle: a higher-tier credential must never authenticate to a lower-tier host, because once it lands in the lower-tier host's memory it is exfiltrable by anyone with privilege on that host [8]. The tier model says nothing about how the rule is enforced. Protected Users and Authentication Policy Silos are how.
5.2 Protected Users: the credential-restriction switch
Protected Users is a global security group with well-known RID 525, present in every domain at Domain Functional Level 2012 R2 or later. Membership is encoded as the well-known SID S-1-5-21-<domain>-525 carried in the GroupIds array of the user's PAC_LOGON_INFO ([MS-PAC] §2.5) [23][5]. When the KDC reads RID 525 in that array, it applies a non-configurable restriction set documented on Microsoft Learn [5]:
- No NTLM authentication. The DC refuses any NTLM authentication attempt for a Protected Users member -- the NTLM SSP and NetLogon path on the DC enforce the rejection, and the Kerberos KDC enforces the corresponding refusal for AS-REQ flows that fall back to NTLM-style pre-authentication. NTLM relay against the account is structurally impossible because there is no NTLM session to relay.
- No NTLM hash caching on the host. Even if the user has logged on interactively, the LSA never holds the account's NT one-way function output. Mimikatz
sekurlsa::logonpasswordsprints(null)for the NTLM tab. - No DES or RC4 in Kerberos pre-authentication. AES-128 or AES-256 only. Kerberoasting against the account becomes inapplicable, because the public roasting tooling requires RC4-HMAC ticket material that the KDC refuses to issue.
- No constrained or unconstrained delegation, in either direction. The account cannot be the source of a constrained-delegation chain, and S4U2Self / S4U2Proxy against the account as a target is refused at TGS-REQ time.
- No cached offline-sign-in verifier. The Windows Hello for Business PIN-based offline-logon path is unavailable for Protected Users members; this is the operational price of removing the cached verifier from disk.
- TGT lifetime capped at 240 minutes, non-renewable. Microsoft Learn states the figure verbatim: "For Protected Users members, the group automatically sets these lifetime limits to 240 minutes" [5]. The cap overrides the domain's "Maximum lifetime for user ticket" and "Maximum lifetime for user ticket renewal" policies.
The built-in domain Administrator (RID 500) is always exempt from Authentication Policy enforcement even when assigned to a Silo, which makes it a candidate break-glass identity [5]. That exemption does not extend to the Protected Users restriction set itself: adding RID 500 to Protected Users on a domain whose Administrator account lacks AES keys will lock the account out. Service accounts cannot be enrolled in Protected Users without breaking workflows -- see §6's canonical Microsoft Learn PullQuote on this point.
5.3 Authentication Policies and Silos: the KDC-side policy objects
Two AD object classes, layered. The containment direction is the most common practitioner confusion, so be precise about it: the Silo references the Policy, not the other way.
The container object. A Silo enumerates the user, computer, and service accounts that share a set of restrictions and references one or more msDS-AuthNPolicy objects whose rules apply to its members. The Silo carries an msDS-AuthNPolicySiloEnforced Boolean that switches between audit-only and enforced modes. Accounts bind to it via msDS-AssignedAuthNPolicySilo, with msDS-AuthNPolicySiloMembers as the back-link [6].
The rules object. A Policy carries the non-renewable TGT lifetime cap, the allowed-from SDDLs on source-machine identity (UserAllowedToAuthenticateFrom, ServiceAllowedToAuthenticateFrom -- computer accounts have no -From variant, only -To), the corresponding allowed-to SDDLs for delegation targets (UserAllowedToAuthenticateTo, ServiceAllowedToAuthenticateTo, ComputerAllowedToAuthenticateTo), claim-based authentication access-control conditions, and the option to require Kerberos armoring per RFC 6113 [6][25].
The same Policy can be referenced by multiple Silos. Accounts can be bound to a Policy directly via msDS-AssignedAuthNPolicy without being placed in a Silo at all, though the more common pattern is Silo membership for the broader containment and Policy reuse for the rule definitions.
msDS-UserAuthNPolicy, msDS-ComputerAuthNPolicy, and msDS-ServiceAuthNPolicy, each pointing outward to a Policy object [6]. Older blog posts that describe "the Policy attached to the Silo" are using imprecise prose; the link in the schema is Silo to Policy, not the other way.
5.4 The KDC's decision points
The KDC consults the directory at three precise moments, documented in [MS-KILE] §3.3.5 [27]:
- AS-REQ. The KDC reads the requester's
msDS-AssignedAuthNPolicySiloand anymsDS-AssignedAuthNPolicy. If the Policy specifies aUserAllowedToAuthenticateFromSDDL, the KDC evaluates the source-machine identity (as presented in the pre-authentication exchange) against the SDDL. On denial, the KDC returnsKDC_ERR_POLICYand no TGT is issued. The KDC also checksPAC_LOGON_INFO.GroupIdsfor RID 525; if present, it applies the Protected Users restriction set to the TGT it is about to issue (AES-only, 240-minute cap, delegation forbidden). - TGS-REQ for S4U2Self. The KDC reads the target account's group memberships and Silo bindings. If the target is a Protected Users member, S4U2Self is refused. If the target's Silo Policy specifies an allowed-to SDDL, the requesting service identity is evaluated against it [28].
- TGS-REQ for S4U2Proxy. The KDC evaluates the requesting service's
msDS-AllowedToDelegateToand the target'smsDS-AllowedToActOnBehalfOfOtherIdentity, then layers the Silo Policy's claim requirements on top. Protected Users membership on either side terminates the request [28].
Diagram source
sequenceDiagram
participant PAW as PAW (source machine)
participant KDC as KDC on DC
participant DS as Directory (LDAP DSA)
PAW->>KDC: AS-REQ for alice.da, pre-auth signed
KDC->>DS: Read alice.da object (PAC_LOGON_INFO, msDS-AssignedAuthNPolicySilo)
DS-->>KDC: GroupIds includes RID 525, Silo = "T0 Admins"
KDC->>DS: Read referenced Policy (msDS-AuthNPolicy)
DS-->>KDC: UserAllowedToAuthenticateFrom SDDL pinned to T0 PAWs
KDC->>KDC: Evaluate source machine identity against SDDL
alt Source is in the allowed-from set
KDC->>KDC: Apply Protected Users restriction set (AES-only, no NTLM, no delegation)
KDC->>KDC: Cap TGT lifetime at 240 minutes non-renewable
KDC-->>PAW: TGT issued with restriction PAC
else Source not in the allowed-from set
KDC-->>PAW: KDC_ERR_POLICY, no TGT issued
end Diagram source
flowchart LR
A["User account alice.da (msDS-AssignedAuthNPolicySilo)"] --> S["Silo: T0 Admins (msDS-AuthNPolicySilo)"]
C["Computer account paw01 (msDS-AssignedAuthNPolicySilo)"] --> S
SV["Service account svc-bkp (msDS-AssignedAuthNPolicySilo)"] --> S
S -- "references" --> P["Policy: T0 Source Restriction (msDS-AuthNPolicy)"]
P --> Rule1["UserAllowedToAuthenticateFrom SDDL"]
P --> Rule2["TGT lifetime cap"]
P --> Rule3["Claim transformations"]
P --> Rule4["FAST armoring requirement"]
S -. "alt direct binding" .-> A2["Account can also bind via msDS-AssignedAuthNPolicy"] The RunnableCode block below simulates the decision tree as a small JS function. It is pedagogical, not a real KDC, but the logic mirrors what [MS-KILE] specifies. Change the inputs -- move the source machine outside the allowed-from set, flip the Protected Users flag -- and the decision changes.
function kdcDecideAsReq(account, sourceMachine) {
// account: { name, inProtectedUsers, siloPolicy: { allowedFrom: [], tgtMinutes, requireFast } }
// sourceMachine: { name }
if (account.siloPolicy && account.siloPolicy.allowedFrom &&
!account.siloPolicy.allowedFrom.includes(sourceMachine.name)) {
return { issued: false, error: "KDC_ERR_POLICY", reason: "source not in allowed-from set" };
}
const restrictions = [];
let tgtMinutes = account.siloPolicy ? account.siloPolicy.tgtMinutes : 600;
let renewable = true;
if (account.inProtectedUsers) {
restrictions.push("no-NTLM", "AES-only", "no-delegation", "no-cached-verifier");
tgtMinutes = Math.min(tgtMinutes, 240);
renewable = false;
}
return {
issued: true,
tgtMinutes,
renewable,
restrictions,
sourceMachine: sourceMachine.name
};
}
const alice = {
name: "alice.da",
inProtectedUsers: true,
siloPolicy: { allowedFrom: ["paw-t0-01", "paw-t0-02"], tgtMinutes: 480, requireFast: true }
};
console.log("From PAW:", kdcDecideAsReq(alice, { name: "paw-t0-01" }));
console.log("From workstation:", kdcDecideAsReq(alice, { name: "wks-finance-77" })); Press Run to execute.
The KDC now has a vocabulary it did not have in 1997. Well-known group SID 525 as a credential-restriction switch. msDS-AuthNPolicySilo and msDS-AuthNPolicy as policy objects. drsuapi as the replication primitive that carries policy changes to every DC. The decision is keyed on directory state, made at request time, before any TGT exists to be stolen. With the mechanism in hand, what does a current 2026 reference deployment look like?
6. The 2026 reference deployment
Microsoft has had thirteen years to settle the deployment shape. As of May 2026, a well-built environment looks like the layered stack below, in which Silos and Protected Users carry the on-prem enforcement and several complementary primitives close residuals the KDC plane cannot address by construction.
The control plane of an Active Directory environment. T0 contains the domain controllers and every system whose compromise grants forest-wide control: the AD CS certificate authorities, the Microsoft Entra Connect server, the privileged-access workstations used to manage them, and the backup systems that can restore any of those. The SpecterOps Tier Zero Table is the community-maintained canonical asset list and is the practical starting point for any T0 inventory [29][30].
The reference deployment composes:
- Tier model present as policy intent, with Authentication Policy Silos as the enforcement primitive that makes the tier boundary KDC-visible.
- All human T0 administrators in Protected Users, in a "T0 Admins" Silo whose Policy's
UserAllowedToAuthenticateFromSDDL pins authentication to a defined set of T0 PAWs. The KDC will returnKDC_ERR_POLICYfor any AS-REQ from outside that set [6][27]. - T0 service accounts in a "T0 Services" Silo with a more permissive Policy that still pins source machines. Service accounts cannot be in Protected Users; the Silo plane is the only KDC-side enforcement available to them [5].
- Domain-wide migration off RC4-HMAC for AS-REP, with
msDS-SupportedEncryptionTypesaudited per account. Protected Users enforces AES-only for free for human members; service accounts need explicit per-account configuration [31]. - Credential Guard default-on for non-DC Windows 11 22H2+ and Windows Server 2025+ devices that meet the hardware requirements [18]. Windows LAPS managing local-administrator password uniqueness on every workstation [32].
- Entra PIM for Entra ID privileged roles [33], with Conditional Access keyed on the synced T0 Admins group requiring phishing-resistant MFA and a compliant device. The CA does not see the Silo; it sees the synced group. The two planes are independent (see §8).
- Microsoft Defender for Identity assessments running, including "Identify privileged accounts that are not protected by Protected Users group" and adjacent recommendations [34]. This is the detection plane that tells the operator the reference deployment is the deployed posture.
msDS-SupportedEncryptionTypes to 0x18 (AES128 0x08 + AES256 0x10). To additionally signal Compound-Identity-Supported, use 0x20018 (0x18 | 0x20000) -- Compound-Identity-Supported is the G bit at position 17 of the [MS-KILE] §2.2.7 Supported Encryption Types Bit Flags diagram, value 0x20000, not 0x40. The full bit layout per [MS-KILE] §2.2.7 is: DES-CBC-CRC 0x01, DES-CBC-MD5 0x02, RC4-HMAC 0x04, AES128-CTS-HMAC-SHA1-96 0x08, AES256-CTS-HMAC-SHA1-96 0x10, FAST-Supported 0x10000, Compound-Identity-Supported 0x20000, Claims-Supported 0x40000, Resource-SID-Compression-Disabled 0x80000; 0x40 is bit 6 (AES128-CTS-HMAC-SHA256-128, an RFC 8009 enctype [35] older KDCs do not fully support and which is not Compound-Identity-Supported). The value 0x18 explicitly excludes RC4 (0x04) and the two DES flavours (0x01, 0x02). Note that 0x1C is not AES-only -- it is 0x10 | 0x08 | 0x04, which re-introduces RC4 on the very account you are trying to harden. Group Managed Service Accounts (gMSA) are the preferred new-service-account primitive: the Microsoft Key Distribution Service computes a long, automatically-rotated password keyed on a domain-wide root key, and the Microsoft Learn gMSA overview describes the mechanism in detail -- the resulting AES pre-auth tickets are not roastable in practical timeframes [36]. Microsoft's How to Configure Protected Accounts page lays out the per-account migration steps for non-gMSA legacy services [31].
"Never add accounts for services and computers to the Protected Users group. For those accounts, membership doesn't provide local protections because the password and certificate is always available on the host." -- Microsoft Learn, Protected Users Security Group [5]
That quote is the operational reason the RBCD residual remains the punchline of §8. Before then, two further pieces of the reference deployment need to be named, because both have been mis-described in widely shared blog posts.
The first is the November 2021 PAC hardening in KB 5008380, which addressed CVE-2021-42287 and CVE-2021-42278 ("noPAC"). The fix added two new PAC buffer types to the Kerberos TGT: PAC_REQUESTOR (buffer type 18), which encodes the SID of the principal that requested the ticket, and PAC_ATTRIBUTES_INFO (buffer type 17), which carries PAC-generation attributes [37][23]. The KDC at TGS-REQ time now verifies that the requestor SID in the PAC matches the principal currently presenting the TGT. Initial deployment was November 9, 2021; the Enforcement phase landed October 11, 2022 [37].
The second is the May 2022 PKINIT certificate-to-account strong-mapping fix in KB 5014754 [38]. Pre-fix, the KDC mapped a PKINIT certificate to an account by sAMAccountName or UPN -- the same comparison that Schroeder and Christensen's Certified Pre-Owned whitepaper showed could be spoofed via UPN conflicts or via the trailing dollar-sign convention on machine accounts [39][40]. The fix added the SecurityIdentifier X.509 extension OID 1.3.6.1.4.1.311.25.2 to certificates issued by AD CS and requires the KDC to match the SID in the certificate against the SID of the account being authenticated. The Full Enforcement default landed February 11, 2025; the Compatibility-mode revert option was removed on September 9, 2025 [38].
Reference 2026 deployment: what runs where.
| Account class | Protected Users? | Silo membership | Allowed-from SDDL anchor | TGT cap | Host-side | Cloud-side |
|---|---|---|---|---|---|---|
| Human T0 admin | Yes | T0 Admins | T0 PAWs only | 240 min, non-renewable | Credential Guard on the PAW; LAPS irrelevant (PAW is unique) | Entra PIM + CA on synced group, phishing-resistant MFA, compliant device |
| T0 service account (gMSA) | No (breaks workflow) | T0 Services | T0 server set | Default; per-Policy cap | Credential Guard on every host the account runs on | n/a (on-prem only) |
| T1 admin | Optional | T1 Admins | T1 jump servers | Default; per-Policy cap | Credential Guard everywhere | CA on synced T1 group |
| T2 user | No | None | n/a | Default | Credential Guard default-on, LAPS for local admin | CA general policy |
If this is the reference deployment, what about the alternative architectures customers actually have in production -- ESAE forests, MIM PAM bastion forests, the Enterprise Access Model?
7. Tiered Administration vs. bastion forest vs. Enterprise Access Model
Three operational doctrines coexist in 2026 production environments, with a fourth meta-architecture sitting above them. None are interchangeable; choosing the wrong one means over-building, under-building, or building the right thing in the wrong place.
Method A: Tier model + Authentication Policy Silos + Protected Users. The current Microsoft recommendation for the on-prem enforcement layer in connected and hybrid environments. The whole of §5 and §6 is the description. Cited references: [5][6][4].
Method B: MIM Privileged Access Management with a bastion forest. Microsoft Identity Manager PAM with the Server 2016 bastion-forest functional level gives just-in-time activation of privileged group membership in a separate, hardened "bastion" forest with a one-way trust from production to bastion. Microsoft Learn's Raise the bastion forest functional level page is explicit on the feature pivot: "With Windows Server 2016, PAM features of time-limited group memberships and shadow principal groups are built into Windows Server Active Directory" [41]. A user requests time-bound activation, MIM validates it, the user is briefly added to a bastion-forest privileged group (a shadow principal at WS 2016 FFL), and the resulting TGT carries the production SIDs via PAC SID History. When the activation expires, the SID History entry disappears from newly issued tickets. The Microsoft Learn page is explicit about scope:
"The PAM approach provided by MIM PAM is not recommended for new deployments in Internet-connected environments. MIM PAM is intended to be used in a custom architecture for isolated AD environments where Internet access is not available, where this configuration is required by regulation, or in high impact isolated environments like offline research laboratories and disconnected operational technology or supervisory control and data acquisition environments." -- Microsoft Learn, MIM PAM [42]
Method C: Enhanced Security Admin Environment (ESAE) / Red Forest. A separate hardened forest used exclusively for administrative identities, with a one-way trust from production to the admin forest. Production-forest administration is performed by accounts that live exclusively in the admin forest. Microsoft retired ESAE as a mainstream recommendation on December 15, 2020 [43].
A dedicated Active Directory forest containing all administrative identities, with a one-way trust from the production forest to the admin forest. Retired as a mainstream Microsoft recommendation on December 15, 2020 [43]; preserved for air-gapped, OT, ICS, and SCADA scenarios where cloud-side privileged-access controls are unavailable. Microsoft's explicit guidance for existing ESAE deployments is "no urgency to retire" if the deployment is operating as designed.
Method D: Enterprise Access Model (EAM) / Rapid Modernization Plan (RaMP). Microsoft's current meta-architecture, announced concurrently with the ESAE retirement on December 15, 2020 [43][4][44]. EAM widens the segmentation from forest boundaries to access levels: a privileged-access plane (the equivalent of T0, now explicitly including Entra ID admin roles), a management plane (formerly T1), a data/workload plane (where applications run), and a user/app plane (T2). EAM does not deprecate the directory-level controls -- it encloses them inside a larger model that adds the cloud control plane as a first-class object.
Microsoft's December 15, 2020 meta-architecture for privileged-access. Replaces forest-level isolation with access-level segmentation across four planes: privileged-access, management, data/workload, and user/app. EAM is the framework; Method A (Tier model + Silos + Protected Users) is the on-prem enforcement layer inside the privileged-access plane; Entra PIM and Conditional Access are the cloud-side enforcement [4][44].
Four operational doctrines, side by side.
| Dimension | A: Tier + Silos + Protected Users | B: MIM PAM bastion | C: ESAE / Red Forest | D: EAM + RaMP |
|---|---|---|---|---|
| Enforcement plane | KDC (AS-REQ, TGS-REQ, S4U) | Bastion KDC + MIM workflow | Admin-forest KDC + one-way trust | Meta: composes A + cloud + host |
| Primary restriction | Where a TGT may be issued and to whom delegated | Whether and for how long a privileged group is populated | Which forest privileged identities live in | Which planes are enforced and by what |
| AD schema footprint | 4 attributes / 2 classes + RID 525 | Server 2016 PAM FFL + Shadow Principal extensions | None new; uses standard trust + SID filtering | n/a (model) |
| Cloud / hybrid coverage | On-prem only | On-prem only (explicitly NOT for connected) | On-prem only | First-class hybrid by design |
| Deployment complexity | Moderate | High (forest pair + SQL + MIM) | Highest (forest pair + full DR) | Variable (sum of constituents) |
| Microsoft current status (May 2026) | Recommended for on-prem enforcement | OT / ICS / regulated air-gapped only | Legacy; supported for existing + OT only | Recommended as top-level architecture |
Method D is the framework; Method A is the on-prem enforcement layer inside it; Methods B and C are the niche answers for environments Method A cannot reach. The four are not in competition for the same job. A connected hybrid enterprise in 2026 runs Method D + Method A on-prem, with B and C reserved for the air-gapped exception cases.
EAM is the framework. Method A is its on-prem enforcement layer. What does Method A's enforcement layer NOT close, by construction?
8. What the KDC cannot enforce
A well-deployed Method A architecture eliminates the credential-theft attack chain at the KDC. It does not close every gap. The remaining gaps are not implementation bugs; they are structural properties of where the KDC sits in the stack. Naming them is not optional.
The RBCD residual. Resource-based constrained delegation is configured by writing the msDS-AllowedToActOnBehalfOfOtherIdentity attribute on the target object [28]. The write is governed by the target object's DACL, not by the Silo plane. The KDC never sees the write; it only sees the resulting TGS-REQ. If the target is a service account that is Silo'd but not in Protected Users -- which, per Microsoft Learn's explicit guidance, is the case for most service accounts -- the RBCD chain remains exploitable. The defence is layered: pin the source machine via the Silo Policy, deny WriteProperty on msDS-AllowedToActOnBehalfOfOtherIdentity for everyone but directory administrators, prefer Group Managed Service Accounts for new services, and put Defender for Identity detection on the attribute-write event [34].
A constrained-delegation primitive introduced in Windows Server 2012. Unlike classic constrained delegation (configured by the privileged administrator on the delegating service via msDS-AllowedToDelegateTo), RBCD is configured on the target by writing msDS-AllowedToActOnBehalfOfOtherIdentity. The target object's owner controls which services may impersonate users to it. Governance is at the ACL plane, not the KDC plane, which is why RBCD writes are invisible to Authentication Policy Silo enforcement [28].
Physical extraction from a logged-on T0 host. The KDC cannot prevent the extraction of credential material from the memory of a machine on which the user is logged on. The credential has to exist somewhere in memory for the user to use it. Credential Guard raises the bar dramatically by placing the credential material in a VBS-protected VTL1 enclave that the VTL0 kernel cannot read, even with a signed driver [18]. Remote Credential Guard adds a parallel host-side control for RDP-initiated authentications that redirects Kerberos requests back to the originating client [19]. None of these is a KDC control. The KDC and the host are two layers; both are required.
The on-prem-to-cloud bridge. On-prem AD KDC enforcement (Silo membership) and Entra ID Conditional Access enforcement are two independent policy planes by construction. The Primary Refresh Token does not carry msDS-AssignedAuthNPolicySilo. Conditional Access does not consume the Silo binding. Operational alignment is achieved by synchronising the Silo'd group through Microsoft Entra Connect and writing a Conditional Access policy keyed on the synced group. The CA sees the synchronised group; it does not see the Silo. Two planes, both must hold.
Closing the on-prem-to-cloud gap requires either a Microsoft product change that projects Silo membership into the Primary Refresh Token, or a third-party policy synthesiser. Neither exists as a product surface in May 2026 -- which is why the §10 Phase 4 workaround (sync the Silo'd group through Microsoft Entra Connect, key the Conditional Access policy on the synced group) is the current production answer. The workaround keeps both planes independent by construction; it does not close the gap, it routes around it.
Supply-chain compromise of T0 software. The KDC cannot enforce policy against an agent running as SYSTEM on every domain controller. By construction, the agent is outside the KDC's authorisation scope; it can rewrite the directory the KDC reads its policy from. The canonical instance is the SolarWinds Orion compromise disclosed in December 2020 (CISA Alert AA20-352A): the attackers used a backdoored Orion update to obtain SYSTEM-level access on management hosts and, per the CISA advisory's User Impersonation section, in several documented cases used that access to compromise "the SAML signing certificate using their escalated Active Directory privileges" -- the AD FS / Entra Connect token-signing certificate -- and then "create unauthorized but valid tokens" presented to services that trust SAML tokens from the environment, on T0 systems where the secret material has to exist in memory for the system to do its job [45]. The KDC saw legitimately-signed tickets and made legitimate policy decisions; the enforcement gap is one layer below, where the software running as the KDC's neighbour ships compromised code. The closure for this residual is not at the KDC; it is at the software-supply-chain layer (code signing, reproducible builds, attested deployment, and strict T0-software inventory).
A maximally-correct Method A deployment closes the KDC-plane gaps it was designed to close. Four explicit residuals remain by construction. Three need additional controls (target-ACL hardening, Credential Guard, Conditional Access keyed on the synced group); the fourth is closed at the software-supply-chain layer. The architecture is correct. The world is bigger than the architecture.
What is the active research, and what does a practitioner do on Monday morning to deploy what is settled?
9. Active research lines as of mid-2026
The community is not standing still. Five lines of work are visible on the public radar.
Projecting Authentication Policy Silo membership into Entra Conditional Access as a first-class signal. The most-named open problem in both SpecterOps research and Microsoft's own post-NTLM roadmap discussion. Matthew Palko's October 2023 post Evolution of Windows Authentication is Microsoft's institutional acknowledgement that the post-NTLM future is Kerberos plus IAKerb plus Local KDC; the post does not commit to projecting Silo membership into the Primary Refresh Token, but it is the closest reading the community has of a hybrid identity direction [46]. IAKerb plus Local KDC is plausibly the substrate that could eventually carry Silo state across the on-prem-to-cloud boundary, but no public Microsoft roadmap entry as of May 2026 announces that projection.
A community-maintained checklist of Active Directory and Microsoft Entra ID assets, annotated with whether each asset is "Tier Zero" (its compromise grants forest-wide or tenant-wide control), what platform it sits on, how to identify it (typically by SID or by role assignment), and what attack techniques apply by default versus by misconfiguration. The repository is github.com/SpecterOps/TierZeroTable with a rendered live view at specterops.github.io/TierZeroTable [30][29].
Tier Zero scoping at hybrid-cloud scale. Defining the boundary of T0 in a hybrid environment is increasingly difficult. The on-prem T0 set (DCs, AD CS, Entra Connect, DC backup) is enumerable. The cloud-side T0 set (Entra ID Application Administrators with Graph permissions over AD-synced objects, Hybrid Identity Administrators, Global Administrators, Privileged Authentication Administrators) is large, dynamic, and contains roles whose tier-0 status is contested. The SpecterOps Tier Zero Table is the community's canonical operational answer; its GitHub README is explicit that "the table does not include all Tier Zero assets yet" [30]. BloodHound Community Edition is the companion discovery primitive: feed it a directory snapshot, ask it for attack paths to T0, fix the paths [47]. The introductory blog series at SpecterOps explains the "Defining the Undefined" definitional work behind the table [48].
If you have never used BloodHound against your own forest, that is the most leveraged single action you can take this month. The tool exposes the attack paths your tier model is supposed to be closing -- and the gaps are almost always somewhere you did not look. The Tier Zero Table is the human-readable companion; BloodHound is the machine-readable one [47][30].Continued discovery of ADCS misconfiguration classes (ESC1-ESC8+). Schroeder and Christensen's June 17, 2021 Certified Pre-Owned whitepaper was the inflection [39][40]. The original taxonomy catalogued ESC1 through ESC8; ESC9 and several subsequently-disclosed classes have been added since by the SpecterOps team and the wider AD CS research community, with the GhostPack Certify tool tracking the enumerable classes in its active branch [49], and adjacent variants continuing to land in the SpecterOps blog stream. Each class is a tier-bypass primitive that survives Method A's deployment if the AD CS configuration is itself misconfigured: the KDC sees a legitimately-signed certificate and a legitimate AS-REQ. KB 5014754's strong-mapping closes the specific CVE-2022-26923 ("Certifried") class; template hardening (manager-approval, no-CT, no-enrollee-supplies-subject) addresses several other classes [38].
Kerberos relay primitives. The KrbRelay family of attacks, anchored to James Forshaw's October 2021 Project Zero research on cross-protocol Kerberos relaying [50] and operationalised in the cube0x0/KrbRelay tool released shortly thereafter [51], exploits the absence of channel binding in some pre-authentication flows. Silos enforce on the source-machine identity as presented in the AS-REQ; an attacker who can cause a different machine to issue an AS-REQ on the attacker's behalf and relay it can satisfy the Silo Policy. FAST (RFC 6113) provides the cryptographic primitive for channel binding [25]; Microsoft's Kerberos armoring uses FAST, and a Silo Policy can be configured to require FAST armoring. The open deployment question is whether FAST armoring becomes the universal default in legacy environments. The Palko post on the post-NTLM Windows authentication roadmap is the closest Microsoft has come to addressing the deployment direction publicly [46].
Service-account placement: Protected Users vs. Silo-only. The unsolved sub-problem inside the RBCD residual. Service accounts have two failure modes: they cannot be placed in Protected Users without breaking their delegation workflows, and they cannot be left out without leaving an RBCD-attack primitive against tier-protected service accounts that have writable msDS-AllowedToActOnBehalfOfOtherIdentity. The current best partial result is composite: Group Managed Service Accounts plus a tight Silo Policy plus an ACL on the delegation attribute plus a SIEM rule on attribute writes. The architectural answer would be an extension to Protected Users that retains delegation-as-source but refuses NTLM, RC4, and DES. No such extension appears on Microsoft's public roadmap as of May 2026 [5][34].
The settled controls are deployable. The open research is real and has not been closed. Five years from now, the Silo plane will likely still be the operational answer, with the residuals closed by different parts of the stack. What does that look like to a practitioner reading this on a Monday morning?
10. A six-phase playbook for deploying Method A this quarter
A staged playbook. The phases are ordered for safety: each phase reduces the blast radius of the next, and the first phase is the most important and the most often skipped.
Phase 0: Inventory Tier 0
Use the SpecterOps Tier Zero Table as the starting checklist [30][29]. Pair it with BloodHound Community Edition to discover the attack paths your environment actually has into the T0 set [47]. The Tier Zero Table is intentionally incomplete -- treat it as the floor, not the ceiling -- and add the assets specific to your environment: any service account whose compromise grants write access to a DC, any backup system that can restore a DC's NTDS.dit, any monitoring system that can run code on a DC. Sean Metcalf's body of work on secure workstation baselines is the canonical operator-grade reading for this phase [52][12].
Phase 1: Create the T0 Admins Silo and Policy in audit mode
Create the msDS-AuthNPolicySilo named "T0 Admins" and its referenced msDS-AuthNPolicy named "T0 Source Restriction." Set msDS-AuthNPolicySiloEnforced=FALSE to start in audit mode [6]. Place a single test admin account in Protected Users and assign it to the Silo. Set the Policy's UserAllowedToAuthenticateFrom SDDL to a SID set containing exactly one PAW. Confirm that authentication from the PAW succeeds, that authentication from a tier-2 workstation generates the expected audit event (Authentication Policy Silo audit failure in the Security log), and that nothing else in the environment breaks. Once the audit window is clean, flip the Silo to enforced mode. The KDC now returns KDC_ERR_POLICY for any AS-REQ from outside the allowed-from set [27].
Phase 2: Catalogue every delegation relationship in the directory
Enumerate every account with msDS-AllowedToDelegateTo set, every object with msDS-AllowedToActOnBehalfOfOtherIdentity set, and every account with the legacy TrustedForDelegation UAC bit. For each T0-adjacent service account, decide whether the workflow can survive Protected Users membership. If yes, enrol the account and move on. If no -- which will be the common answer -- create a "T0 Services" Silo with a tight UserAllowedToAuthenticateFrom Policy, bind the account to the Silo, deny WriteProperty on msDS-AllowedToActOnBehalfOfOtherIdentity for everyone but directory administrators, and audit Defender for Identity for the corresponding alerts [34]. The composite defence is the current best partial answer to the RBCD residual.
kdssvc.dll) on the domain controller derives the account's password from a domain-wide root key plus a per-account key identifier and rotates it on a configurable schedule; service hosts retrieve the current password through an ACL-controlled flow [36]. The cryptographic-rotation property -- not Silo membership -- is what closes the AS-REP roasting primitive in practical timeframes for a service-account workflow that the §6 PullQuote forbids from enrolling in Protected Users. Microsoft's How to Configure Protected Accounts page covers the wider per-account migration shape for legacy non-gMSA services [31].
Phase 3: Roll the human T0 administrators into Protected Users in batches
Audit the longest-running tier-0 administrative task in your environment before you enrol anyone. Forest backups, replication health checks, schema upgrade dry-runs, DC promotions, and emergency operational procedures sometimes exceed four hours; the Protected Users 240-minute non-renewable TGT cap will silently re-authenticate or fail outright when they do [31]. Enrol in batches of two or three administrators at a time; keep the previous batch in for at least two weeks before adding the next. Microsoft's How to Configure Protected Accounts page lays out the staged enrolment shape [31].
Phase 4: Project the T0 group into Entra Conditional Access
Sync the T0 Admins group through Microsoft Entra Connect. Write a Conditional Access policy that requires phishing-resistant MFA (FIDO2, Windows Hello for Business, or certificate-based authentication) for that group, plus a compliant device, plus a known-good location if the threat model justifies it [33]. Document explicitly that the CA is keyed on the synchronised group, not on the Silo binding; the two enforcement planes are independent by construction. The Entra side is the topic of the Conditional Access post in this series for the deeper treatment.
For the cloud-side treatment of Conditional Access policy shapes -- compliant device, phishing-resistant MFA grant control, location and risk conditions -- see the Conditional Access post in this series. The CA policy keyed on the synced T0 group is what holds the two-plane workaround together.Phase 5: Break-glass
Two emergency-access accounts that are outside every Silo, outside Protected Users, with passwords stored offline in a tamper-evident envelope held by two separate people, with a documented monthly use-and-rotate procedure, and with high-fidelity SIEM detection on every authentication attempt. The cost of the break-glass pair is the deliberate, audited counter-balance to the rest of the architecture. Microsoft's RaMP guidance treats this as the first step of the privileged-access rollout [44]. The built-in domain Administrator (RID 500) is the natural canonical first break-glass identity because it is exempt from Authentication Policy enforcement even when assigned to a Silo [5].
Microsoft's RaMP page lists "Emergency access accounts" as the first initiative of the entire Rapid Modernization Plan, ahead of Entra PIM and the on-prem controls [44]. The ordering is deliberate: a privileged-access deployment that locks itself out before it has secured the recovery path is worse than no deployment at all.Sample PowerShell to bootstrap the T0 Admins Silo and Policy
The Active Directory PowerShell module exposes the cmdlets directly. The skeleton below creates a Policy and a Silo in audit mode, then assigns one user. Adapt the SDDL to your PAW computer SIDs before running.
New-ADAuthenticationPolicy -Name "T0 Source Restriction" -UserTGTLifetimeMins 240 -UserAllowedToAuthenticateFrom 'O:SYG:SYD:(XA;OICI;CR;;;WD;(@USER.ad://ext/AuthenticationSilo == "T0 Admins"))'
The @USER.ad://ext/AuthenticationSilo token in that SDDL is evaluated at AS-REQ time against the source machine's user-token claims, not against the requesting user's own Silo binding -- the Policy admits the requesting user only from devices whose computer accounts are themselves Silo members of "T0 Admins" (typically the T0 PAW set). The token's evaluation context is the source-device side of the request, which is the practical encoding of the source-machine pinning Method A relies on [6].
New-ADAuthenticationPolicySilo -Name "T0 Admins" -Enforce:$false -UserAuthenticationPolicy "T0 Source Restriction"
Set-ADAccountAuthenticationPolicySilo -Identity alice.da -AuthenticationPolicySilo "T0 Admins"
Add-ADGroupMember -Identity "Protected Users" -Members alice.da
Run in audit mode (Enforce:false) for a full audit cycle, validate the Security log for Authentication Policy Silo events, then flip to enforced mode. The official PowerShell-cmdlet documentation is on the Microsoft Learn AD-cmdlet pages; the relevant deployment shape is described in How to Configure Protected Accounts [31].
You have a playbook. You also have a set of questions readers are now going to ask. Here they are.
11. Frequently asked questions
Frequently asked questions
Should I just put everyone in Protected Users?
No -- service accounts must not be (see §6's canonical Microsoft Learn PullQuote), and workstation users do not need to be (the Silo plane and Credential Guard handle their threat model). For human administrators, the answer is "yes, in batches, after testing" -- see §10 Phase 3's Callout on the 4-hour TGT cap, which is the single most common pilot break.
Does Silo membership stop Kerberoasting?
Indirectly. Kerberoasting per se is defeated by AES-only enforcement and high-entropy passwords. Protected Users forbids RC4 and DES for its members, so a Silo'd and Protected human administrator cannot be roasted with the public RC4-dependent tooling. For service accounts that cannot be Protected, the defence is explicit AES enforcement via msDS-SupportedEncryptionTypes plus gMSA-managed high-entropy passwords [31]. Defender for Identity surfaces accounts that still use RC4 [34].
Does the Primary Refresh Token carry my Silo membership to Entra?
No. Two independent planes. The PRT does not carry msDS-AssignedAuthNPolicySilo, and Conditional Access does not consume it. The standard alignment is to synchronise the Silo'd group through Microsoft Entra Connect and write a CA policy keyed on the synced group. The CA sees the synchronised group, not the Silo. Both planes must hold for a hybrid privileged identity to be safe [4][46]. Closing the gap requires either a Microsoft product change or a third-party policy synthesiser; neither exists as a product surface in May 2026.
Is the tier model deprecated?
Subtly. ESAE -- the Red Forest pattern -- was retired as a mainstream recommendation on December 15, 2020 [43]. The tier model as an idea was folded into the Enterprise Access Model [4]; the directory-level controls (Authentication Policy Silos, Protected Users) remain Microsoft's recommended on-prem enforcement layer. New ESAE deployments are not recommended outside air-gapped OT, ICS, and SCADA scenarios; existing ESAE deployments operating as designed have no urgency to retire.
What does KB 2871997 actually do?
KB 2871997 is the May 13, 2014 down-level backport of Protected Users client-side honoring and Authentication Policy / Silo client-side support to Windows 7, Windows 8, Server 2008 R2, and Server 2012 [17]. It is NOT the introduction of those features -- the introduction is Windows Server 2012 R2 GA on October 18, 2013 [3][21]. The October 14, 2014 revision additionally shipped Restricted Admin Mode for RDP, which has its own cautionary history as the canonical example of a defence that became its own inverse [20][19].
Can I run my domain controllers in a Silo?
The schema supports it -- a Silo's msDS-ComputerAuthNPolicy link carries a Computer Policy with its own Computer TGT Lifetime, and DCs are valid Silo members in principle [6]. The operational pattern doesn't do that, for two reasons. First, DCs are themselves the authentication authority, and Microsoft Learn's Authentication Policies and Silos page explicitly warns against changing Computer TGT Lifetime on DC class accounts because shortened TGT lifetimes disrupt replication and other DC-to-DC operations ("It is not recommended to change this setting" [6]). Second, the Silo plane is built for the accounts that authenticate to DCs -- T0 admins, the AD CS computer account, the Entra Connect server -- where source-machine pinning is the high-impact control. Silo the accounts that authenticate to your DCs; protect the DCs themselves with the orthogonal directory primitives (KDC service-account configuration, Defender for Identity sensor deployment, code-signing and update management, physical isolation). The Tier Zero Table and BloodHound surface the DC-adjacent accounts that need Silo membership [30][47].
The directory now has the answer it lacked for sixteen years. Three controls, one ship, plus thirteen years of operational discipline to compose them, plus an explicit acknowledgement of the four residuals the KDC cannot close by construction. On the Tuesday morning in April 1997 when Paul Ashton posted his patched smbclient to NTBugtraq, no one in the AD product group could have written this article. They can now -- and the KDC, keyed on directory state, is the layer they would write it from.
Study guide
Key terms
- Pass-the-Hash
- Credential-theft technique that uses an account's NT hash as the long-term key. The NTLM protocol cannot distinguish the legitimate password-holder from anyone holding the hash.
- Protected Users
- Global security group (well-known RID 525) introduced in Windows Server 2012 R2. Members get a non-configurable credential-restriction set: no NTLM, no DES or RC4 in Kerberos, no delegation, no cached offline-sign-in verifier, 240-minute non-renewable TGT cap.
- Authentication Policy Silo
- The msDS-AuthNPolicySilo container object. Enumerates the user, computer, and service accounts that share a set of restrictions, and references one or more Authentication Policies whose rules apply to its members.
- Authentication Policy
- The msDS-AuthNPolicy rules object. Carries the TGT lifetime cap, the allowed-from SDDL on source-machine identity, allowed-to delegation rules, claim transformations, and optional FAST armoring requirement.
- KDC (Key Distribution Center)
- The Kerberos authentication service that handles AS-REQ (TGT issuance) and TGS-REQ (service-ticket issuance). On Windows, every DC runs a KDC; the KDC reads policy from the directory at request time.
- PAC (Privilege Attribute Certificate)
- Microsoft authorisation-data structure carried inside Kerberos TGTs and service tickets. PAC_LOGON_INFO.GroupIds encodes Protected Users membership via well-known SID 525.
- Tier 0 (T0)
- The control plane: domain controllers, AD CS root CAs, Entra Connect servers, DC backup systems, and any system whose compromise grants forest-wide control.
- Enterprise Access Model (EAM)
- Microsoft's December 15, 2020 meta-architecture for privileged-access. Segments by access level (privileged-access, management, data/workload, user/app) rather than by forest boundary, and incorporates Entra ID admin roles as first-class control-plane objects.
- RBCD (Resource-Based Constrained Delegation)
- Constrained delegation configured by writing msDS-AllowedToActOnBehalfOfOtherIdentity on the target. Governed by the target object's ACL, not by the Silo plane; remains exploitable against tier-protected service accounts that cannot be in Protected Users.
- Tier Zero Table (SpecterOps)
- Community-maintained checklist of AD and Entra ID assets that must be enclosed in the T0 control plane. Intentionally incomplete; designed to be the floor of the inventory, not the ceiling.
References
- (1997). Microsoft Windows NT 4.0 SP5 / Terminal Server 4.0 -- Pass the Hash Vulnerability (Exploit-DB mirror of Ashton NTBugtraq patch). https://www.exploit-db.com/exploits/19197 ↩
- Sneaky Active Directory Persistence #15: AdminSDHolder & SDProp Abuse to (Re)Gain Domain Admin Rights. https://adsecurity.org/?p=1906 ↩
- (2013). Save the date: Windows Server 2012 R2, Windows System Center 2012 R2 and Windows Intune update coming Oct. 18. https://blogs.microsoft.com/blog/2013/08/14/save-the-date-windows-server-2012-r2-windows-system-center-2012-r2-and-windows-intune-update-coming-oct-18/ ↩
- Privileged access: Enterprise access model. https://learn.microsoft.com/en-us/security/privileged-access-workstations/privileged-access-access-model ↩
- Protected Users Security Group. https://learn.microsoft.com/en-us/windows-server/security/credentials-protection-and-management/protected-users-security-group ↩
- Authentication Policies and Authentication Policy Silos. https://learn.microsoft.com/en-us/windows-server/security/credentials-protection-and-management/authentication-policies-and-authentication-policy-silos ↩
- Pass the hash. https://en.wikipedia.org/wiki/Pass_the_hash ↩
- Privileged access strategy. https://learn.microsoft.com/en-us/security/privileged-access-workstations/privileged-access-strategy ↩
- How Mimikatz Became the Go-To Hacker Tool. https://www.wired.com/story/how-mimikatz-became-go-to-hacker-tool/ ↩
- mimikatz (blog.gentilkiwi.com). https://blog.gentilkiwi.com/mimikatz ↩
- mimikatz (gentilkiwi/mimikatz GitHub repository). https://github.com/gentilkiwi/mimikatz ↩
- (2015). Red vs. Blue: Modern Active Directory Attacks & Defense (DerbyCon V, 2015). https://adsecurity.org/?p=1738 ↩
- (2014). Mitigating Pass-the-Hash (PtH) Attacks and Other Credential Theft Techniques, Version 2. https://download.microsoft.com/download/7/7/A/77ABC5BD-8320-41AF-863C-6ECFB10CB4B9/Mitigating-Pass-the-Hash-Attacks-and-Other-Credential-Theft-Version-2.pdf ↩
- Windows NT 4.0. https://en.wikipedia.org/wiki/Windows_NT_4.0 ↩
- (2006). RFC 4556: Public Key Cryptography for Initial Authentication in Kerberos (PKINIT). https://datatracker.ietf.org/doc/html/rfc4556 ↩
- Configuring Additional LSA Protection. https://learn.microsoft.com/en-us/windows-server/security/credentials-protection-and-management/configuring-additional-lsa-protection ↩
- (2014). Microsoft Security Advisory 2871997: Update to improve credentials protection and management (May 13, 2014). https://support.microsoft.com/en-us/topic/microsoft-security-advisory-update-to-improve-credentials-protection-and-management-may-13-2014-93434251-04ac-b7f3-52aa-9f951c14b649 ↩
- Credential Guard overview. https://learn.microsoft.com/en-us/windows/security/identity-protection/credential-guard/ ↩
- Remote Credential Guard. https://learn.microsoft.com/en-us/windows/security/identity-protection/remote-credential-guard ↩
- Restricted Admin mode for RDP in Windows 8.1 / 2012 R2 (MSDN archive). https://learn.microsoft.com/en-us/archive/blogs/kfalde/restricted-admin-mode-for-rdp-in-windows-8-1-2012-r2 ↩
- Protected Users Security Group (Windows Server 2012 R2 legacy documentation). https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2012-r2-and-2012/dn466518(v=ws.11) ↩
- (2005). RFC 4120: The Kerberos Network Authentication Service (V5). https://datatracker.ietf.org/doc/html/rfc4120 ↩
- [MS-PAC]: Privilege Attribute Certificate Data Structure. https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-pac/166d8064-c863-41e1-9c23-edaaa5f36962 ↩
- Securing privileged access workstations. https://learn.microsoft.com/en-us/security/privileged-access-workstations/ ↩
- (2011). RFC 6113: A Generalized Framework for Kerberos Pre-Authentication (FAST). https://datatracker.ietf.org/doc/html/rfc6113 ↩
- [MS-DRSR]: Directory Replication Service (DRS) Remote Protocol. https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-drsr/f977faaa-673e-4f66-b9bf-48c640241d47 ↩
- [MS-KILE]: Kerberos Protocol Extensions. https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-kile/2a32282e-dd48-4ad9-a542-609804b02cc9 ↩
- [MS-SFU]: Kerberos Protocol Extensions: Service for User and Constrained Delegation. https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-sfu/3bff5864-8135-400e-bdd9-33b552051d94 ↩
- SpecterOps Tier Zero Table (rendered). https://specterops.github.io/TierZeroTable/ ↩
- SpecterOps Tier Zero Table (GitHub repository). https://github.com/SpecterOps/TierZeroTable ↩
- How to Configure Protected Accounts. https://learn.microsoft.com/en-us/windows-server/identity/ad-ds/manage/how-to-configure-protected-accounts ↩
- Windows LAPS overview. https://learn.microsoft.com/en-us/windows-server/identity/laps/laps-overview ↩
- What is Microsoft Entra Privileged Identity Management?. https://learn.microsoft.com/en-us/entra/id-governance/privileged-identity-management/pim-configure ↩
- Defender for Identity security assessment: Unsecure account attributes. https://learn.microsoft.com/en-us/defender-for-identity/security-assessment-unsecure-account-attributes ↩
- (2016). RFC 8009: AES Encryption with HMAC-SHA2 for Kerberos 5. https://datatracker.ietf.org/doc/html/rfc8009 ↩
- Group Managed Service Accounts overview. https://learn.microsoft.com/en-us/windows-server/security/group-managed-service-accounts/group-managed-service-accounts-overview ↩
- (2021). KB5008380: Authentication updates (CVE-2021-42287). https://support.microsoft.com/en-us/topic/kb5008380-authentication-updates-cve-2021-42287-9dafac11-e0d0-4cb8-959a-143bd0201041 ↩
- (2022). KB5014754: Certificate-based authentication changes on Windows domain controllers. https://support.microsoft.com/en-us/topic/kb5014754-certificate-based-authentication-changes-on-windows-domain-controllers-ad2c23b0-15d8-4340-a468-4d4f3b188f16 ↩
- (2021). Certified Pre-Owned: Abusing Active Directory Certificate Services. https://specterops.io/blog/2021/06/17/certified-pre-owned/ ↩
- (2021). Certified Pre-Owned: Abusing Active Directory Certificate Services (whitepaper PDF). https://specterops.io/wp-content/uploads/sites/3/2022/06/Certified_Pre-Owned.pdf ↩
- Raise the bastion forest functional level to use Active Directory PAM features (Server 2016 shadow principal groups and time-limited group memberships). https://learn.microsoft.com/en-us/microsoft-identity-manager/pam/raise-bastion-functional-level ↩
- Privileged identity management for Active Directory Domain Services (MIM PAM). https://learn.microsoft.com/en-us/microsoft-identity-manager/pam/privileged-identity-management-for-active-directory-domain-services ↩
- (2020). Enhanced Security Admin Environment (ESAE) architecture mainstream retirement. https://learn.microsoft.com/en-us/security/privileged-access-workstations/esae-retirement ↩
- Securing privileged access roadmap (Rapid Modernization Plan). https://learn.microsoft.com/en-us/security/privileged-access-workstations/security-rapid-modernization-plan ↩
- (2020). CISA Alert AA20-352A: Advanced Persistent Threat Compromise of Government Agencies, Critical Infrastructure, and Private Sector Organizations (SolarWinds Orion supply-chain compromise). https://www.cisa.gov/news-events/cybersecurity-advisories/aa20-352a ↩
- (2023). The Evolution of Windows Authentication. https://techcommunity.microsoft.com/blog/windows-itpro-blog/the-evolution-of-windows-authentication/3926848 ↩
- BloodHound Community Edition. https://github.com/SpecterOps/BloodHound ↩
- What is Tier Zero -- Part 1. https://posts.specterops.io/what-is-tier-zero-part-1-e0da9b7cdfca ↩
- Certify: AD CS abuse enumeration tool (GhostPack). https://github.com/GhostPack/Certify ↩
- (2021). Using Kerberos for Authentication Relay Attacks (Project Zero). https://googleprojectzero.blogspot.com/2021/10/using-kerberos-for-authentication-relay.html ↩
- KrbRelay: Relaying 3-headed dogs (Kerberos cross-protocol relay tool). https://github.com/cube0x0/KrbRelay ↩
- Securing Windows Workstations: Developing a Secure Baseline. https://adsecurity.org/?p=3299 ↩