AICon上海|与字节、阿里、腾讯等企业共同探索Agent 时代的落地应用 了解详情
写点什么

使用 Amazon EC2 Systems Manager 取代堡垒机

  • 2019-11-13
  • 本文字数:5235 字

    阅读完需:约 17 分钟

使用Amazon EC2 Systems Manager取代堡垒机

通常情况下,堡垒机(也称为“跳转机”)是在系统中访问私有主机的一个最佳实践。例如,您的系统可能包含一个不希望被公开访问的应用服务器,当需要在这台服务器上进行产品的更新或系统补丁程序的管理时,您通常会登录到堡垒机,然后从那里访问(即“跳转到”)应用服务器。


本文将向您介绍使用Amazon EC2 Systems Manager替换您的堡垒机,实现在服务器上运行命令的同时缩小系统攻击平面并获取更好的可见性。

堡垒机方案

堡垒机最好仅向特定的 IP 地址范围开放,这个地址范围通常可设定为您单位的企业网络。使用堡垒机的好处是,任何对内部服务器的访问都被限定到一种方式:通过单个或一组堡垒机。为了获取进一步的隔离,堡垒机通常被安放在单独的 VPC 中。


这种设计方案如下图所示:



应用服务器运行在与管理 VPC 对等相连的一个 VPC 的私有子网中。 应用服务器设定了一个安全组规则,其仅允许来自管理 VPC 中堡垒机所在安全组的 22 端口访问(本文的示例仅针对端口 22 和 SSH 访问。Windows 用户可将其相应的替换为端口 3389 和 RDP 访问)。同样,堡垒机也设定了一个安全组规则,其仅允许来自公司网络 IP 地址空间的 22 端口访问。


由于应用服务器运行在私有子网中,所以它只能通过 VPC 公共子网中的 NAT 网关来建立出站公网连接。


假设您希望查看应用程序服务器的网络接口,您需要执行以下步骤:


  1. 将应用服务器的私钥安装在堡垒机上。

  2. 从可信网络(如公司网络)发起,在堡垒机上建立 SSH 会话。

  3. 从堡垒机发起,建立 SSH 会话到应用服务器。

  4. 运行“ifconfig”命令。

  5. 如需保存命令的结果,您可以复制和粘贴命令的输出,或者将输出重定向到文件。


这个方案中的安全措施限制了对应用服务器和堡垒机的访问,但堡垒机模式存在一些缺点:


  • 像任何基础设施服务器一样,堡垒机必须进行管理和维护。

  • 运行时会产生成本。

  • 允许堡垒机访问的每个安全组都需要设置一个安全组入口规则,即 SSH(用于 Linux)的 22 端口或 RDP 的 3389 端口(用于 Windows 服务器)。

  • 堡垒机和应用服务器的 RSA 密钥需要进行管理、保护和轮换。

  • SSH 操作无缺省日志记录。

替代方案

Systems Manager 允许您在被管理的服务器上远程执行命令,而不使用堡垒机(此功能称为 EC2 Run Command)。安装于服务器上的代理程序会自动轮询 Systems Manager 以确定是否有命令在等待执行。


此方案具备以下优点:


  • 使用 AWS 托管服务,这意味着 Systems Manager 组件具备高可用性。

  • Systems Manager 通过 IAM 策略设定是否允许用户或角色远程执行命令。

  • Systems Manager 代理程序需要 IAM 角色和策略才能允许它们调用 Systems Manager 服务。

  • Systems Manager 不可更改的记录每个执行的命令,从而提供了可审计的命令历史,包括:


o 执行命令的内容

o 执行命令的主体

o 执行命令的时间

o 命令的输出摘要


  • 当 AWS CloudTrail 在当前区域中启用时,CloudTrail 会记录每个事件,并写入 Amazon CloudWatch Logs。

  • 使用 CloudTrail 和 CloudWatch 规则,您可以将 Systems Manager 事件用作自动响应的触发器,例如 Amazon SNS 通知或 AWS Lambda 函数调用。

  • Systems Manager 可以选择将命令历史记录和每个命令的全部输出存储在 Amazon S3 中。

  • Systems Manager 可以选择发布消息到 SNS 主题,从而在命令开始执行时和完成时通知订阅者。

  • Systems Manager 是基于代理程序的,这意味着它不限于管理 Amazon EC2 实例。它还可以管理运行在自有数据中心或者另一个云服务提供商的非 AWS 服务器上。

  • 无需管理 SSH 密钥。


Systems Manager 本身没有成本,但是您需要支付 Systems Manager 所管理的资源(如 EC2 实例、SNS 消息和 S3 存储等)的成本。

