使用Session Manager Plugin插件在开发者本机创建本地转发功能用于登录位于私有子网的EC2 Windows RDP远程桌面

摘要:本文介绍了如何不需要将EC2 Windows的3389端口暴露在互联网上,而是通过System Manager转发3389端口到开发者本机的方法。EC2 Windows可以一直位于内网,其安全组也无须放行任何端口,即可实现安全管理。

一、背景

1、需求

很多场景下需要使用GUI环境对云上系统做调试,包括但不限于一些数据库图形管理工具等。这时候,使用一台Windows系统的Workspaces云桌面就很方便做远程管理。如果对云桌面不熟悉,或者因为一些需要自定义操作系统的原因,需要使用普通的Windows系统,此时使用Windows的EC2的RDP远程桌面服务是比较普遍的做法。

在云上部署EC2 Windows使用RDP远程桌面还需要考虑一系列安全问题:

  • 如果将EC2 Windows直接部署在Public Subnet公有子网,那么会收到来自互联网攻击的威胁
  • 一些办公地点没有固定的网络出口IP,包括在家和在出差中,客户端IP地址频繁变化,因此在EC2上很难用固定IP填写到安全规则组,每次修改安全规则组的信任IP地址管理麻烦
  • 如果EC2 Windows部署在私有子网,那么由于没有独立的外网入口,还需要继续配置NLB等转发手段,也是比较麻烦。

由此,本文的方案就派上了用场,即使用Session Manager Plugin插件在开发者本机创建本地转发功能用于登录位于私有子网的EC2 Windows RDP远程桌面。

2、架构设计

为了安全考虑,我们将EC2 Windows创建在私有子网。公有子网中放置一个NAT Gateway,这样EC2 Windows去往外部的流量就可以正常抵达Internet了。

注意这一点很重要。如果EC2 Windows无法访问外部网络,例如在Windows桌面上登录bing.com打不开搜索界面,也就是本机的路由表无法通过NAT Gateway抵达互联网,那么Session Manager功能就无法正常工作了。像这种完全内部隔离的网络环境,还需要搭配Session Manager VPC Endpoint才能工作。由于配置步骤多,因此本文就先不考虑这个场景了。本文假设的场景就是在Public Subnet有NAT Gateway作为出口,因此在Private Subnet的Windows可以正常访问外部网络。

整体网络架构如下图。

在这个网络环境下,位于EC2 Windows上的Session Manager会负责建立会话和转发,而不需要在安全规则组上暴露3389端口,由此实现了安全登录Windows RDP远程桌面服务。

现在开始做配置。

二、配置Session Manager和Plugin

1、创建EC2 Windows时候选择私有子网

创建一台使用Windows Server 2022 Base系统的EC2。这个AMI来自官网自带的镜像列表。如下截图。

机型配置上,建议最小选t3.medium,即2vCPU/4GB,这样内存可以允许运行较大的图形程序。请不要选择上一代t2机型。

在创建EC2时候,请点击网络设置的编辑Edit按钮,手工指定Private Subnet私有子网。这里如果不指定的话,那么这台EC2是随机选择子网,很有可能位于公有子网。如此在安全性上就与本文的设计不符了。如下截图。

在点击编辑Edit按钮后,通过下拉框可选择私有子网Private Subnet。如下截图。

在接下来的设置安全组界面,创建EC2向导推荐的是允许任意互联网地址访问3389端口的RDP服务。这个默认设置也是与本文的安全设计不符的。使用Session Manager,是不需要开放3389端口的,因此这里只需要取消选中即可。如下截图。

取消选中后,界面上看起来是不允许任何入站流量的。如下截图。

现在就可以完成EC2的创建。

2、配置Session Manager需要的IAM Role、AWSCLI、AKSK、Plugin插件等

配置Session Manager需要的IAM Role、AWSCLI、AKSK、Plugin插件等这一系列步骤的操作方法,请参考这篇博客讲解。EC2 Linux和Windows系统在使用System Manager的配置上是完全相同的。

配置完毕后,请注意两点:

  • 当第一次为EC2配置IAM Role之后,请重启EC2使其立刻生效,如果不重启,可能要等数分钟才能生效。
  • 上文这篇博客中提到在开发者本机配置AWSCLI、Region、Session Manager Plugin是必须的步骤,特别是Region需要指定正确。如果配置不正确,则后文是无法创建Session Manager端口转发的。

3、在AWS Console上验证Session Manager工作正常

在进入本步骤之前,请确认已经按照上一个章节这篇博客,为本EC2绑定了一个IAM Role,且这个IAM Role已经包含了名为AmazonSSMManagedInstanceCore的IAM Policy。这一步是强制条件,如果没有完成,那么本文后续步骤无法执行。

EC2 Windows刚创建好之后,需要等待5分钟使其第一次启动初始化完成。这个初始化的时间比EC2 Linux长,只需要等待5分钟即可。

在EC2界面上选中,然后点击Connect连接按钮。如下截图。

在连接界面上,选择第一个标签页Session Manager,然后点击右下角的连接按钮。如下截图。

连接成功,可以看到正常加载了Windows Powershell。如下截图。

现在就可以通过choco包管理工具在Windows上安装软件了。在当前Powershell上执行如下命令:(本步骤可选)

Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))

安装完毕,现在我们来试试通过choco包管理工具在Windows上安装7zip,执行choco install 7zip -y命令(本步骤可选)。安装成功后效果如下截图。

现在验证Session Manager工作正常。

4、从开发者本机登录EC2 Windows的Powershell

上一步验证了Session Manager工作正常。现在要从开发者本机登录。请替换target的id为EC2控制台上的ID,替换Region为正在使用的Region。正在使用的Region可以从AWS控制台右上角的显示区域的地方查询到Region代号。

aws ssm start-session --target i-052c17e5f41242e4f --region cn-northwest-1

登录成功返回信息如下截图。

如果上一步在AWS控制台上测试Session Manager连接成功,但是开发者本机的命令行上连接失败,返回如下信息时候一般的原因是AccessKey/SecretKey不对或者Region不对造成的。SSM要求必须准确声明Region ID方可正确工作。

An error occurred (TargetNotConnected) when calling the StartSession operation: i-052c17e5f41242e4f is not connected.

至此我们就验证了Session Manager在开发者本机登录成功。下一步来创建连接RDP远程桌面的转发。

三、创建转发并验证登录

1、构建转发命令并启动

构建如下命令,分别替换其中的EC2 ID、所在Region、内网IP和本地创建的转发端口。本例采用56789。建议使用50000以上的高位端口避免冲突。

aws ssm start-session \
    --target i-052c17e5f41242e4f \
    --region cn-northwest-1 \
    --document-name AWS-StartPortForwardingSession \
    --parameters '{"portNumber":["3389"], "localPortNumber":["56789"]}'

执行后即可看到连接创建。如下截图。

保存这个窗口不要关闭,一旦关闭,则连接就断开了。

2、验证RDP连接

使用RDP客户端,登录127.0.0.1:56789端口,即可看到登录成功。如下截图。

至此所有配置完成。

四、参考文档

https://docs.aws.amazon.com/zh_cn/systems-manager/latest/userguide/session-manager-working-with-sessions-start.html#sessions-start-port-forwarding