深度理解所有的Powershell远程连接方式

PowerShell Remoting(PSRemoting)是所有PowerShell中最常用的功能之一。为什么?因为它实在是太有用了!使用一条命令,你可以无缝地连接到一台或数千台远程计算机并执行命令。

在这个终极指南中,你将深入了解PSRemoting。你将了解它是什么,它是如何工作的,以及使PSRemoting工作的所有各种技术。本指南将不仅包括如何使用PSRemoting,还伴有很多大量的参考资料。

PSRemoting 如何工作的

简而言之,PSRemoting允许你在远程计算机上运行命令,就像你坐在它们前面一样。PSRemoting提供了一套功能,可以连接和验证一个用户用户,运行远程命令,并将该命令的任何输出返回到本地计算机。

想想看,PSRemoting就像telnet或SSH,甚至psexec。它只是一种在PowerShell中的计算机上运行命令的方法。

PSRemoting在很大程度上依赖于一个叫做session(会话)的概念。session是一个术语,用来描述一个在命令行中运行命令的远程Shell。创建这些session的过程在后台要经过许多步骤。

当你启动一个PSRemoting会话时,会有以下几个步骤:

  • 客户端试图连接到目标服务器的WinRM监听器上时(下面有更多关于WinRm监听器的介绍)。WinRM监听器就是一个运行在目标服务器上的微型网络服务。WinRM是微软称之为WSMan的标准的实现。WSMan是当时与许多其他大型科技公司一起创建的开放标准,如戴尔、英特尔和Sun Microsystems(已被甲骨文收购)。
  • 当客户端通过HTTP或HTTPS协议连接到监听器时,认证过程开始。每种认证方法的所有细节将在后面介绍,但现在只需知道客户端需要以某种方式向服务器传递凭证。
  • 在客户端连接并认证到服务器后,PSRemoting创建一个会话。
  • 一旦PSRemoting创建了会话,它就可以开始工作了。在这一时刻,客户端可以开始向服务器发送信息,而服务器会返回任何必要的输出,这被称为序列化。这种通信通常是加密的。

Creating a PSSession with PSRemoting
PSRemoting创建远程会话过程

WinRM 监听器: 有哪些可用的连接

当客户端想从网络上接入时,就需要产生连接。客户端需要与另一侧 “linstening(监听) “端展开 “talk(对话)”;这种 “linstening “就是WinRM监听器的作用。

你可以通过使用下面的winrm命令发现在任何Windows计算机上运行的所有WinRm监听器。

winrm e winrm/config/listener
WinRm listeners
WinRm listeners

WinRm监听器有几个重要的组成部分,它们包括:

  • 监听地址 – 监听地址是它们绑定的IP地址,用于客户端连接的IP地址。
  • 传输的类型 – 每个WinRM监听器都需要一种方式与客户端进行通信;它们通过使用HTTP或HTTPS的传输来实现。
  • 一个可选的证书拇指指纹 – 当WinRM监听器使用HTTPS传输时,它必须知道用什么私钥来验证客户端;这个密钥可在证书拇指指纹找到。

尽可能使用HTTPS监听。设置HTTPS传输可以确保服务器的有效性,并对认证和传输流量进行加密,从而提高安全性。在签发证书时,尽可能使用来自认证机构的可信证书,而不是自签名的证书e

受信主机: 验证一个服务器

PSRemoting如何通过WinRM认证的?

如上所述,PSRemoting所经历的第一个步骤是认证。认证是PSRemoting中最复杂但又最重要的部分之一。

当PSRemoting刚推出时,它只有一个认证机制,即Windows远程管理(WinRM),但现在,你也可以使用SSH进行认证,你将在后面看到。

WinRM支持两种截然不同的认证类型;一个用户名和密码,或者一个带有各种类型认证的用户名/密码组合的证书。

基本认证

从最简单,但最不安全的认证类型开始,就是基本认证。这种类型的认证是HTTP协议中的一个标准。基本认证从客户端向监听器发送HTTP头中的用户名和密码的base64编码副本。