Systems Manager 代理程序

Systems Manager 代理是运行在被管理的服务器上的开源可执行程序,支持 Linux 和 Windows 操作系统(请参见支持的详细操作系统版本列表)。


Systems Manager 代理通过 IAM 角色与 Systems Manager 进行通信。这个角色必须具有足够权限与 Systems Manager 及其辅助服务进行交互。IAM 已经提供了一个名为AmazonEC2RoleforSSM的托管策略,为您预先定义了这些权限:允许代理程序获取并回复 Systems Manager 消息、发布 CloudWatch 指标、并将日志文件写入 S3。


Systems Manager 代理通过 HTTPS 协议与 Systems Manager 通信,这意味着服务器和 Systems Manager 服务之间的通信是被加密的,而且安全组也不需要特殊的出口规则。


理想情况下,您可以在实例引导时安装代理程序。您可以将其安装在已经运行的 EC2 实例或非 AWS 的服务器上。例如,您可以通过 EC2 实例的 user data 在系统引导时使用 yum 安装 Systems Manager 代理:


Bash


#!/bin/bashcd /tmpcurl https://amazon-ssm-region.s3.amazonaws.com/latest/linux_amd64/amazon-ssm-agent.rpm -o amazon-ssm-agent.rpmyum install -y amazon-ssm-agent.rpm
复制代码


关于安装 Systems Manager 代理的更多信息,请参考以下链接:Installing SSM Agent.

优化后的系统架构

现在您已了解了 Systems Manager 的众多优点,下面我们看一下如何据此优化您的系统架构。


如下图所示,Systems Manager 消除了系统对堡垒机的需求,从而简化了系统架构。 用户不再直接与应用服务器进行交互,Systems Manager 成为了执行命令的代理。



在此设计中,Systems Manager 代理程序驻留在应用服务器上,使其成为 “受管实例”——这意味着它可以从 Systems Manager 接收命令。 要执行一个命令,只需在 Systems Manager 中创建一个命令请求,并派发到该实例或一组实例上运行。


创建命令请求时,您可以选择一个用于存储命令执行结果的 S3 存储桶,和用于发送执行通知的 SNS 主题。 您还可以创建通过 Systems Manager 事件触发的 CloudWatch 事件。

操作演示

您可以使用下面的【Launch Stack】链接来启动一个AWS CloudFormation栈,后者将创建上述架构,然后运行命令并在 Systems Manager 控制台中查看结果。最后,您可以销毁整个 CloudFormation 栈。


注:该链接会在北弗吉尼亚州区域启动相关资源,并产生相应的成本。SSM 只在如下区域可应用。



1.选择 Launch Stack 打开 CloudFormation 控制台(请确保您已经使用您的 AWS 账户登录)并启动 CloudFormation 模板。选择 Next。

2.对于 Stack name,请使用缺省的 ssm-demo 或输入自定义名称。 对于通知电子邮件,请输入您的电子邮件地址,以在 Systems Manager 执行操作时通知您。CloudFormation 模板启动后,您将收到一个订阅确认邮件,您必须确认才能收到后续的通知。选择 Next

3.在 Review 屏幕上,确认允许 CloudFormation 创建 IAM 角色。选择 Create

4.要查看栈的创建进度,请选择 Refresh,然后选择 ssm-demo 栈以查看启动过程。

5.当栈成功启动时,状态会从 CREATE_IN_PROGRESS 更改为 CREATE_COMPLETE 。 要查看本文后面需要使用的输出值,请选择 Outputs.

这个 CloudFormation 模板创建的资源将在本文的后面中使用。您应该看到下表中列出的值。


     col 1          |                             col 2                             |      col 3      
复制代码


:-----------------------:|:-------------------------------------------------------------:|:----------------:


Output 名称 | 示例值 | 用途


S3Bucket | S3Bucket ssm-output-history -account-id – 区域 | S3 桶用于存储命令的输出


ApplicationHostInstance | id-instance-id | 用于执行命令的 EC2 实例


SnsTopicArn | arn:aws:sns: region : account-id :SsmNotificationTopic | 用于发送命令执行通知的 SNS 主题


RoleArn | arn:aws:iam :: account-id :role / SsmNotificationRole- region | 用于向 SNS 发送通知的角色

Systems Manager 演示

在本节中,您将使用 Systems Manager 发出与上文堡垒机方案中相同的“ifconfig”命令来查看应用服务器的网络接口配置。


