约束性委派是AD中Kerberos支持的受限服务委托机制,仅允许指定SPN的后端服务认证;适用于IIS连SQL、Exchange/SharePoint多跳、微服务用户上下文传递等场景。
什么是约束性委派(Constrained Delegation)及其适用场景
约束性委派是 active directory 中 kerberos 协议支持的一种机制,允许服务账户代表用户向指定的后端服务(如 sql server、http 服务)发起 kerberos 认证请求。它比非约束性委派(unconstrained delegation)安全得多,因为委派目标被显式限制在 spn 列表中。
常见使用场景包括:IIS 应用服务器需要以用户身份连接后端 SQL Server;Exchange 或 SharePoint 的多跳认证;微服务间需保持原始用户上下文的调用链。
- 必须确保域功能级别 ≥ Windows Server 2003(推荐 2012 R2+)
- 委派服务账户必须是域账户,且不能是内置账户(如
NT AUTHORITY\SYSTEM) - 后端服务必须注册有效 SPN,例如
SQL/SERVER01.domain.com或HTTP/webapp.domain.com - 客户端和服务端都需启用 Kerberos(禁用 NTLM 会提升安全性,但可能引发兼容性问题)
配置约束性委派的实操步骤与关键命令
配置需在域控制器或具备 AD 管理权限的机器上完成,推荐使用 PowerShell(ActiveDirectory 模块),避免 GUI 操作遗漏细节。
- 使用
Set-ADUser或Set-ADComputer设置委派属性:Set-ADUser "svc-app01" -PrincipalsAllowedToDelegateToAccount @("SQL/srv-sql01.domain.com", "HTTP/api-backend.domain.com") - 若目标是计算机账户(如 IIS 托管在域加入的服务器上),改用
Set-ADComputer并确认该计算机对象未启用“仅使用 Kerberos”之外的其他委派选项 - 验证是否生效:运行
Get-ADUser "svc-app01" -Properties PrincipalsAllowedToDelegateToAccount,输出应为非空数组 - 注意:SPN 必须完全匹配后端服务实际使用的 SPN,大小写不敏感但 FQDN 和端口(如有)必须一致;例如
HTTP/webapp≠HTTP/webapp.domain.com
为什么启用委派后仍出现 “KDC_ERR_BADOPTION” 或 “A specified logon session does not exist” 错误
这类错误通常不是配置失败,而是 Kerberos 协议层面的校验失败,根源往往在票据生命周期或信任链断裂。
- 客户端未使用 Kerberos 登录:检查
whoami /logonid输出中的认证包是否含Kerberos;若为NTLM,委派不会触发 - 后端服务未正确解析 AP-REQ:IIS/ASP.NET 默认不转发凭据,需在 web.config 中启用
useAppPoolCredentials="true"并确保应用池标识为委派账户 - 时间偏差超 5 分钟:Kerberos 对时钟同步极其敏感,
w32tm /query /status可查本地时间源;域内所有参与节点必须与 PDC Emulator 同步 - 委派路径过长:Windows 默认最多支持 3 跳(Client → AppServer → DB → FileServer),超出将被 KDC 拒绝;可通过组策略
Network security: Restrict NTLM: Outgoing NTLM traffic to remote servers辅助诊断,但无法绕过跳数限制
高风险配置项与不可逆的权限放大效应
约束性委派本身不是后门,但一旦账户被攻陷,攻击者可直接模拟任意域用户访问所列 SPN 对应的服务——这相当于把“用户凭证”以服务身份重放,绕过 MFA 和登录限制。
- 最危险组合:
PrincipalsAllowedToDelegateToAccount包含HOST/或RPC/类宽泛 SPN,或指向域控的LDAP/SPN - 服务账户若同时拥有
SeEnableDelegationPrivilege(极罕见)或被赋予GenericAll权限,可能被用于修改自身委派设置,实现权限持久化 - 不要对面向互联网的前端服务(如公网暴露的 API 网关)启用委派;即便加了 SPN 限制,一旦该服务被 RCE 利用,攻击者即可盗取 TGS 并横向移动
- 日志监控重点:事件 ID
4769(TGS 请求)中Service Name字段若频繁出现非预期 SPN,或Target UserName为空但Client Address异常,即为可疑委派行为
委派不是开关一开就完事的配置,它把一部分 Kerberos 协议的信任决策交给了管理员。每个 PrincipalsAllowedToDelegateToAccount 条目,都等于给对应服务签发了一张可被冒用的“代理通行证”。真正难的是持续梳理 SPN 依赖关系,以及在服务下线后及时清理委派设置——这点几乎总被忽略。










