在面向互联网的机器上启用 WinRM / PSRemoting 有多安全?

在面向互联网的机器上启用 WinRM / PSRemoting 有多安全?

让生产服务器的远程 Powershell(又名 PSRemoting)端点可从互联网访问有多安全?
我们不是银行,但服务器确实保存着敏感的公司数据。

我打算通过以下方式确保其安全:

  • 使用 IP 过滤仅接受来自我们自己的公共 IP 范围的连接,以便我们可以从网络的另一部分进行管理。
  • 让端点仅接受 SSL 连接
  • 仅允许有限数量的用户使用复杂密码(熵约为 150 位)进行连接
  • LanguageMode使用设置为 的PSSessionConfiguration NoLanguage,以便只能执行脚本
  • 要求所有以此方式执行的 Powershell 脚本都经过签名(Set-ExecutionPolicy RemoteSigned

另一方面:

  • 远程脚本将在本地管理员帐户下执行
  • 对其可以调用的 Cmdlet/Module 没有任何限制。
  • 我怀疑 WinRM 服务(使 PSRemoting 成为可能)足够安全,可以暴露在互联网上(Azure VM 默认具有此功能),但我没有证据证明这一点。

所以,我想我的问题是:这是“安全的”吗,或者是否存在我遗漏的攻击媒介?

顺便说一句,我的大部分信息都来自免费电子书Powershell 远程处理的秘密

答案1

一般来说,你应该绝不向生产服务器开放来自互联网的任何内容,除非这是您希望公众使用的服务。如果该机器是 Web 服务器,则只应向其开放端口 80。如果没有通过防火墙向其开放其他端口,则攻击者无法进入。

VPN 是最好的解决方案,它要求用户进行身份验证,然后仅从里面。VPN 比任何其他方法都更加灵活和安全。

答案2

有几件事可能会有帮助:

  1. 将您的客户添加到可信主机列表。

    Set-Item wsman:\localhost\Client\TrustedHosts -Value Server01.Domain01.Fabrikam.com
    
  2. 创建一个日志扫描脚本,从日志中提取不良 IP,并创建防火墙规则来阻止这些 IP。(请原谅我的 PS 写作技巧 :-))

    获取活动日志中列出不良 IP 的文件内容。我创建了一个脚本,用于扫描我的专有网络日志文件,并发现客户端正在探测我的网络服务器,因此我将他们的 IP 放入 badips.txt 文件中。

    $ips = get-content c:\powershell\utilities\badips.txt
    

    现在我创建了防火墙规则来阻止不良 IP 地址

    foreach ($i in $ips){
    [string]$rulename = "disallow-" + $i
    [string]$remoteip = $i + "/32"
    [string]$description = $i
    

    获取已有阻止规则的不良 IP 列表

    $processed = get-content c:\powershell\utilities\processedips.txt
    

    检查列表以查看 IP 是否已被阻止

    $count = ($processed|select-string $i).count
    

    如果这是一个新的 IP 地址,则创建防火墙规则并将 IP 添加到已处理的列表文本文件中

    if ($count -lt 1){
    invoke-expression ("netsh advfirewall firewall add rule name=" + $rulename + " action=block enable=yes
    localip=any dir=in profile=public remoteip=" + $remoteip + " description=" + $description)
    $i|add-content c:\powershell\utilities\processedips.txt
    }}
    

这并没有真正回答您关于您的服务器将受到多大保护的问题,但却为您提供了另外两个项目来限制潜在的威胁。

答案3

风险在于向外部用户(域外的用户)开放 PS 远程处理。PS 远程处理要求创建或进入 PS 会话以执行远程活动(运行脚本等)的任何人都属于具有明确访问权限的 AD 组。一般用户和外部用户(域外的用户)无法通过 PS 远程访问您的计算机。

相关内容