首先,您需要指定要在其上执行命令的实例。在 Systems Manager 执行命令之后,它会报告执行状态,显示输出,并将输出的历史存储在 S3 桶中,并向您发送一封电子邮件通知。


Systems Manager 代理以 root 权限运行,管理员在授予用户执行 Systems Manager 命令的权限时应注意这一点。


要使用 Systems Manager,请按照下列步骤操作:


1.登录到您的 AWS 帐户并跳转到 EC2 控制台

2.在左侧导航窗格的 SYSTEMS MANAGER 下 ,选择 Managed Instances

col 1

注意:如果您看到“欢迎使用 EC2 系统管理器 ”的界面,而非受管实例列表,请确保您的系统已满足以下条件:

  • 您正在查看的 EC2 控制台与您启动 CloudFormation 模板的区域相同

  • 至少有一个实例正在运行 Systems Manager 代理

  • 运行 Systems Manager 代理的实例具有关联的实例角色,并具有允许 Systems Manager 操作的策略

  • 实例已完成初始化(通常只有几分钟)


3.选择本文前面 CloudFormation 模板创建的实例,然后选择 Run a command.

4.在 Run a command 屏幕上,向下滚动命令文档列表并选择 AWS-RunShellScript,平台类型是 Linux。如果您使用 Windows 服务器,请选择 AWS-RunPowerShellScript。本文不会涉及命令文档列表中的其他命令,但您可以在工作中根据实际用途选择使用其他命令文档。

5.确保选择了前文 CloudFormation 模板创建的 EC2 实例。

6.在 Commands 输入框中输入以下命令:

Bash

ifconfig


这会发出一个命令来查看主机的网络接口配置。 您可以在这里输入任何有效的 bash 命令(对于 Linux),例如:安装补丁程序,执行应用程序,或更新配置文件等。

7.输入以下值,然后选择 Run

  • 对于 S3 存储桶,请输入上文 CloudFormation 模板创建的存储桶名称(将 S3 前缀值留空)。

  • 对于角色 ARN,输入从 CloudFormation 模板创建的 ARN。

  • 对于 SNS 主题 ARN,输入从 CloudFormation 模板创建的 ARN。

  • 对于 Notify me on,选择全部。

  • 对于 Notify me for,选择命令。

  • 所有其他字段采用默认值。

8.在你启动这个要求之后, 选择 View Managed Instances.

9.如需查看命令历史,在 SYSTEMS MANAGER SERVICES,选择 Run Command.

10.要在 Systems Manager 控制台上查看命令的简要输出,请选择 Output, 然后再选择 View Output.

对于较长的输出,您可以在先前指定的 S3 存储桶中查看完整的命令输出。此外,您应该在几分钟内收到一封电子邮件,通知您 Systems Manager 的命令已执行完成。

col 1

注意:如果您没有收到电子邮件通知,请确保您在启动 CloudFormation 栈时收到的 SNS 主题确认邮件中,点击链接确认接收 SNS 通知。


截至目前,您已经在应用服务器上成功执行了一个命令,而没有使用堡垒机或直接访问服务器。您可以审核命令的执行,并使用现有的 IAM 框架来控制对服务器的访问,而无需管理专用的 RSA 密钥。有关使用 IAM 框架控制 Systems Manager 的权限的详细信息,请参阅Configuring Access to Systems Manager


要清理 CloudFormation 模板创建的资源,请确保删除 CloudFormation 栈。如果您使用 Systems Manager 时将执行日志存储在存储桶中,您在删除栈之前必须手动删除存储桶及其内容。

下一步

大多数 AWS 服务都包含强大的 API 让您实现服务交互的自动化。使用控制台是学习和理解远程命令执行过程的好方法,但自动化这一能力提供了一种可靠和规范的方式来管理用户对此功能的使用。


例如,许多组织都依靠人员的轮值来支持生产环境。由于 Systems Manager 支持 IAM 集成,您可以根据人员上岗的特定时间段来自动授予或撤消 Systems Manager 调用权限。


在上文的示例中,您在控制台中执行了一个随意的命令。实际工作中,您将执行存储在具备访问控制的源代码库中的脚本,并可将此功能集成到现有的运维工作流程中,实现请求的跟踪、审批或拒绝。另外,使用 AWS CLI、AWS API 和 AWS SDK,您还可以实现 Systems Manager 的全程自动化。

更多 Systems Manager 的特性

远程命令执行只是 Systems Manager 的一个功能。 其他功能包括:自动补丁管理,服务器软件清单,AMI 自动化和参数库等。更多详细信息,请参阅 Amazon EC2 Systems Manager 产品详细信息页面。