由于基本认证只对用户名和密码进行编码,而不对其进行加密,因此在网络上拦截凭证是很容易的。

除非你绝对需要,否则不要使用Basic认证。有许多其他更安全的方法,可以进行WinRM身份验证!

Kerberos 认证

你的客户和服务器都在一个活动目录环境中吗?如果是,你可以在许多网络服务中使用了Kerberos认证。

当WinRM客户端试图通过Kerberos连接到WinRM监听口时:

  • 服务器首先尝试从域控制器中为客户检索一个会话密钥(session key)或票据(ticket-granting-ticket)。
  • 域控制器查找客户和服务器,如果两者都是有效和受信任的,它就会发出令牌(Token)。
  • 然后,服务器使用可信令牌而不是用户名和密码来验证客户的连接。

在Kerberos认证过程中,域控制器在票据检索步骤中同时验证客户和服务器,以阻止恶意的人冒充服务器

Kerberos是一种成熟和安全的认证方法,当客户端和服务器都是活动目录域的成员时,它是默认的认证类型。但是,它确实需要客户和服务器都加入到同一个活动目录林(Active Directory forest)中,或者在林之间建立信任。

Related:Repairing Active Directory Trust Relationships for Good

协商认证

WinRm也可以尝试使用Kerberos,如果无法使用,则尝试使用名为NT Lan Manager(NTLM)的认证协议。

当使用 NTLM时:

  • 服务器向客户端发送一个字符串
  • 然后,客户端用用户密码的哈希值对该字符串进行加密。
  • 加密后的字符串被送回服务器,服务器将用户名、原始字符串和加密后的字符串发送给域控制器。
  • 然后,域控制器查找该用户的密码哈希值,并对该字符串重复相同的加密过程,以确保其匹配。

NTLM很适合验证客户端,但与Kerberos不同,它不会去验证服务器。它容易受到多种攻击,服务器可能被攻击者冒充。

你可以通过用服务器认证证书验证服务器并将其分配给HTTPS WinRM监听器来提高NTLM安全性。在这种设置中,客户端用NTLM对域控制器进行验证,而服务器则用可信的证书进行验证。虽然这种设置提供了客户端和服务器的认证,但NLTM协议使用的是一种旧的加密密码,密钥大小已经过时。

由于这些原因,只有当你把服务器添加到受信任的主机列表中或使用HTTPS监听器时,NLTM才是可用的。

摘要认证

在WinRM中使用的最不常见的认证方法之一是摘要认证( Digest authentication)。NTLM和Digest是类似的认证方法。和NTLM一样,Digest生成一个独特的字符串,用用户密码的哈希值进行加密。这样,密码就不需要被发送到服务器上了。

Digest使用MD5散列算法对密码进行加密。由于这种算法的特性,摘要认证通常被认为是过时的,不应该被使用。MD5有各种已知的漏洞,使其不适合用于密码学。

凭证安全支持供应商 (CredSSP)

尽管我们可以深入了解CredSSP的来龙去脉,但这是没有必要的。为什么呢?因为当涉及到PSRemoting和WinRM时,CredSSP的实现通常有一个原因,即 “第二跳问题”,你会在下面了解到。

当配置为CredSSP认证时,WinRM客户端和服务器都使用协商认证来认证用户和客户端。但一旦完成,用户的密码就会被发送到服务器上。

因为密码是在认证过程完成后发送的,所以现在是加密的。CredSSP还用TLS会话密钥对密码进行加密,这样加密后的字符串在不同的会话中是唯一的。

CredSSP很有帮助,因为在认证之后,服务器就可以代表你连接到其他任何东西。然而,当这种情况发生时,你是完全信任你用用户密码连接的服务器。

基于证书的认证

可以说,在PSRemoting中使用的最安全的认证方法是基于证书的认证。在这种认证方法中,典型的密钥交换发生在客户端的私钥和公钥上,而服务器则验证证书。

WinRM通过在WinRm中映射服务器上的用户来验证用户。在认证过程中,唯一传递的是公钥,所以这是一种非常安全的认证方式。

