亚马逊AWS官方博客
AWS EC2 实例的安全远程访问最佳实践
![]() |
引言
随着数字化转型的深入推进,云计算技术已经成为企业 IT 基础设施的核心支柱。作为全球领先的云计算服务提供商,亚马逊弹性计算服务(Amazon EC2)凭借灵活的计算能力、按需付费的商业模式和全球化的基础设施布局,成为众多企业首选的云计算平台。
在实际应用中,EC2 不仅提供丰富的虚拟服务器实例,还包括负载均衡、自动扩展、存储管理等多样化的功能。企业可以根据业务需求快速部署和调整计算资源,显著提升运营效率。然而,随着网络安全威胁的日益增加,EC2 的安全运维变得尤为重要。这不仅包括基础的访问控制、网络安全配置,还需要考虑数据加密、安全组策略制定、漏洞修复等多个维度的安全防护措施。
为了有效应对云环境中的安全挑战,AWS 提出了”责任共担”模型(Shared Responsibility Model),即 AWS 方面配备专业安全及运营团队,负责云服务的安全合规建设,同时为用户提供相应的安全服务与功能支持。而用户则需要根据所使用的云服务类型,承担相应的安全配置和运维责任。
![]() |
不同类型云服务的责任边界
从上图中,我们可以发现使用 EC2 自建服务相比其它托管服务拥有最大的自定义程度,也对应更多用户侧责任,包括:用户数据安全、网络防护、操作系统和软件管理 等。本文章基于官方文档、白皮书和行业最佳实践案例,系统梳理了 EC2 实例安全运维的核心领域,涉及: 身份管理、远程访问、网络防护、数据保护、操作系统和软件管理、监控审计 等关键环节。通过对比分析不同方案实施效果,利用 AWS 原生工具,为企业客户构建安全运维体系提供可落地的技术方案。
EC2 安全运维最佳实践
构建最小权限模型
研究数据表明,超过 78% 的云安全事件都是由权限配置不当引起的,因此建议使用临时安全凭证替代长期访问密钥,对安全需求较高的场景强制开启多因素认证(MFA)。
对 EC2 实例上运行的应用或服务进行身份和访问管理时,最佳实践是采用基于角色的访问控制(RBAC)模式,并通过精细化的 IAM 策略条件来实现严格的权限管理。具体操作中,可以使用 aws iam create-role
命令创建一个仅具备特定资源,如 S3 存储桶、RDS 数据库实例访问或操作权限的 IAM 角色,再绑定给指定的 EC2 实例使用。
同时配合使用 AWS CloudTrail 等审计工具,实时监控权限使用情况,及时发现和处理异常访问行为。同时,建立完善的权限申请和审批流程,确保权限变更可追溯、可管理。
全链路数据保护
数据安全是云环境中最关键的安全考量之一。全链路加密意味着在数据的整个生命周期中(静态、传输中和使用中)都实施加密保护。以下是 AWS EC2 环境中实现全链路数据加密的最佳实践:
静态数据加密(Data at Rest)
EBS 卷加密:为 EC2 实例的 EBS 存储卷启用默认加密,可以使用 AWS KMS(Key Management Service)管理的密钥或自定义密钥。
AMI 加密:将 AMI 转换为加密的 AMI,使用加密后的 AMI 创建 EC2 实例,提供从源头开始的数据保护方式。
传输中数据加密(Data in Transit)
TLS/SSL 配置:为所有 EC2 实例上运行的服务配置 TLS 1.2 或更高版本,禁用弱密码套件。
应用层协议加密:确保应用程序使用加密协议进行通信,如 HTTPS、FTPS、SFTP、MQTTS 等。
gRPC + TLS:对于微服务架构,使用 gRPC 并配置 TLS 加密,提供高效且安全的服务间通信。
VPC 流量加密:利用 AWS PrivateLink 实现 VPC 间的安全通信,避免数据通过公共互联网传输。
漏洞管理闭环
漏洞管理闭环是一个系统化的安全防护流程,对于保障云上资产的安全性至关重要。
在这一体系中,AWS Systems Manager Patch Manager 作为核心组件,不仅可以建立补丁基线,还能根据操作系统类型(如 Windows、Linux 各发行版)制定差异化的补丁策略。补丁基线可以设置自动审批规则,例如对于严重程度为”严重”和”重要”的安全更新自动审批,同时可以指定补丁发布后的等待天数,确保补丁稳定性。
维护窗口(Maintenance Window)为补丁部署提供了精细化的控制能力,运维人员可以设置分批部署策略,例如先对10%的实例组进行验证后再全量部署。通过调节并发执行数量和错误阈值来控制补丁部署的范围和速度,减少对生产环境的影响。
Amazon Inspector 能基于 CVE(通用漏洞和暴露)数据库和 CVSS(通用漏洞评分系统)分数自动识别 EC2 实例中的已知漏洞风险。Inspector 考虑的关键风险因素包括:漏洞严重性、网络可达性、可利用性以及受影响组件的暴露情况。结合 Security Hub 服务使用,企业可以获得更全面的安全状况视图。
通过整合 Inspector 的漏洞发现能力、Systems Manager 的补丁管理功能以及 Security Hub 的集中监控 这套完整的闭环管理体系,企业可以实现漏洞的自动发现、评估、修复和验证的完整闭环,显著提升安全防护能力。
网络安全
在规划虚拟私有云(VPC)架构时,应当采用三层网络分离的设计理念,即将 Web 层、应用层和数据库层分别部署在独立的子网中。同时,为了提升系统安全性,建议将所有 EC2 实例都部署在私有子网内,通过安全组(Security Group)和网络访问控制列表(NACL)来严格控制进出流量。在配置安全组时,应遵循”默认拒绝”原则,仅放开必要的入站和出站流量。对于管理端口(如:22 SSH、23 Telnet、3389 RDP)和 数据库端口(如 1433 MSSQL、3306 MySQL)等,仅允许指定 IP/地址段 或安全组访问。
私有子网中的 EC2 实例可以通过 NAT 网关访问外网,既确保了实例可以获取必要的更新和补丁,同时又不会直接暴露在互联网中。NAT 网关的使用还可以集中管理出口流量,便于监控和审计。
此外,利用 CloudFront 的 VPC Origins 功能,可以实现对私有子网中的应用和 API 服务的内容分发。CloudFront 作为内容分发网络(CDN)不仅能提供更好的访问性能,还能通过边缘节点过滤恶意流量,提供 DDoS 防护等安全功能。
这种架构设计还可以配合其他 AWS 安全服务使用,例如:
- 利用 AWS Certificate Manager 管理 SSL/TLS 证书
- 使用 AWS WAF 进行 Web 应用防火墙保护
- 部署 AWS Shield 提供 DDoS 防护
精细化权限管理
在 AWS 云环境中,我们通常使用多账户管理和网络隔离的方式进行资源隔离。同时,我们还可以结合 AWS 资源标签(Tag)和 IAM 访问控制策略,实现 IAM 用户级的精细管理。
具体来说,我们可以设置一个自动化解决方案:当 AWS 资源被创建时,系统会自动为其添加创建者(Owner)标签。这个功能可以通过 AWS Lambda + CloudTrail 实现:Lambda 函数会监听 CloudTrail 中的资源创建事件,并自动为新建资源打上创建者标签(详情可参考 AWS Resource Auto Tagger 工具:https://github.com/aleck31/aws-resource-tagger)。
基于这些标签,我们可以制定相应的 IAM 策略,确保用户只能管理带有自己用户名标签的资源。对于 EC2 实例,我们可以创建专门的 IAM 策略(参考:manage-own-instances-policy.json),并分配给相应的用户或用户组,从而实现基于用户的权限控制。
基于标签的 IAM 权限控制为多用户环境下的资源管理提供了精确的权限边界,但仍然存在一些重要的安全漏洞,特别是在 EC2 实例的访问控制方面。一旦用户获得了 EC2 实例的 SSH 远程访问权限,IAM 的权限边界就会被显著弱化。例如,Alice 只有管理自己创建的 EC2 实例的 IAM 权限,且无法通过 AWS 控制台访问 Bob 的资源。但如果 Alice 获得了 Bob 实例的 SSH 访问权限(通过获取私钥或密码),她就能绕过 IAM 限制,在 Bob 的实例上执行操作。更严重的是,如果Bob的实例拥有高权限的 IAM 角色,Alice 甚至可以利用这些权限在 AWS 环境中执行更广泛的操作。
因此,接下来我们探讨如何更安全地实现 EC2 实例的远程管理,以弥补这一安全“短板”。
EC2 远程连接方案对比
远程访问 Amazon EC2 实例主要有以下四种方式:
- Secure Shell (SSH) 远程访问
- AWS Systems Manager 会话管理器
- 适用于 Linux 实例的 EC2 Serial Console
- Amazon EC2 Instance Connect
SSH 远程访问
SSH(Secure Shell)广泛应用于远程服务器管理和文件传输,作为传统且最常用的连接方式,它通过非对称加密技术确保通信安全,使用密钥对(如 .pem文件)进行身份验证。
![]() |
通过 SSH 客户端直接访问云端 EC2 实例
![]() |
通过堡垒机跳转访问私有子网中的 EC2 实例
通过堡垒机访问方案虽然避免了目标 EC2 实例的访问端口在公网暴露,但仍具有一些局限性:
- SSH 没有内置的连接日志记录和审核;
- 妥善保管 SSH 密钥文件需要额外措施,如定期轮换密钥;
- 密钥对一旦丢失,即无法再生。需要采取一些列手动操作进行恢复。有关更多信息请参阅如果我在 Amazon EC2 实例初次启动后丢失了 SSH 密钥对,如何连接到该实例?
Systems Manager 会话管理器
AWS Systems Manager 的会话管理器(Session Manager)是一个功能强大的安全管理工具,它提供了一种创新的方式来访问和管理 AWS 云中的托管节点(如 EC2 实例、本地服务器等)。该功能无需传统的 SSH 密钥管理或开放特定的入站端口,从而提升了安全性。
![]() |
通过 Session Manager 访问 VPC 子网中的 EC2 实例
通过与 AWS CloudTrail 的集成,用户可以审计所有来自 Session Manager 的访问记录,并能够用 AWS IAM 策略精细控制访问权限。Session Manager 虽然提供了诸多便利,但也存在一些值得注意的局限性和挑战:
- Session Manager 需要在目标实例上安装并运行 SSM Agent,增加了部署和维护的复杂性。
- 无法直接使用会话管理器传输文件,通常需要结合
s3 cp
或session-manager-plugin
+ SSH 隧道来交换数据。 - 对于某些特殊用例,如图形界面访问、高级端口转发或特定协议支持欠佳;
- 日志记录不适用于通过端口转发或 SSH 连接的会话管理器会话。这是因为 SSH 会加密所有会话数据,而会话管理器仅用作 SSH 连接的隧道。
EC2 Serial Console
EC2 Serial Console 串行控制台连接是 AWS 提供的低级别故障排除工具,特别适合在实例无法通过 SSH/RDP 等常规方式访问时使用。它能在网络配置错误、操作系统崩溃或引导问题等场景下提供系统级访问。
使用前需要满足几个条件:实例必须基于 Nitro 系统、账户需启用 Serial Console 访问权限,同时需要为操作系统用户预先设置密码。值得注意的是,每个 AWS 账户在每个区域同一时间只能维持一个活跃的串行控制台连接,且连接仅支持文本界面。
基于这些特性,建议将串行控制台连接作为故障处理的应急方案,而非日常管理工具。它的主要价值在于为那些遇到严重系统问题、无法通过常规方式访问的 EC2 实例提供最后的救助手段。
Amazon EC2 Instance Connect Endpoint
AWS 早在 2019 年 6 月发布了 EC2 Instance Connect 功能(以下简称 EIC),方便用户在 Web 浏览器上通过 SSH 安全访问 EC2 实例。EC2 Instance Connect 提供多种选项,无需长期存储或共享 SSH 密钥即可连接到 EC2 实例。
在初始版本的 EC2 Instance Connect 要求实例必须具有公网地址,限制了其在私有子网中的应用场景。因此,AWS 于 2023 年 6 月推出了 Amazon EC2 Instance Connect (EIC) Endpoint 功能,让用户可以安全地连接到私有子网的 EC2 实例。
![]() |
通过 EIC Endpoint 访问私有子网中的 EC2 实例
EIC Endpoint 创建了一个托管的安全通道,通过 AWS 网络将连接请求路由到您的私有实例,同时保持实例的网络隔离状态。这种方式不再需要 VPC 中的 IGW、公有 IP 地址、VPN 或 AWS Direct Connect 任何代理来连接到私有子网。
EIC Endpoint 结合了基于身份和基于网络的访问控制,提供满足企业安全需求所需的隔离、控制和日志记录。相比于传统的远程管理方案,EC2 Instance Connect Endpoint 具有更多优势,例如:
- 安全性 – 它是一个身份感知的 TCP 代理,在流量到达 VPC 之前进行身份验证和授权
- 访问控制 – 可以使用 IAM 策略控制谁可以创建和使用 Endpoint,可选择保留源 IP 地址便于实例端进行访问控制
- 审计 – 所有连接尝试都会记录到 CloudTrail
- 配置简单 – 只需将 Endpoint 附加到 VPC 子网即可
- 不需要在目标实例上安装代理,Session Manager 需要安装 Systems Manager Agent
- 访问简单 – 只需指定实例 ID 即可连接,无需管理 SSH 密钥,无需 IP 地址
- 不需要在客户端上安装插件,Session Manager 需要安装 Systems Manager Plugin
- 不需要目标子网有直接的互联网连接,Session Manager 需要通过 NAT Gateway 或 VPC 接口端点提供出站互联网连接
- 灵活性 – 支持连接到任何支持 TCP 的实例,包括 Linux 和 Windows,兼容 SSH/RDP 传统的连接协议
- 经济性 – 无额外使用成本,免除维护和修补堡垒主机以实现连接的运营开销
使用 EIC Endpoint 访问 EC2实例
前置准备
1. EC2 Instance Connect 软件包
EC2 Instance Connect 软件包 是一个轻量级工具集,专注于增强 SSH 访问的安全性,不运行持久性后台服务或守护进程,因此不是传统意义上的代理程序。如果您使用 Amazon 官方 AMI 已经预装了 EC2 Instance Connect 软件包。
如使用自定义 AMI,需要在被管理的 EC2 实例上执行以下步骤进行安装:
2. 在 VPC 中创建 EC2 Instance Connect Endpoint
这个 Endpoint 是一个由 AWS 管理的服务终端节点,位于 VPC 内,我们在 EC2 实例所在 VPC 创建 EC2 Instance Connect Endpoint
![]() |
注:这里可以选择保留源 IP 地址,便于实例端进行访问控制。
为 EC2 Instance Connect Endpoint 选择安全组【eic-management】和 子网。EIC Endpoint 可以跨子网访问到其它 EC2 实例,建议将 EIC endpoint 放在私有子网中。
![]() |
注:本示例中将 EC2 实例管理和 EIC Endpoint 使用同一个安全组【eic-management】。
3. 配置实例安全组允许来自 EIC Endpoint 的入站流量
方式一:被管理的 EC2 实例安全组允许来自 EIC Endpoint 所在安全组的访问
![]() |
方式二:被管理的 EC2 实例安全组允许 EC2 Instance Connect service IP 地址段访问管理端口
![]() |
可以在控制台的 EC2 Instance Connect 界面可以找到 EC2 Instance Connect Service IP 范围:
![]() |
或在 AWS IP 范围 JSON 文件 (https://ip-ranges.amazonaws.com/ip-ranges.json) 中查找【EC2_INSTANCE_CONNECT】对应的 AWS Region 下的 IP 地址范围。
4. 适当的 IAM 权限
用户通过 EIC 访问 EC2 实例之前,需要为 IAM User 添加以下基本权限:
ec2:DescribeInstances
– 查询实例信息的权限ec2-instance-connect:OpenTunnel
– 使用 EIC Endpoint 的权限ec2-instance-connect:SendSSHPublicKey
– 推送 SSH 公钥的权限
连接 EC2 实例
通过 Web 浏览器方式
登陆 AWS Web 控制台,在 EC2 控制台中选择实例 -> 点击”连接”按钮 -> 选择”EC2 Instance Connect Endpoint”选项 -> 点击”连接”即可。系统自动选择一个合适的 EC2 Instance Connect Endpoint 作为代理,并在浏览器中打开终端会话:
![]() |
通过命令行方式访问
这种方式只需要安装 AWS CLI 命令行工具,不需要额外安装 ssh 客户端软件。
通过 EIC Endpoint 成功连到 EC2 Linux 终端:
![]() |
为了方便使用,我们可以为每个 EC2 实例创建一个快捷方式(指向 EIC 连接的命令)实现双击鼠标打开远程连接,以 Windows 客户端为例:
![]() |
双击快捷方式远程访问 EC2 实例
通过 EICE 访问 Windows 实例
通过 EC2 Instance Connect Endpoint 访问 Windows 实例的方法与访问 Linux 实例有所不同,我们将采用另一种连接方式,详细步骤如下:
1. 通过 EIC 创建从本地本地端口 3389 到实例 RDP 端口 3389 的安全 TCP 隧道
![]() |
2. 首次登连接 Windows 实例时,需要获取管理员密码
3. 使用 RDP 客户端连接到 localhost:3389,如:mstsc /v:localhost:3389
![]() |
精细化访问控制
通过 EIC Endpoint 可以避免用户绕过IAM的权限管控,以弥补这一安全“短板”。
结合 IAM 策略可以实现非常精细的访问控制,让管理员能够根据多种条件限制谁可以访问哪些实例,下面我将提供一些实现这种精细化控制的 IAM Policy 模板供参考。
1. 基于实例ID的访问控制
例如,只允许用户通过 EICE 连接到指定的 EC2 实例:
2. 基于实例标签的访问控制
例如,只允许用户连接到环境标签为”Dev”且带有与用户相同 Team 标签的实例:
3. 基于端口和协议的访问控制
例如,只允许访问 SSH 端口 (22),限制了 RDP 等其他协议的访问:
4. 基于时间和 IP 地址的访问控制
例如,只允许在工作时间,从特定 IP 范围访问:
5. 基于 AWS Organizations 的访问控制
例如,只允许特定 AWS 组织 “o-a1b2c3d4e5” 中的用户访问实例:
6. 组合多种条件的复杂策略
除此之外,管理员可以根据实际需求,通过组合多个限制条件(使用”Condition”),灵活地为用户分配访问特定 EC2 实例的权限。不限于以下条件
- 仅能连接特定资源标签的 EC2 实例 “StringEquals”: {aws:ResourceTag/tag-key”: “tag-value” }
- 仅能连接特定 IP 地址范围的实例 “IpAddress”: {ec2-instance-connect:privateIpAddress”: “0.1.0/31“}
- 仅从特定 IP 地址范围进行连接 “IpAddress”: { “aws:SourceIp”: “0.2.0/24“}
- 仅能以指定用户名进行连接 “StringEquals”: { “ec2:osuser”: “ami-username” }
注意事项
虽然使用 EC2 Instance Connect Endpoint 远程访问 EC2 实例有诸多优势,同时也需要注意其中的一些限制因素。
- ECI Endpoint 不适用于大容量数据传输,大容量数据传输将被限流
- ECI Endpoint 不支持连接到使用 IPv6 地址的实例
- ECI Endpoint 连接有默认的会话超时时间(通常为 60 分钟),超时后需要重新建立连接。
- 每个 VPC 和每个子网只能创建一个 EC2 Instance Connect Endpoint (Hard limit),详见文档
- 每个 EC2 Instance Connect 端点最大支持 20 个并发连接 (Hard limit),详见文档
- 流量通过 transit gateway 路由时,不支持客户端 IP 保留功能
EIC Endpoint 原理解析
EC2 Instance Connect Endpoint 如何不使用 Private key 或 用户/密码 进行远程访问?接下来我们结合使用 EIC Endpoint 连接 EC2 实例的完整过程讲解其原理。
![]() |
连接流程
1. 发起连接请求:
- 用户通过 AWS 控制台、CLI 或 SDK 发起连接请求
- 指定目标 EC2 实例 ID 和 EIC Endpoint ID
2. 身份验证与授权:
- AWS 验证用户的 IAM 凭证
- 确认用户是否有权限使用EIC Endpoint 和访问指定的实例
3. 临时密钥生成:
- EC2 Instance Connect 服务为本次连接生成一个临时 SSH 密钥对
- 这个密钥对有严格的时间限制,通常只在会话期间有效
4. 公钥部署:
- 临时 SSH 公钥通过 EC2 Instance Connect API 推送到目标实例
- 公钥存储在实例的实例元数据服务(IMDS)中
- 公钥与特定的用户名关联(如 ec2-user、ubuntu 等)
5. 安全通道建立:
- EIC Endpoint 在用户客户端和 EC2 实例之间建立加密的 TCP 通道
- 通道完全在 AWS 网络内部,使用 TLS 加密保护数据传输
6. SSH 连接初始化:
- AWS 服务使用临时 SSH 私钥代表用户初始化 SSH 连接
- 连接请求通过已建立的安全通道传输到实例
7. 实例端身份验证:
- EC2 实例上的 SSH 守护进程接收连接请求
- SSH 配置中的 AuthorizedKeysCommand 脚本执行,从实例元数据中检索临时公钥
- 脚本路径通常为 /opt/aws/bin/eic_run_authorized_keys
- SSH 守护进程验证连接请求使用的私钥与检索到的公钥匹配
8. 会话建立与终止:
- 身份验证成功后,SSH 会话建立
- 用户可以通过控制台、CLI 或 SDK 界面与实例交互
- 会话结束后(用户断开连接或超时),临时 SSH 密钥对被丢弃
- 临时公钥从实例元数据中自动移除(通常在几分钟内)
AuthorizedKeysCommand 脚本
整个过程中,EC2 Instance Connect 的 AuthorizedKeysCommand 脚本在 EC2 实例的 SSH 认证过程中扮演着重要角色,它使得用户可以通过 AWS IAM 权限安全地连接到 EC2 实例,而无需在实例上永久存储 SSH 密钥或管理 authorized_keys 文件。该脚本由以下 3 部分构成:
- eic_run_authorized_keys – 主入口脚本,接收 SSH 守护进程传递的参数(如用户名),并协调整个验证流程。
- eic_curl_authorized_keys – 验证脚本是否在 EC2 实例上运行,并从 EC2 实例元数据服务(IMDS)中获取为该用户临时推送的 SSH 公钥信息。
- eic_parse_authorized_keys – 处理从元数据服务获取的密钥数据,验证密钥的签名和有效性,确保密钥是通过合法的 EIC API调用推送的,验证通过后将有效的公钥提供给 SSH 守护程序用于认证.
![]() |
总结
本文深入探讨了 AWS EC2 实例的安全运维实践,特别是如何实现安全高效的远程访问。对比传统远程访问方案,EC2 Instance Connect Endpoint (EIC Endpoint) 通过托管安全通道实现对私有子网中 EC2 实例的访问,无需公网地址、堡垒机或 VPN,并结合了基于身份和网络的访问控制、简化了连接流程、提供了完整的审计日志,且无需在目标实例安装额外代理。通过与 IAM 策略结合,EIC Endpoint 有效解决了传统远程访问方案中用户获得 SSH 密钥后可能绕过 IAM 权限限制的安全隐患,实现了基于实例 ID、标签、端口、时间和组织结构等多维度的精细化访问控制。
在实际应用中,AWS EC2 安全运维应采用全方位策略,包括构建最小权限模型、实施全链路数据保护、建立漏洞管理闭环和加强网络安全防护,而 EIC Endpoint 作为远程访问的最佳实践,为企业提供了既安全又便捷的 EC2 实例管理方案。