总结

本文介绍了如何在 EC2 实例上远程执行命令,同时减少系统的攻击平面并简化系统的架构。您还可以使用 AWS 的 IAM、日志和警报等服务帮助您获取服务器上所执行命令的详细信息。


您可能会遇到此解决方案无法满足的 SSH 或 RDP 的用例,例如 SSH 隧道或依赖于 SSH 的专有软件。希望这篇文章为您提供了关于如何访问和管理服务器的新思路。

译者介绍


寇欣,亚马逊 AWS 中国区专业服务部咨询顾问,加入 AWS 之前,在 IT 和云计算行业积累了丰富的云服务架构和应用软件架构的经验。历任 Oracle 电信事业部专业服务部门资深顾问、中国移动研究院云计算研究员、Lucent Tech 研发中心系统架构师。


本文转载自 AWS 技术博客。


原文链接:


https://amazonaws-china.com/cn/blogs/china/replacing-a-bastion-host-with-amazon-ec2-systems-manager/


2019-11-13 08:00871

评论

发布
暂无评论
发现更多内容

3种基于深度学习的有监督关系抽取方法

华为云开发者联盟

文本检测 区域重组 文本检测算法 PixelLink TextSnake

微服务从代码到k8s部署应有尽有系列(二、网关)

万俊峰Kevin

微服务 RPC web开发 go-zero Go 语言

Linux常用的命令

龙空白白

linux 文件权限控制 linuc

教你用Elastic Search:运行第一条Hello World搜索命令 原创

华为云开发者联盟

数据库 全文检索 索引 Elastic Search 分布式实时搜索引擎

2022 年值得关注的 十大 DevOps 最佳实践

飞算JavaAI开发助手

【C语言】一篇速通常量变量

謓泽

编程语言 C语言 2月月更 常量变量

运维安全是指什么?如何做好运维安全?

行云管家

运维 网络安全 IT运维 运维安全

云原生微服务技术趋势解读

阿里巴巴中间件

阿里云 微服务 云原生 中间件

英特尔CEO:开启超级摩尔定律的时代,推动前沿进展

科技新消息

后端新手如何从 0 到 1 打造一款 Apache APISIX 插件

API7.ai 技术团队

后端 插件 Apache APISIX APISIX 网关

X6在数栈指标管理中的应用

袋鼠云数栈

Java 大数据 前端

DG-IoT: 开源项目职业教育助力解决过度补课难题

dgiot

物联网 2月月更 2月日更 dgiot dgiot物联网

优秀程序员的30种思维--分析总结篇(13/100)

hackstoic

架构思维

大数据培训:Flink全链路延迟的测量方式及原理

@零度

flink 大数据开发

【OH干货】如何向OpenHarmony社区提交代码

拓维信息

OpenHarmony

Java&Go高性能队列之channel性能测试

FunTester

Go 性能测试 队列 channel FunTester

如何构建一个流量无损的在线应用架构 | 专题中篇

阿里巴巴中间件

阿里云 云原生 中间件

如何构建一个流量无损的在线应用架构 | 专题尾篇

阿里巴巴中间件

阿里云 云原生 中间件 EDAS

手把手带你基于嵌入式Linux移植samba服务

华为云开发者联盟

Linux 嵌入式 Samba UNIX系统 SMB协议

如何通过测试用例保障交付质量

阿里云云效

阿里云 云原生 开发测试 测试用例 研发

文本检测算法新思路:基于区域重组的文本检测

华为云开发者联盟

文本检测 区域重组 文本检测算法 PixelLink TextSnake

CRM重构项目

Mars

翟佳:从技术工程师到「网红」开源创业者

腾源会

开源 开源公司

Android 12 “致命”崩溃解决之路

阿里巴巴终端技术

android 崩溃分析 客户端 UC内核

第十二节:Springboot多环境配置

入门小站

spring-boot

网络编程懒人入门(十四):到底什么是Socket?一文即懂!

JackJiang

TCP 网络编程 socket IM 即时通讯IM

白盒绕过、黑盒绕过——绕过waf(一)

喀拉峻

网络安全

前端技术分享:页面性能优化问题复盘

有道技术团队

前端

移动开发平台WorkPlus | 快速实现企业移动应用集成化

BeeWorks

mark: centos 镜像下载地址

webrtc developer

Linux centos

在线YAML转JSON工具

入门小站

工具

使用Amazon EC2 Systems Manager取代堡垒机_语言 & 开发_亚马逊云科技 (Amazon Web Services)_InfoQ精选文章