代码改变世界

PowerShell 2.0远程管理开发使用CredSSP处理多跳授权

2010-12-15 01:39 by @天行健中国元素, ... 阅读, ... 评论, 收藏, 编辑

在本文中中将会介绍如何使用CredSSP解决PowerShell远程管理中多跳(Multi-hop)授权的问题。本质上来讲,CredSSP和多跳支持本身并不是PowerShell 2.0或PowerShell远程管理的特性。凭据安全服务提供者(CredSSP,Credential Security Service Provider)是全新的安全服务提供者,用于将用户凭据委派到应用程序中,以实现从客户端到目标服务器的认证。Windows 远程管理(WinRM,Windows Remote Management)支持的多跳(Multi-hop)使用CredSSP实现认证。从PowerShell 2.0开始,远程管理是构建于WinRM的,所以可以使用CredSSP实现多跳授权。

1 多跳授权概述

首先来看一下什么是多跳授权,如下图1所示的三台主机,主机A(客户端Client)与主机B(服务器Server)之间通过通过远程线程建立连接,并通过主机B,尝试在文件服务器C上创建文件。

接下来在连接到主机B的远程线程上执行如下所示命令,在主机C上创建文件test.txt,执行时的效果如下图2所示:

Invoke-Command -ComputerName Test-PC.SP2010lab.com -credential SP2010LAB\Administrator -ScriptBlock {[System.IO.File]::Create(\\FileServer\Share\Test.txt)}

在上图中能够看到执行结果是“访问被拒绝(Access Denied)”,命令是从远程线程尝试访问文件共享时出错的,由于使用的是主机A访问主机B时使用的主机B的凭据,而不是主机B访问文件服务器主机C时使用的凭据。所以可以推测如果能有方法从客户端主机A传递或委派可访问文件服务器主机C的凭据就能成功创建目标文件,这就是为何称之为多跳授权以及PowerShell远程管理通过CredSSP实现多跳授权,下面就引入委派凭据的概念:

2 委派凭据

用于创建远程线程的cmdlet——Invoke-Command,Enter-PSSession和New-PSSession都有一个-Authentication参数用于将授权模式指定为CredSSP。而在使用这个参数之前,需要首先在参与多跳授权的多台主机上启用CredSSP,而在启用CredSSP之前需要指定角色——Client或者Server——当然Client是远程线程初始化的主机,也就是这里的主机A;Server是多跳授权触发的主机,相当于跳板,也就是这里的主机B。

PowerShell 2.0提供了如下的cmdlet用于管理CredSSP授权:

1. Enable-WSManCredSSP

2. Disable-WSManCredSSP

3. Get-WSManCredSSP

下面介绍如何启用WSManCredSSP并且指定Client/Server角色。首先启用主机A上的CredSSP:

Enable-WSManCredSSP -Role Client -DelegateComputer "*.SP2010lab.com"

这里用Enable-WSManCredSSP cmdlet启用了CredSSP认证并且指定主机角色为Client,与此同时还是用-DelegateComputer参数指定从Client接受委派凭据的单台或多台服务器。上面的DelegateComputer参数接受通配符描述,指定所有在*.SP2010lab.com域中的主机都可作为接受委派凭据的主机,其中的*代表该网络域中所有主机,当然也可以只指定单台主机。

当Enable-WSManCredSSP cmdlet用于在-role参数指定的客户端上启用CredSSP。这个cmdlet主要执行了以下操作:

1. WS-Management设置\Client\Auth\CredSSP被设置为true。

2. 在客户端上设置Windows CredSSP策略AllowFreshCredentials为WSMan/Delegate。

接下来在主机B上启用CredSSP,并将其角色设置为Server,具体操作如下:

Enable-WSManCredSSP –Role Server

上面的cmdlet启用主机B上的CredSSP,并将WS-Management设置\Service\Auth\CredSSP设为true。接下来就可以实现前面计划的功能了,只是需要指定授权类型参数-Authentication以及凭据参数-Credential,具体命令如下所示:

Invoke-Command -ComputerName test-pc.SP2010lab.com -Credential SP2010Lab\Administrator -Authentication CredSSP -ScriptBlock {[System.IO.File]::Create(\\FileServer\Share\Test.txt)}

执行结果如上图3所示,能够看到Create()方法的输出显示了新创建文件的相关信息。

【提示】

CredSSP授权从本地主机委派用户凭据到远程主机,该操作可能会增加远程操作的风险,因为如果远程主机收到了委派凭据,该凭据可能会被用于控制该网络线程,所以使用时请务必请确认远程主机时安全的,且该主机的的权限不被滥用。

在使用完毕CredSSP授权后,请务必使用Disable-WSManCredSSP禁用Client和Server端的CredSSP授权,命令如下所示:

Disable-WSManCredSSP –Role Client

Disable-WSManCredSSP –Role Server

随后还可以使用Get-WSManCredSSP cmdlet校验CredSSP是否被启用,以及角色Role是Client还是Server

3 总结

当需要在远程线程中访问或向第二台主机授权时,凭据委派是必须的。尤其是在SharePoint 2010中的cmdlet,每个cmdlet需要从多个不同的主机中收集数据,而且很多时候各个主机间的认证信息可能都不一样,此时就需要使用CredSSP授权来委派凭据。通过委派凭据,指定范围内的主机均可继承授权访问目标主机,达到授权传递的目的。

 

赛迪网地址:http://tech.ccidnet.com/art/302/20100706/2107055_1.html

作者: 付海军
出处:http://fuhj02.cnblogs.com
版权:本文版权归作者和博客园共有
转载:欢迎转载,为了保存作者的创作热情,请按要求【转载】,谢谢
要求:未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任
个人网站: http://txj.shell.tor.hu/