尽管是最安全的,但基于证书的认证并不太常见。为什么呢?仅仅是因为设置它所需的工作,你必须完成这些:

  • 建立一个证书颁发机构
  • 创建一个用户认证证书
  • 分发公钥
  • 使用具有适当权限的本地用户账户(可能是Administrators组)。
  • 设置一个HTTPS监听器
  • Set up an HTTPS listener
  • …以及其他步骤。

即使客户机和服务器都是活动目录的一部分,你也不能使用域用户来进行证书认证。

Windows操作系统认证的默认值

现在你已经看到有许多不同的认证选项,你怎么知道哪些是开箱即用的?下面你会看到一个表格,其中有两列表明WinRM客户端在默认情况下是否启用,以及该特定认证类型是否默认启用。

上述所有的认证类型都是可以配置的,但是使用下面的表格可以让你很好地了解你需要自己配置的内容。

方式客户端服务端
基本开启关闭
Kerberos开启开启
协商开启开启
CredSSP关闭关闭
摘要开启关闭
证书开启关闭

第二跳或双跳问题

PSRemoting的一个最大的问题被称为 “第二跳问题 “或 “双跳”。这种情况发生在你通过PSRemoting连接到一个远程系统,然后你需要连接到另一个远程计算机。

这种情况是有问题的,因为当WinRm客户端对第一台远程计算机进行认证时,服务器只验证发端客户端的身份,而不向服务器发送密码。当你试图从第一个连接的服务器连接到第二台计算机时,最后的服务器没有任何方法来验证用户的身份。

你可以通过使用CredSSP或Kerberos委托的几种不同方式来解决双跳问题。

用 CredSSP

绕过双跳问题的最常见方法是使用CredSSP。CredSSP认证通过在第一台远程服务器上存储一个用户凭证来解决这种情况,然后由服务器转为客户端可以将其传递给第二台远程服务器。

但是,使用CredSSP有一个问题。存储在第一台远程服务器上的用户凭证可能是以纯文本形式存储的,因此引入了一个明显的安全问题。在较新的操作系统中,密码的哈希值和Kerberos票证(TGT),这些可以一起使用,作为网络上任何地方的用户进行认证,就像一个纯文本密码一样,但它确实降低了一点风险。

使用协商Negotiate,客户和服务器来回传递信息以验证他们所说的人,但用户的密码永远无法访问。由于这一安全特性,当你连接到第二台服务器时,第一台服务器不可能对你进行验证。

使用 Kerberos 委派

如前所述,Kerberos是设置PSRemoting的一种常见方式。作为无处不在的活动目录的一部分,并且在默认情况下已经设置好了,它是非常普遍的。尽管就其本身而言,Kerberos是一种验证WinRM的好方法,但它并没有解决双跳的问题。

为了解决双跳的问题,你可以使用第二种认证方式,即Kerberos Delegation(委派)。尽管Kerberos授权有很多种类,但唯一能够(并且足够安全)替代CredSSP的种类被称为Kerberos限制性授权,更确切地说,是基于资源的Kerberos限制性授权。

基于资源的Kerberos限制性委托是一种基于域资源的Kerberos认证令牌的委托形式,比如计算机,在这种情况下,它被限制在Kerberos(活动目录)对象的特定列表中。

要配置这种Kerberos委派,你需要编辑链中第三台计算机的ADComputer对象。例如,如果你要从客户端A到服务器B再到服务器C的远程,你必须编辑服务器C的ADComputer对象,但你也需要知道服务器B将是什么。对于这个例子,在PowerShell中运行以下命令:

设置基于资源的Kerberos限制性授权是一个使用Set-ADComputer的单行PowerShell命令。例如,如果你通过PSRemoting从ClientA连接到ServerB,并想通过…. 连接到ServerC,你可以通过运行下面的PowerShell命令实现。

Set-ADComputer -Identity ServerC -PrincipalsAllowedToDelegateToAccount ServerB

