kerberos约束委派(kcd)的核心目标是让前端服务以原始用户身份安全访问指定后端资源,通过spn显式限定委托范围,防止横向移动;适用于iis连sql、sharepoint调用api等多跳场景,需满足域功能级别≥2012 r2、有效spn、时间同步≤5分钟等前提,并区分传统账户级与基于资源的委派方式。
配置 kerberos 约束委派(kcd)的核心目标,是让前端服务能以原始用户身份安全访问指定后端资源,同时严格限制可委托的目标范围。它不依赖信任整个服务账户,而是通过 spn 显式声明“只允许委派给这几个服务”,从而大幅降低横向移动风险。
明确适用场景与前提条件
约束委派适用于 IIS 连 SQL Server、SharePoint 调用后端 API、Exchange 前端代理访问邮箱数据库等多跳身份传递场景。启用前需确认:
- 域功能级别 ≥ Windows Server 2012 R2(推荐 2016 或更高)
- 前端服务使用域账户(不能是 LocalSystem、NetworkService 等内置账户,除非用计算机账户并启用基于资源的委派)
- 后端服务已注册有效且匹配的 SPN,例如 SQL/SRV-SQL01.contoso.com 或 HTTP/api.internal.contoso.com
- 客户端、前端服务器、后端服务器时间偏差 ≤ 5 分钟,全部同步至域内 PDC 模拟器
配置方式选择:传统账户级 vs 基于资源的委派
两者本质不同,选错会导致配置无效:
-
传统账户级 KCD:在前端服务账户(用户或计算机对象)上设置,由域管理员操作。使用
Set-ADUser -PrincipalsAllowedToDelegateToAccount指定后端 SPN 列表。仅支持同域后端。 -
基于资源的 KCD(RBCD):在后端服务账户(如 SQL Server 计算机账户或托管服务账户)上配置,由后端服务管理员控制。使用
Set-ADComputer -PrincipalsAllowedToDelegateFromAccount添加被信任的前端账户。支持跨域,且更灵活安全。
若前端和后端不在同一域,必须用 RBCD;若无域管理员权限(如 Azure AD DS 托管环境),也只能用 RBCD。
关键实操步骤(以传统方式为例)
假设 IIS 应用使用域服务账户 svc-webapp,需以用户身份访问 SQL Server srv-sql01.contoso.com:
- 为 SQL Server 注册 SPN:
setspn -s MSSQLSvc/srv-sql01.contoso.com:1433 svc-sql - 为前端账户启用约束委派:
Set-ADUser svc-webapp -PrincipalsAllowedToDelegateToAccount @("MSSQLSvc/srv-sql01.contoso.com:1433") - IIS 中确保应用池标识设为该账户,并启用
useAppPoolCredentials="true"(web.config) - 验证命令:
Get-ADUser svc-webapp -Properties PrincipalsAllowedToDelegateToAccount,输出应含上述 SPN
常见失败原因与快速排查
即使配置完成,仍可能报 KDC_ERR_BADOPTION 或凭据转发失败,重点检查:
- SPN 大小写无关但 FQDN 必须完全一致——
HTTP/webapp≠HTTP/webapp.contoso.com - 后端服务未启用 Kerberos(如 SQL Server 实例未开启“集成安全性”或未监听 Kerberos 端口)
- IIS 应用池未加载用户配置文件(Advanced Settings → Process Model → Load User Profile = True)
- 客户端浏览器未将站点加入“本地 Intranet”或“可信站点”,导致回退到 NTLM(委派不触发)











