摘要:本文介绍了如何不需要将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
端口,即可看到登录成功。如下截图。
至此所有配置完成。