WinRm对失败的连接进行了15分钟的缓存。由于这个特性,即使在设置了基于资源的 Kerberos 限制性授权之后,你也可能无法连接到第三台计算机。要补救的话,可以等待或在第三台计算机上运行 klist purge -LI 0x3e7 命令来清除失败的 Kerberos 令牌。

如何通过SSH进行 PSRemoting 认证

虽然WinRm认证是PSRemoting最常用的认证方法,但从PowerShell v6开始,你还有另一种方法;SSH。使用SSH作为认证方法可以让你在Linux下使用PSRemoting。

与WinRm不同,SSH需要在客户端和服务器上进行一些额外的配置,例如在Windows客户端上设置一个SSH客户端,以及在服务器上设置一个SSH …

使用SSH来处理认证意味着你被限制在SSH支持的认证类型上。这就缩小了列表的范围,主要的两种是基于密码和基于公钥的。

SSH还支持其他类型的认证,但它们通常被认为不如基于密码和公钥的选项安全,所以我们将只关注这两种。

密码认证

用PSRemoting设置SSH认证的最简单方法是使用基于密码的认证。基于密码的认证允许你提供一个密码来验证自己。

在SSH认证过程中,密码是在SSH连接建立后交换的,密码在传输过程中是加密的。与WinRM使用的一些验证方法不同,如Kerberos,这种验证方法确实将整个密码发送到服务器上。

你可以将SSH密码认证与WinRM认证方法基本使用HTTPS监听器进行比较。密码本身不受任何有意义的保护,但整个连接,包括密码,都是基于加密的,而且服务器是基于证书验证的。

基于证书的认证

虽然基于密码的认证很容易设置,使用起来也很直接,但它有两个问题。

  1. 首先是没有办法以无人值守的形式安全地进行认证
  2. 密码认证仍然在网络上发送一个密码。虽然密码在SSH连接中是加密的,但服务器会收到整个密码。如果服务器以某种方式被破坏,这可能成为一个安全问题。

另一方面,基于证书的认证不会在网络上发送任何敏感数据,如密码。相反,服务器有一个公钥的副本,客户有一个私钥的副本,协商在服务器上进行。

一个粗略的工作流程如下:

  1. 当客户端试图进行认证时,它向服务器发送公钥的ID或拇指指纹。
  2. 如果服务器有列出授权的公钥,它就会回应一个用公钥加密的字符串。
  3. 然后,客户端用私钥解密该字符串。
  4. 然后,私钥与一个会话ID进行散列。
  5. 会话ID被送回服务器,然后服务器将其与使用原始字符串和会话ID生成的哈希值进行比较。
  6. 如果来自客户端的会话ID哈希值与服务器上的会话ID相匹配,则客户端通过认证并被允许连接。

任何用公钥加密的东西只能用相关的私钥来解密。任何用私钥加密的东西只能用公钥解密。会话ID也被扔进去,以提供所谓的完美前向保密(PFS)。

PFS提供了安全性,如果私钥被破坏,攻击者将无法解密所有来回的信息。唯一的会话ID意味着用于加密通信的共享秘密对每个会话都是不同的。

基于证书的SSH认证,如WinRm,确实需要额外的努力来设置,如生成私人/公共密钥支付和授权远程服务器的公共密钥。

连接所需的用户权限

默认情况下,两个本地用户组可以使用PSRemoting远程连接到服务器;管理员和远程管理用户。

虽然你可以直接将用户账户添加到远程服务器上的本地Administrators组,但你应该始终提供最少的访问权限。如果一个用户只是需要用PSRemoting连接到远程计算机,可以把用户账户添加到远程管理用户组,而不是管理员。

为了进一步控制PSRemoting的访问,你还可以使用一个叫做 “足够管理”(JEA)的功能。JEA允许非管理员用户在PowerShell的受限语言模式下仅以管理员身份运行特定命令。

远程的 隐形 与 显性

如果你以前使用过PSRemoting,你可能对Invoke-Command、New-PSSession、Enter-PSSession等命令比较熟悉。当你运行这些命令时,很明显你正在以某种方式连接到一台远程计算机。你在明确地使用PSRemoting。

