PowerShell:远程管理中的多跳问题之CredSSP详解
前言
在我的博客PowerShell: 远程管理除了知道Invoke-Command,还应该掌握Enter-PSSession这个命令_码农杰克-CSDN博客
种曾经提到执行使用PowerShell执行远程操作的时候有多种认证方式,其中之一就是CredSSP (Credential Security Support Provider) 。今天就来详细的聊一聊如何使用这个CredSSP。至于具体原因为啥要使用CredSSP,在这里不再赘述,请移步 PowerShell: 远程管理除了知道Invoke-Command,还应该掌握Enter-PSSession这个命令_码农杰克-CSDN博客
CredSSP概述
CredSSP主要是用来解决在Windows下远程资源访问的认证问题。所以敲黑板划重点了,CredSSP只适用于Windows平台,并且只是在访问远程资源的过程中才需要使用。那既然是访问远程资源那么聪明的你一定想到了,肯定就会有Server端和Client端。
CredSSP Client端
何为CredSSP的Client端?简言之就是你当前正在执行PowerShell命令的机器或者说你打开PowerShell窗口执行PowerShell命令的机器。当然这么说有点狭隘,有时候可能你并没有打开PowerShell窗口。比如使用一个后台任务运行某段PowerShell脚本,然后在这个脚本里面去访问了远程资源。
所以换句话说,CredSSP的Client端(客户端)就是你发起远程资源访问请求的那台机器,也就是你从那台机器发起远程访问,那么这台机器或者终端就可以看作是CredSSP的Client端。
CredSSP Server端
上一节说到了Client端,那么对应的,被访问的那台机器或者终端对应的就是CredSSP的Server端也就是服务器端。这里拿我们的Web应用来打比方就很好理解了,承载web应用的为服务器端,而我们浏览器所在的机器都可以是客户端。其实在CredSSP中,server端也叫delegate server,后面会详细讲到这个概念。
CredSSP 前因后果
那么Server端和Client端是不是就是CredSSP的全部呢?其实不然。如果只有Server端和Client端,我们还不需要使用CredSSP。其实在CredSSP中还涉及到第三个角色,正是这个角色才引入了CredSSP。
如果只有Client和Server两端,是不需要CredSSP也能实现我们平时所需的大部分功能的。如下图所示:
但是,如果我们在Server A上起了一个PowerShell 然后去Server B上执行一段脚本,然后再段脚本中又去访问的Server C的资源,这时候普通的认证就无法满足我们的需求了。如下图所示:
为啥会出现这种情况呢?因为在Windows里面,默认情况下在Server B上再执行Server A给的远程脚本访问Server C的资源的时候会把Server A传送给Server B的认证上下文全部清掉。那么对Server C上来说,Server B只是发起了一个匿名访问的请求。所以在Server B上访问任何Server C上需要认证的资源的都是Access Denied。
这个并不是PowerShell独有的问题,相信以前做过Windows下的Web程序或者其它类似情况的童鞋都遇到这样的问题。也就是经典的Double-Hop问题。
下面这张图来自网络,描述的就是典型的Double Hop问题,相信曾经困扰过不少同学。
好了至于web 应用如果解决Double Hop问题就不在这里讨论。有兴趣的童鞋可以自己研究一下下:)
配置CredSSP
那我们接下来看看PowerShell是如何解决这个问题的。---当然就是CredSSP。
为了解决Double-Hop的问题,有以下的步骤:
- 在Server A(也就是Client)上设置激活CredSSP Client, 并设置Target CredSSP Server
- 在Server B(也就是 Server 或者Delegate Server)上设置激活 CredSSP Server
- 在建立Server A->B的链接时告诉PowerShell使用CredSSP认证
然后再通过Server A在Server B上发起向Server C的资源请求时就不会再有Access Denied或者Unauthorized的问题了。
具体细节如下:
1. 客户端激活CredSSP
使用Enable-WSManCredSSP命令激活客户端,在激活客户端CredSSP是需要指定服务端是谁。
Enable-WSManCredSSP
[[-DelegateComputer] ]
[-Force]
[-Role]
[]
使用举例:
指定单台服务端服务器
Enable-WSManCredSSP -Role "Client" -DelegateComputer "Server02.fabrikam.com"cfg : http://schemas.microsoft.com/wbem/wsman/1/config/client/authlang : en-USBasic: trueDigest : trueKerberos : trueNegotiate : trueCertificate : trueCredSSP : true
这里的“Server02.fabrikam.com”就是我们图里面的Server B,可以是一台也可以是多台
-Role “Client” 表示当前机器是客户端也就是我们图里面的 Server A。
指定多台服务器为服务端
$servers = "server02.fabrikam.com", "server03.fabrikam.com", "server04.fabrikam.com"Enable-WSManCredSSP -Role "Client" -DelegateComputer $serverscfg : http://schemas.microsoft.com/wbem/wsman/1/config/client/authlang : en-USBasic: trueDigest : trueKerberos : trueNegotiate : trueCertificate : trueCredSSP : true
除了使用具体的机器名还可以使用通配符*来指定
指定"fabrikam.com"域下面的所有机器都可为服务端
Enable-WSManCredSSP -Role "Client" -DelegateComputer "*.fabrikam.com"cfg : http://schemas.microsoft.com/wbem/wsman/1/config/client/authlang : en-USBasic: trueDigest : trueKerberos : trueNegotiate : trueCertificate : trueCredSSP : true
指定任何机器可为服务端
Enable-WSManCredSSP -Role "Client" -DelegateComputer "*"cfg : http://schemas.microsoft.com/wbem/wsman/1/config/client/authlang : en-USBasic: trueDigest : trueKerberos : trueNegotiate : trueCertificate : trueCredSSP : true
2. 服务端激活CredSSP
服务端设置相对来讲比较简单,也是使用Enable-WSManCredSSP命令。
Enable-WSManCredSSP -Role "Server"
这个命令表示说把当前的服务器作为服务端或者代理端使用也就是Server B,可以把Server A传给他的认证信息代理给其它Server C。
3. 指定CredSSP 认证方式
现在 Client端和Server端都已经配置好那么接下来就是使用了。常见的两个远程操作命令都可以使用CredSSP的认证方式。
Enter-PSSession -ComputerName ServerB -Credential (Get-Credential) -Authentication Credssp
$parameters = @{ ComputerName = 'ServerB' ScriptBlock = { Get-Item \\Net03\Scripts\LogFiles.ps1 } Authentication = "CredSSP" Credential = "Domain01\Admin01"}Invoke-Command @parameters
到这里CredSSP的详细使用就告一段落了。那么问题来了,是不是Server A上只能激活Client而 Server B上只能激活Server端呢?
其实不是的,既然Server A可以向Server B发起请求,同样的Server B也可以向Server A发起请求。所以在同一台服务器上既可以设置他为Client端也可以设置他作为服务端或者代理端来使用。
4. 查看CredSSP设置
PowerShell中使用Get-WSManCredSSP来查看当前Server的CredSSP设置。
Get-WSManCredSSP
5. 关闭CredSSP设置
如果我们不想一直开着CredSSP设置,那么可以使用Disable-WSManCredSSP来关闭他。
关闭服务端
Disable-WSManCredSSP -Role Server
关闭客户端
Disable-WSManCredSSP -Role Client
常见问题诊断
1. 没有权限
不管是 Enable-WSManCredSSP还是Get-WSManCredSSP都需要管理员权限,所以请使用“Run as Administrator” 或者 “以管理员身份运行”。
2. 相关服务没有运行
CredSSP依赖于WS-Management服务,所以确保这个服务已经运行。如果没有运行也没关系,使用下面的命令快速的设置。
winrm quickconfig
总结
本文介绍了CredSSP的使用场景,CredSSP中涉及到的各个服务器的角色,以及CredSSP的使用步骤和常见问题诊断。
我是码农杰克欢迎大家来交流共同学习! 最后祝女神们节日快乐。