双跳问题是什么
双跳问题的本质是凭据无法继续转发:用跳板机远程连到服务器 A,再从 A 上访问服务器 B 的共享、数据库或注册表时,第二跳使用的仍是第一跳留下的登录令牌,凭据并没有随会话传过去,于是报「拒绝访问」。常见解法有 CredSSP、Kerberos 约束委派和逐跳显式建会话三种,安全性与配置成本依次不同,能用约束委派就不要用 CredSSP。
基本信息
| 适用平台 | Windows + WinRM/PowerShell 远程、跳板机运维 |
|---|---|
| 典型现象 | 第一跳成功,第二跳访问网络资源被拒绝 |
| 方案一 | CredSSP:配置简单,凭据转发到目标机,风险高 |
| 方案二 | Kerberos 约束委派:更安全,配置较复杂 |
| 方案三 | 逐跳显式建会话,或由本地直接访问目标 |
典型使用场景
- 跳板机运维:在 A 上执行命令却需要读 B 上的共享或注册表
- Invoke-Command 嵌套调用时第二跳报拒绝访问
- 评估安全方案,比较 CredSSP 与约束委派的适用范围与风险
- 排查「换成管理员账号也一样被拒」,确认不是权限配错
- 设计远程运维体系时先规划委派模型,避免长期依赖凭据转发
常用示例
常用示例
# 现象:第一跳正常,第二跳访问远端资源失败
Invoke-Command -ComputerName srv-a -ScriptBlock { Get-ChildItem \\srv-b\share }
# 方案一:CredSSP(客户端声明可委派目标,目标端启用服务端角色)
Enable-WSManCredSSP -Role Client -DelegateComputer 'srv-b.corp.local'
Enable-WSManCredSSP -Role Server # 在目标端执行
Invoke-Command -ComputerName srv-a -Authentication Credssp -Credential (Get-Credential) -ScriptBlock { Get-ChildItem \\srv-b\share }
# 方案三:逐跳显式建会话,让第二跳由客户端直接发起
Invoke-Command -ComputerName srv-b -ScriptBlock { hostname }方案取舍
| 方案 | 原理 | 取舍 |
|---|---|---|
| CredSSP | 把凭据转发到目标机 | 配置简单,目标机被攻破等于凭据泄露 |
| Kerberos 约束委派 | 限定服务与目标,按票证委派 | 更安全,配置较复杂 |
| 逐跳显式会话 | 客户端分别连接两台机器 | 安全,适合脚本编排 |
| 本地直接 UNC | 绕开第二跳 | 改动最小,需网络可达 |
双跳的报错和权限不足几乎一模一样,先确认「访问是不是从另一台机器发起的」,往往能省下大量无用权限排查时间。
CredSSP 需要在客户端与目标端两边分别启用并配对,任何一侧缺失都会失败;组策略环境下还要确认委派计算机列表没有被策略覆盖。