当你运行PSRemoting特定的命令时,你是显性地运行这些命令,但你知道还有另一种方法吗?你可以通过使用隐性PSRemoting来利用PSRemoting,而不是直接调用Invoke-Command和其他cmdlet。

隐式PSRemoting看起来像是在你的PowerShell会话中本地运行的命令,但实际上它们是在远程机器上运行的。这方面的一个很好的例子是使用一个没有安装在你的系统上的模块。你可以从PSSession中导出命令,而不是在本地安装,这将允许你像在本地安装一样运行它们。

在下面的截图中,你可以看到,我没有Test-PendingReboot命令。然后我连接到一个远程机器并导出该命令。

深度理解所有的Powershell远程连接方式

接下来如果该模块被导入,我就可以执行Test-PendingReboot命令。如下图所示,但你会注意到,它显示输出中的计算机名称不是PowerShell运行的设备名称,而是该命令导入的设备。

深度理解所有的Powershell远程连接方式

文章来源:https://www.cnaaa.net,转载请注明出处:https://www.cnaaa.net/archives/7288

(0)
郭靖的头像郭靖
上一篇 2023年2月18日 下午4:21
下一篇 2023年2月20日 下午5:05

相关推荐

  • Win10共享文件夹无法访问怎么办

    无论是学习还是工作我们都会去设置共享文件来使用,不过难免也会遇到无法打开或者使用共性文件夹的情况,而这一般是系统设置出现问题,而以下是小编所带来几种解决win10不能共享文件夹的解决方法,一起来看看吧。   Win10无法打开共享文件的解决方法   方法一   1. 首先在Windows10电脑上按下Win+R组合键,打开运行窗口,输入命令services.…

    2024年6月11日
    29600
  • Windows环境powershell 运维之历史文件压缩清理

    一、Power Shell概述1.1 Windows Power Shell简介Windows PowerShell 是微软发布的一种命令行外壳程序和脚本环境,使命令行用户和脚本编写者可以利用 .NET Framework的强大功能。 引入了许多非常有用的新概念,从而进一步扩展了在 Windows 命令提示符和 Windows Script Host 环境中…

    2023年12月29日
    30800
  • Win系统C盘拒绝访问或打不开怎么办

    在使用Win系统的时候,有用户可能会遇到C盘拒绝访问或者无法打开的情况,因此可能会感到困惑和无助。而这通常是由于权限设置问题或者其他系统错误导致的。不过,不必过于担心,因为这种情况通常可以通过一些简单的步骤来解决,一起来看看吧。   C盘拒绝访问或打不开的解决方法   方法一:运行杀毒软件   使用受信任的杀毒软件扫描和清除病毒。你可以通过下载专业杀毒软件并…

    2024年6月13日
    25700
  • 如何清理windows server 2008 R2 中winsxs文件夹

    最近发现公司的一台服务器C盘只剩5G左右的空间,经过仔细查看发现C:\windows\winsxs 目录占了20多G的容量。此文件夹是更新系统补丁产生的不能直接删除,所以只能通过cleanmgr.exe工具进行清理C盘。 以下方法亲自验证清理成功: 一、在Windows Server 2008 R2,右击C盘,查看属性,发现界面中没有清理C盘的工具按钮,那如…

    2023年4月3日
    42300
  • 宝塔一键下载安装失败解决方法

    今天使用国内云服务器部署lnmp环境,发现下载安装宝塔失败 报连接超时错误,使用ping 测试也ping不通,不排除禁止ping可能性, 云服务器国内地区的用户,可以尝试执行下面的命令,指定节点解决此问题, https://www.bt.cn/bbs/thread-87257-1-1.html 宝塔论坛上的解决方式 windows面板的操作方式如下:win的…

    2023年11月3日
    45100

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

评论列表(1条)

在线咨询: QQ交谈

邮件:712342017@qq.com

工作时间:周一至周五,8:30-17:30,节假日休息

关注微信