使用 PowerShell 会话进行 Kerberos 第二跳

使用 PowerShell 会话进行 Kerberos 第二跳

我经常使用 PowerShell 远程会话来远程管理 Windows 服务器,通常使用以下命令,但对于任何远程 powershell 命令,以下内容均适用,例如Invoke-Command

Enter-PSSession Server01

这对于该服务器本地的几乎所有内容都有效,但绝不允许您访问外部,例如:

PS C:\> Enter-PSSession Server01
[Server01]: PS C:\> Get-Item '\\Server02\Share\File'

get-item : Access is denied

进行这样的第二跳最简单、最安全的方法是什么?我有几个答案要补充,但它们通常都有警告。

答案1

使用Kerberos 约束委派为了让 Server01 能够向 Server02 验证您的身份:

Set-ADComputer 'Server02' -PrincipalsAllowedToDelegateToAccount (Get-ADComputer 'Server01')

以下是来自链接的 Microsoft 文档和我自己的一些优点/缺点:

优点

  • 凭证未被存储。
  • 单行设置。
  • 无限期地保持配置。
  • 一个清理命令:
    • Set-ADComputer -Identity 'Server02' -PrincipalsAllowedToDelegateToAccount $null
  • AD 管理员可以代表其他人进行配置。

缺点

  • 需要 Windows Server(和域级)2012 或更高版本。
  • 不支持 WinRM 的第二跳。
  • 需要权限才能更新 Active Directory 中的对象和服务主体名称 (SPN)。
  • 由于 AD 复制时间或 KDC 缓存,可能不会立即生效(参见链接)。
  • 始终适用于所有用户。

要查找现有委派(或您忘记删除的委派),请运行此命令以返回列表:

Get-ADComputer -Filter 'msDS-AllowedToActOnBehalfOfOtherIdentity -like "*"' -Properties msDS-AllowedToActOnBehalfOfOtherIdentity | Select Name,@{l='AllowedFrom';e={$_.'msDS-AllowedToActOnBehalfOfOtherIdentity'.Access.IdentityReference.Value}}

答案2

PSSessionConfiguration使用以下命令将凭证保存到对象:

Invoke-Command -ComputerName 'Server01' -ScriptBlock { 
  Register-PSSessionConfiguration -Name 'MyUser' -RunAsCredential 'MyDomain\MyUser'
}

然后使用该配置进行连接和跳转:

PS C:\> Enter-PSSession -ComputerName Server01 -ConfigurationName MyUser
[Server01] PS C:\> Get-Item '\\Server01\Share\File'

# Successful

优点:

  • 从技术上讲,只需一行即可设置
  • 完成后还可以用一行完全清理:
    • Invoke-Command -ComputerName Server01 -ScriptBlock {Unregister-PSSessionConfiguration 'MyUser'}
  • 凭证已加密

缺点:

  • 凭证以可逆格式存储在远程计算机上,并且可能被盗由具有管理员权限的人员执行。
  • 更改密码后,此配置将停止工作。(无论如何,您都不应该将凭证留在周围)
  • 设置新配置需要重新启动 WinRM 服务才能使用,这会结束所有现有会话。(这可以通过将标志添加-Force到 来自动完成Register-PSSessionConfiguration

答案3

通过远程变量传递凭证对象:

$cred = Get-Credential
Invoke-Command -ComputerName Server01 -Credential $cred -ScriptBlock {
    Invoke-Command -ComputerName Server02 -Credential $Using:cred -ScriptBlock {hostname}
}

优点:

  • 无需提前设置。
  • 远程服务器上未保存任何内容。

缺点:

  • $Using变量仅在 中可用Invoke-Command,而不在 PowerShell 会话中可用。
  • 需要带有标志的 cmdlet -credentialsCopy-Item没有,但是Start-BitsTransfer有,所以可能需要一些挖掘。

相关内容