一、需求
#1.跳板机应该放置在哪个子网?
#2.如何安全访问跳板机?
#3.跳板机如何安全访问受管理服务器?
二、网络规划
对于vpc的规划通常需要划分为若干个子网,分为公有子网和私有子网。公有子网中的实例可以直接从 Internet 接收入站数据流,私有子网中的实例则不可。公有子网中的实例可以直接向 Internet 发送出站数据流,私有子网中的实例则不可。但是,私有子网中的实例可以使用位于公有子网中的网络地址转换 (NAT) 网关访问 Internet。
根据以上描述不同子网的特点,我们需要把跳板机放置在公有子网中,以便接受管理人员通过internet的访问,受管理的服务器根据其在业务系统中充当的角色选择放置在公有子网或私有子网。在实际生产环境中根据需要可为跳板机设置一个独立的公有子网 。
如下图所示的vpc规划中,为跳板机实例划分了一个专用的公有子网,管理员可以通过登录到跳板机对放置在私有子网的服务器的管理:
三、跳板机部署
1.概述
该实例为 Amazon EBS 支持的实例 (即,根卷为 EBS 卷)。您可以指定在其中运行您的实例的可用区,也可以让 Amazon EC2 为您选择可用区。启动您的实例时,您可以通过指定密钥对和安全组保障其安全。连接到您的实例时,您必须指定您在启动实例时指定的密钥对的私有密钥。
2.设置 Amazon EC2
1)注册AWS
当您注册 Amazon Web Services (AWS) 时,您的 AWS 账户会自动注册 AWS 中的所有服务,包括 Amazon EC2。您只需为使用的服务付费。使用 Amazon EC2,您可以按实际用量付费。如果您是 AWS 新客户,还可以免费试用 Amazon EC2。
如果您已有一个 AWS 账户,请跳到下一个任务。如果您还没有 AWS 账户,请使用以下步骤创建。
#1.如何创建 AWS 账户
打开 https://portal.aws.amazon.com/billing/signup。
按照屏幕上的说明进行操作。
在注册时,您将接到一通电话,要求您使用电话键盘输入一个验证码。
2)创建密钥对
AWS 使用公共密钥密码术来保护您的实例的登录信息。Linux 实例没有密码;您可以使用密钥对安全地登录您的实例。 使用 SSH 登录时,您在启动实例时指定密钥对的名称,然后提供私有密钥。
如果您尚未创建密钥对,则可以通过 Amazon EC2 控制台自行创建。请注意,如果您计划在多个区域中启动实例,则需要在每个区域中创建密钥对。有关区域的更多信息,请参阅区域和可用区。
1.创建密钥对。
#1.打开 Amazon EC2 控制台 https://console.aws.amazon.com/ec2/。
#2.在导航窗格中,选择 Key Pairs (密钥对)。
#3.选择 Create key pair (创建密钥对)。
#4.对于 Name (名称),输入密钥对的描述性名称。Amazon EC2 将公有密钥与您指定作为密钥名称的名称相关联。密钥名称最多可包含 255 个 ASCII 字符。它不能包含前导空格或尾随空格。
#5.对于 File format (文件格式),选择要保存私有密钥的格式。要以可与 OpenSSH 一起使用的格式保存私有密钥,请选择 pem。要以可与 PuTTY 一起使用的格式保存私有密钥,请选择 ppk。
#6.选择 Create key pair (创建密钥对)。
#7.您的浏览器会自动下载私有密钥文件。基本文件名是指定为密钥对名称的名称,文件扩展名由您选择的文件格式确定。将私有密钥文件保存在安全位置。
ps:这是您保存私有密钥文件的唯一机会。
#8.如果您将在 macOS 或 Linux 计算机上使用 SSH 客户端连接到您的 Linux 实例,请使用以下命令设置您私有密钥文件的权限,以确保只有您可以读取它。
chmod 400 my-key-pair.pem
如果不设置这些权限,则无法使用此密钥对连接到实例。
3)创建安全组
安全组用作相关实例的防火墙,可在实例级别控制入站和出站的数据流。您必须在安全组中添加规则,以便能够使用 SSH 从您的 IP 地址连接到实例。您还可以添加允许来自任意位置的入站和出站 HTTP 和 HTTPS 访问的规则。
ps:如果计划在多个区域中启动实例,则需要在每个区域中创建安全组。
您需要使用本地计算机的公有 IPv4 地址。Amazon EC2 控制台中的安全组编辑器可以为您自动检测公有 IPv4 地址。此外,您可以在 Internet 浏览器中使用搜索短语“什么是我的 IP 地址”,或使用以下服务:检查 IP。如果您正通过 Internet 服务提供商 (ISP) 连接或者在不使用静态 IP 的情况下从防火墙后面连接,则您需要找出客户端计算机使用的 IP 地址范围。
您可以使用以下方法之一创建自定义安全组。
创建具有最小特权的安全组
#1.打开 Amazon EC2 控制台 https://console.aws.amazon.com/ec2/。
#2.从导航栏中选择安全组的区域。安全组特定于某一区域,因此您应选择已创建密钥对的区域。
#3.在导航窗格中,选择 Security Groups。
#4.选择创建安全组。
#5.在 Basic details (基本详细信息) 部分中,执行以下操作:
1.输入新安全组的名称和描述。使用一个容易记住的名称,例如,您的用户名称,后跟 _SG_,加区域名称。例如,me_SG_uswest2。
2.在 VPC 列表中,为区域选择您的默认 VPC。
#6.在入站规则选项卡上,创建以下规则(为每个新规则选择添加规则):
1.从 Type 列表中选择 HTTP,确保 Source 设置为 Anywhere (0.0.0.0/0)。
2.从 Type 列表中选择 HTTPS,确保 Source 设置为 Anywhere (0.0.0.0/0)。
3.从 Type 列表中选择 SSH。在源框中,选择 My IP 以便使用本地计算机的公有 IPv4 地址自动填充该字段。或者,选择自定义并用 CIDR 表示法指定计算机的公有 IPv4 地址或网络。要采用 CIDR 表示法指定单个 IP 地址,请添加路由前缀 /32,例如 203.0.113.25/32。如果您的公司要分配同一范围内的地址,请指定整个范围,例如 203.0.113.0/24。
ps:出于安全原因,不要允许从所有 IPv4 地址 (0.0.0.0/0) 对您的实例进行 SSH 访问(以测试为目的的短暂访问除外)。
#7.选择创建安全组。
3.启动实例
#1.打开 Amazon EC2 控制台 https://console.aws.amazon.com/ec2/。
#2.从控制台控制面板中,选择启动实例。
#3.Choose an Amazon Machine Image (AMI) 页面显示一组称为 Amazon 系统映像 (AMI) 的基本配置,作为您的实例的模板。选择 Amazon Linux 2 的 HVM 版本。 请注意,这些 AMI 标记为“Free tier eligible”(符合条件的免费套餐)。
#4.在 Choose an Instance Type (选择实例类型) 页面上,您可以选择实例的硬件配置。选择 t2.micro 实例类型 (默认情况下的选择)。t2.micro 实例类型适用免费套餐。在 t2.micro 不可用的区域中,您可以使用免费套餐下的 t3.micro 实例。有关更多信息,请参阅 AWS 免费套餐。
#5.在选择实例类型页面上,选择查看并启动让向导为您完成其他配置设置。
#6.在 Review Instance Launch (查看实例启动) 页面上的 Security Groups (安全组) 下,您将看到向导为您创建并选择了安全组。使用以下步骤,您可以使用此安全组,或者也可以选择在设置时创建的安全组:
1.选择 Edit security groups。
2.在 Configure Security Group 页面上,确保 Select an existing security group 处于选中状态。
3.从现有安全组列表中选择您的安全组,然后选择 Review and Launch。
#7.在 Review Instance Launch 页面上,选择 Launch。
#8.当系统提示提供密钥时,选择 Choose an existing key pair,然后选择您在进行设置时创建的密钥对。
ps:请不要选择在没有密钥对的情况下继续。如果您启动的实例没有密钥对,就不能连接到该实例。
准备好后,选中确认复选框,然后选择 Launch Instances。
#9.确认页面会让您知道自己的实例已启动。选择 View Instances 以关闭确认页面并返回控制台。
#10.在实例屏幕上,您可以查看启动状态。启动实例只需很短的时间。启动实例时,其初始状态为 pending。实例启动后,其状态变为 running,并且会收到一个公有 DNS 名称。(如果公共 IPv4 DNS 列已隐藏,请选择右上角的设置图标 ( ) ,打开公共 IPv4 DNS,然后选择确认。
#11.需要几分钟准备好实例,以便您能连接到实例。检查您的实例是否通过了状态检查;您可以在状态检查列中查看此信息。
4.使用ssh连接到linux实例
1)先决条件
在连接到 Linux 实例之前,请先完成以下先决条件:
#1.检查实例状态
启动实例后,需要几分钟准备好实例,以便您能连接到实例。检查您的实例是否通过了状态检查。您可以在实例页面的状态检查列中查看此信息。
#2.获取公有 DNS 名称和用户名以连接到您的实例
要查找实例的公有 DNS 名称或 IP 地址以及用于连接到实例的用户名,请参阅 连接到实例的先决条件。
#3.根据需要在您的本地计算机上安装 SSH 客户端
您的本地计算机可能已默认安装了 SSH 客户端。您可以通过在命令行中键入 ssh 来验证这一点。如果您的计算机无法识别该命令,可安装 SSH 客户端。
最新版本的 Windows Server 2019 和 Windows 10 – OpenSSH 作为可安装组件包括在内。有关信息,请参阅 Windows 中的 OpenSSH。
较早版本的 Windows – 下载并安装 OpenSSH。有关更多信息,请参阅 Win32-OpenSSH。
Linux 和 macOS X – 下载并安装 OpenSSH。有关更多信息,请参阅 https://www.openssh.com。
2) 连接实例
如果您的本地计算机操作系统是 Linux 或 macOS X
#1.SSH 客户端
#2.EC2 Instance Connect
#3.AWS Systems Manager 会话管理器
如果您的本地计算机操作系统是 Windows
#1.PuTTY
#2.SSH 客户端
#3.AWS Systems Manager 会话管理器
#4.适用于 Linux 的 Windows 子系统
3)清除实例(不需要时删除)
终止实例
#1.在导航窗格中,选择 Instances。在实例列表中选择实例。
#2.依次选择实例状态、终止实例。
#3.当系统提示您确认时,选择终止。
#4.Amazon EC2 关闭并终止您的实例。您的实例在终止之后,短时间内仍将在控制台上可见,然后该条目将自动删除。您不能自己从控制台显示中删除已终止的实例。
ps:终止实例可有效地删除实例;无法在终止实例后重新连接到实例。
如果启动的实例不在 AWS 免费套餐范围内,则该实例一旦变为 shutting down 或 terminated 状态,就会停止产生费用。为了在不产生费用的情况下保留实例以供将来使用,可以立即停止该实例,然后在稍后再次启动它。
5.配置安全组
在实际部署中考虑到跳板机所需的工作负载,可以部署配置较低的实例类型。此外,出于成本和安全考虑,您也可以在不进行运维操作的时候将跳板机状态设置为”停止”,在每次运维需要的时候再“开启”跳板机。
为跳板机实例配置安全组。在创建EC2的过程中,在安全组规则中添加SSH服务的安全规则,根据实际情况限定连接的源 IP地址。如下图所示,只接受特定的 管理终端连接:
配置受管理服务器的安全组。配置安全组规则仅接受来自跳板机所对应安全组的访问请求:
6.配置管理终端
配置管理终端。在管理终端依次导入跳板机和受管理服务器的证书私钥,登录跳板机后私钥信息将转发到受管理服务器完成身份验证。以下是针对linux环境和windows环境的管理终端为例:
#1.在linux管理终端下通过ssh从跳板机登录到受管理服务器:
步骤一:在linux管理终端上运行ssh-agent启动ssh-agent进程
步骤二:将跳板机和受管理服务器对应证书的私钥依次添加到管理终端,执行方式如下(例如,私钥文件名称为xxx.pem):
ssh-add xxx.pem
步骤三:使用ssh -A 参数登录跳板机,-A 表示通过跳板机转发本地管理端保存的私钥信息,实现跳板机与受管理服务器之间的身份验证:
ssh –A ec2-user@跳板机公网 ip地址 ——(以下假定linux ssh用户名为ec2-user)
步骤四:从跳板机直接通过受管理服务器的内网IP SSH登录服务器:
ssh ec2-user@受管理服务器的内网ip地址
#2.在windows环境下通过Putty从跳板机登陆到受管理的服务器:
下载putty客户端,并且通过puttygen将私有证书生成ppk格式。
下载Putty环境下的SSH agent—-pageant
步骤一:将受管理服务器及跳板机所对应证书的私钥添加进pageant
启动pageant并右击图标,您可以先查看key list,如果受访问服务器所需私钥没有添加进key list里,则执行”Add Key”的操作。并将保存在本地的私钥添加进去。
步骤二:通过putty登陆跳板机
在这一步中,如图填写跳板机公有IP地址,并在左侧SSH-Auth目录下勾选“Allow agent forwarding” 来允许跳板机上的ssh客户端与管理终端本地的ssh-agent通信并使用管理终端本地的密钥完成与受管理服务器的ssh认证流程。下面以AWS 上的一台EC2为例登陆跳板机:
这里需要添加的私钥为跳板机所对应证书的私钥。
步骤三:从跳板机直接登录受管理的服务器
通过命令”ssh ec2-user@受管理服务器内网ip地址”来实现对受管理服务器的访问,需要注意的是,在这里输入受管理服务器的私有IP地址实现对其的访问,提高了受管理服务器的安全性。
这样,您便实现了从跳板机上登陆受管理服务器的操作。
四、安全加固
在上面部署跳板机的过程中,跳板机所附件的安全组规则中开放了TCP 22端口,根据实际情况建议严格限制来源ip地址,只允许指定的IP地址访问。在这基础上,还可以对安全进行优化:
1.管理员登录优化
#1.当管理员需要登录跳板机通过AWS CLI在安全组添加规则打开tcp 22 端口;
完成管理任务后,退出ssh会话,AWS CLI将从安全组中关闭tcp 22端口;实现以上效果,可以执行以下脚本 ,根据实际环境替换安全组id。
#!/bin/bash
aws ec2 authorize-security-group-ingress –group-id 安全组id –protocol tcp –port 22 –cidr 0.0.0.0/0 &
sleep 5
ssh -A ec2-user@跳板机公网IP
aws ec2 revoke-security-group-ingress –group-id 安全组id –protocol tcp –port 22 –cidr 0.0.0.0/0
2.配置AWS CLI运行环境
要成功运行以上脚本,需要配置 AWS CLI运行环境,具体请参考:
http://docs.aws.amazon.com/cli/latest/userguide/installing.html
执行脚本登录前,将跳板机安全组中的ssh服务规则删除,即无法访问tcp 22端口:
执行脚本登录时,将执行脚本中的第一条语句,通过AWS CLI添加了ssh服务相关规则,然后ssh成功登录到跳板机:
在跳板机上完成管理任务后exit结束ssh会话,AWS CLI删除安全组ssh服务规则,即无法访问tcp22端口:
下图显示,安全组规则相应被删除:
五、跨vpc管理服务器
跳板机是否可以管理不同vpc中的服务器呢?答案当然是可以的。如下图所示,需要在vpc之间建立peering连通两个vpc,跳板机即可实现跨vpc安全管理应用服务器。
建立vpc peering的过程如下:
步骤一:新建Peering Connection
进入console里面VPC下的”Peering Connections”页面,新建”VPC Peering Connection”。 在这里您需要提供跳板机以及受管理服务器所在VPC的ID,点击”Create VPC Peering Connection”。
步骤二: 配置路由表
创建成功之后,您可以看到peering 的相关信息,比如”status” ,”Local Vpc”以及”Peered Vpc”信息。同时您可以看到peering的状态为”pending-accept”,您需要点击上方的”Action”,并选择接受请求。
当您接受请求之后,您会收到创建新的路由表的通知,您需要点进页面进行路由表的配置。当为本地VPC 配置路由表信息时,您需要提供受访服务器所在VPC的CIDR作为跳板机路由表的Destination,新创建的peering作为Target。
同理,在配置受访服务器所在VPC的路由表信息时,您只需将本地 VPC 的CIDR作为Destination。
在配置完路由表信息后,您可以看到peering的状态变成了”active”,并且可以看到路由表的相关信息。
步骤三: 通过本地跳板机登陆受访服务器
这一步类似于前面提到的在同一VPC下从公有子网的跳板机访问私有子网的受管理服务器。您需要配置好您的安全组信息,在访问的时候,您需要在管理终端保存受管理服务器公钥所对应的私钥。然后在跳板机上执行ssh ec2-user@受管理服务器内网ip地址
如下图:位于192.168.0.0/24网段的跳板机 直接ssh访问位于172.16.0.0/24网段的应用服务器
六、关于windows 环境下的跳板机配置
Windows Server的管理基于windows RDP协议实现,可以通过配置RDP 网关服务器管理位于私有子网的windows服务器,具体的规划及配置请参考以下白皮书:
https://aws.amazon.com/windows/resources/whitepapers/rdgateway