亚马逊弹性计算云 (Amazon EC2)
实例元数据服务 (IMDS) 可帮助客户构建安全和可扩展的应用程序。IMDS 通过提供对临时和经常轮换的证书的访问权限,以及无需手动或编程方式对实例进行硬编码或分发敏感凭证,来解决云用户面临的安全挑战。
实例元数据服务版本 2 (IMDSv2) 增加了保护;具体而言,IMDSv2
使用面向会话的身份验证,并进行了以下增强:
- IMDSv2 需要在简单的 HTTP PUT 请求中创建秘密令牌才能启动会话,该令牌必须用于检索 IMDSv2 调用中的信息。
- 在后续的 IMDSv2 请求中必须将 IMDSv2 会话令牌用作标头,以便从 IMDS 检索信息。与静态令牌或固定标头不同,当使用令牌的进程终止时,会话及其令牌将被销毁。IMDSv2 会话最多可以持续六个小时。
- 会话令牌只能直接从该会话开始的 EC2 实例中使用。
- 您可以在每次请求中重复使用令牌或创建新令牌。
- 如果会话令牌 PUT 请求包含 X-forwarded-For 标头,则会被阻止。
在之前的
博客文章
中 ,我们解释了这些新的保护措施如何为第三方和外部应用程序漏洞提供深度防御,这些漏洞可能被用来尝试访问IMDS。
除非你禁用 IMDSv1,否则你将无法获得 IMDSv2 的全部好处。虽然 IMDS 由实例本身提供,但对 IMDS 的调用来自您的软件。这意味着您的软件必须支持 IMDSv2,然后才能禁用 IMDSv1。除了 支持 IMDSv2 的 亚马逊云科技 软件开发工具包、CLI 和
SSM 代理
等工具外,您还可以使用 IMD
S 数据包分析器 来准确确定需要更新的内容,以便让您的实例准备好仅使用 IM
DSv2。这些工具可以更轻松地过渡到IMDSv2以及在禁用IMDSv1的情况下启动新的基础架构。使用
AL2023
启动的所有实例都将实例 设置为默认情况下仅提供 IMDSv2(IMDSv1 已禁用),而 AL2023 也不调用 IMDSv1。
想要从IMDSv2中受益的亚马逊云科技客户告诉我们,他们希望在新的和现有的长期运行的亚马逊云科技基础设施上使用IMDSv2。这篇博文向您展示了可扩展的解决方案,用于识别提供 IMDSv1 的现有基础架构、如何在您的基础架构上过渡到 IMDSv2 以及如何完全禁用 IMDSv1。阅读此博客后,您将能够将新推出的亚马逊 EC2 设置为 IMDSv2。您还将学习如何识别发出 IMDSv1 调用的现有软件,这样您就可以采取措施更新软件,然后要求在现有 EC2 基础设施上使用 IMDSv2。
识别支持 IMDSv1 的 EC2 实例
过渡到 IMDSv2 的第一步是识别所有支持 IMDSv1 的现有的 EC2 实例。你可以通过多种方式做到这一点。
使用控制台
您可以使用 亚马逊云科技 管理控制台亚马逊 EC2 页面中的 IMDSv2
属性列来识别支持 IMDSv1 的实例。
要查看 IMDSv2 属性列,请执行以下操作:
- 打开 Amazon EC2 控制台并转到 实例。
- 选择右上角的设置图标。
- 向下滚动到 IMDSv2 ,打开滑块。
- 选择 “ 确认 ” 。
这为您提供了实例的 IMDS 状态。 可选 状态 表示实例上已启用 IMDSv1, 必填 状态 意味着 IMDSv1 已禁用。
图 1:控制台中 EC2 实例的 IMDS 版本示例
使用 亚马逊云科技 命令行界面
您可以通过运行 aws ec2 描述实例命令并检查 HttpTokens 的值,使用
AW S 命令行接口 (A WS CLI)
识别支持 IMDSv1 的实例 。 HttpTo kens 的 值决定了 启用哪个版本的 IMDS, 可选 启用 imdsV1 和 IMDSv2,必填表示需要 imdsV2。 与使用控制台类似, 可选 状态表示实例上已启用 IMDSv1, 必填 状态 表示 IMDSv1 已禁用。
"MetadataOptions": {
"State": "applied",
"HttpEndpoint": "enabled",
"HttpTokens": "optional",
"HttpPutResponseHopLimit": 1
},
[ec2-user@ip-172-31-24-101 ~]$ aws ec2 describe-instances | grep '"HttpTokens": "optional"' | wc -l
4
使用 亚马逊云科技 Config
亚马逊云科技 Config
会 持续评估、审计和评估您在 亚马逊云科技、本地和其他云上的资源的配置和关系。亚马逊云科技 Config 规则
ec2-imdsv2-check 会检查
您的亚马逊 EC2 实例元数据版本是否配置了 IMDSv2。如果 HttpTok ens 设置为 可选 ,这意味着 EC2 实例启用了 IMDS v1,则该规则不兼容。
图 2:亚马逊云科技 Config 控制台中不合规的 EC2 实例示例
启用此 亚马逊云科技 Config 规则后,您可以
通过亚马逊简单通知服务 (Amazon SN S) 设置 亚马逊云科技 Config 通知
。
使用安全中心
亚马逊云科技 Security Hub
在账户和组织层面 提供检测和警报功能。您可以在 Security Hub 中配置
跨区域聚合
,以深入了解跨区域的调查结果。如果使用
亚马逊云科技 Or
ganizations ,则可以配置一个 S
ecurity Hub 指定账户
, 以汇总组织中各个账户的调查结果。
Security Hub 有 Amazon EC2 控件 (
[EC2.8] Amazon EC2 实例应使用实例元数据服务版本 2 (IMDSv2) )
,该版本使用 亚马逊云科技 Config 规则
ec2-imdsv2-check 来检查实例元数据版本是否配置了 IMDSv
2。如果 HttpTok ens 设置为 可选,这意味着 EC2 实例 启用了 IMDSv 1,则该规则不兼容。
图 3:显示不合规的 EC2 实例的 亚马逊云科技 Security Hub 示例
使用
Amazon Event Bridge
,您还可以在 EC2 实例不符合 IMDSv2 时为安全中心的调查结果设置警报。
{
"source": ["aws.securityhub"],
"detail-type": ["Security Hub Findings - Imported"],
"detail": {
"findings": {
"ProductArn": ["arn:aws:securityhub:us-west-2::product/aws/config"],
"Title": ["ec2-imdsv2-check"]
}
}
}
确定 EC2 实例是否在进行 IMDSv1 调用
并非所有软件都会调用 IMDSv1;您的依赖库和工具可能已经与 IMDSv2 兼容。但是,为了缓解要求使用 IMDSv2 和完全禁用 IMDSv1 所产生的兼容性问题,你必须检查软件中是否有剩余的 IMDSv1 调用。在您确定存在启用了 IMDSv1 的实例后,请调查您的软件是否正在拨打 IMDSv1 调用。大多数应用程序在实例启动和关闭时都会调用 IMDSv1。对于长时间运行的实例,我们建议在启动或停止和重启周期中监控 IMDSv1 调用。
你可以通过查看 Amazon CloudWatch 中的 m
etadatanoToken 指标
来检查你的软件是否正在调用 IMDSv1。
您可以使用 IMD
S
数据包分析器工具进一步识别 IMDSv1 呼叫的来源。
使用 CloudWatch 检查 IMDSv1 使用情况的步骤
- 打开 CloudWatch 控制台。
- 前往 “ 指标” ,然后转到 “ 所有指标” 。
- 选择 EC2 ,然后选择 每实例指标 。
- 搜索并添加您感兴趣的实例 的指标 metadatan oToken 。
图 4:MetadatanoToken 每实例指标的 CloudWatch 控制面板
您可以 在 CloudWatch 中使用
表达式
来查看账户范围内的指标。
SEARCH('{AWS/EC2,InstanceId} MetricName="MetadataNoToken"', 'Maximum')
图 5:使用 CloudWatch 表达式查看 MetadatanoToken 的账户范围内的指标
您可以在 CloudWatch 中组合搜索和排序表达式,以帮助识别使用 IMDSv1 的实例。
SORT(SEARCH('{AWS/EC2,InstanceId} MetricName="MetadataNoToken"', 'Sum', 300), SUM, DESC, 10)
图 6:使用 CloudWatch 表达式查看账户范围指标的另一个示例
如果您有多个 亚马逊云科技 账户或使用 亚马逊云科技 Organizations,则可以使用
CloudWatch 跨账户可观察性 设置集中监控账户
。
IMDS 数据包分析器
IMDS 数据包分析器是一个开源工具,用于识别和记录来自您的软件的 IMDSv1 调用,包括实例上的软件启动。该工具可以帮助识别在EC2实例上进行IMDSv1调用的软件,从而使您能够准确地确定需要更新的内容以使软件准备好使用IMDSv2。您可以通过命令行运行 IMDS 数据包分析器或将其作为服务进行安装。有关更多信息,请参阅
GitHub 上 的 IMDS 数据包分析器
。
禁用 IMDSv1 并仅维护 IMDSv2 实例
在您监控并验证您的 EC2 实例上的软件没有进行 IMDSv1 调用后,您可以在这些实例上禁用 IMDSv1。对于所有兼容的工作负载,我们建议使用
亚马逊 Linux 2023
,它提供了多项改进(参见
发布公告
),包括默认要求使用 IMDSv2(禁用 IMDSv1)。
您还可以创建和修改 AMI 和 EC2 实例来禁用 IMDSv1。
配置 AMI
提供有关如何通过将 imds-su ppor t 参数设置为 v2.0 来注册新 AMI 或更改现有 AMI 的指导。 如果您使用的是容器服务(例如 ECS 或 EKS),则可能需要更大的跳数限制以帮助避免回退到 IMDSv1。你可以使用 m
odify-instance-metadata-op
tions 启动参数来进行更改。我们建议在容器环境中使用跳数限制为三次进行测试。
创建新实例
对于新实例,您可以通过使用运行实例 CLI 命令指定 元数据 选项参数来禁用 IMDSv1 并启用 IMDSv2。
aws ec2 run-instances
--image-id <ami-0123456789example>
--instance-type c3.large
--metadata-options “HttpEndpoint=enabled,HttpTokens=required”
修改正在运行的实例
aws ec2 modify-instance-metadata-options \
--instance-id <instance-0123456789example> \
--http-tokens required \
--http-endpoint enabled
配置新的 AMI
aws ec2 register-image \
--name <my-image> \
--root-device-name /dev/xvda \
--block-device-mappings DeviceName=/dev/xvda,Ebs={SnapshotId=<snap-0123456789example>} \
--imds-support v2.0
修改现有 AMI
aws ec2 modify-image-attribute \
--image-id <ami-0123456789example> \
--imds-support v2.0
使用控制台
如果您使用控制台启动实例,则选择 从 亚马逊云科技 控制台 启动实例 后 ,选择 高级详细信息 选项卡,向下滚动到 元数据版本 , 然后选择 仅限 V2(需要令牌) 。
图 7:使用控制台修改 IMDS 版本
使用 EC2 启动模板
您可以使用
EC2 启动模板 作为实例配置模板
,
Amazon Auto Scaling
组可以使用该模板启动 EC2 实例。使用控制台创建启动模板时,您可以指定 元数据版本 并选择 仅限 V2(需要令牌) 。
图 8:修改 EC2 启动模板中的 IMDS 版本
将 CloudFormation 与 EC2 启动模板搭配使用
使用
亚马逊云科技 CloudFormation
创建
EC2 启动模板
时 ,必须通过根据需要设置 HTTpTokens 来指定
metadataOption
s 属性以仅使用 IMDSv2。
在此状态下,检索
亚马逊云科技 身份和访问管理 (IAM) Access Management
角色证书始终返回 IMDSv2 证书;IMDSv1 证书不可用。
{
"HttpEndpoint" : <String>,
"HttpProtocolIpv6" : <String>,
"HttpPutResponseHopLimit" : <Integer>,
"HttpTokens" : required,
"InstanceMetadataTags" : <String>
}
使用系统管理器自动化操作手册
你可以运行 亚马逊云科技 Systems Manager 中提供的 Enforcec
2InstanceimdsV2 自动化文档,该文档将使用 modifyInstanceMet
adat
aOpti ons API 在 EC2 实例
上强制执行 imdsv2。
- 打开
系统管理器控制台
,然后 从导航窗格中选择 “ 自动化 ”。
- 选择 “ 执行自动化 ” 。
- 在 “ 亚马逊 所有 ” 选项卡上,在 “ 自动化” 文档 中,输入 Enfor cec2InstanceimdsV2 ,然后按 E nter。
- 选择 Enf orcec2InstanceimdsV 2 文档,然后选择 “下一步”。
- 对于 “ 执行自动化文档 ” ,选择 “ 简单执行 ” 。
注意 :如果您需要在多个目标上运行自动化,请选择 “ 速率控制 ” 。
- 对于 输入参数 ,在实例 ID 下 输入 EC2 实例的 ID
- 在 AutomationAssumeRole 中,选择 一个角色。
注意 :要更改目标 EC2 实例,A utomationAssumeRole 必须具有 ec2: ModifyInstanceMetadat aOptions 和 ec 2: DescribeInstanceInstance 权限。 有关为系统管理员自动化创建代入角色的更多信息,请参阅
为自动化 创建服务角色
。
- 选择 “ 执行 ” 。
使用 亚马逊云科技 CDK
如果您使用
亚马逊云科技 云开发套件 (亚马逊云科技 CDK)
启动实例,则可以使用它 来设置
requireimdsV2 属性以禁用 IMDSv1 并启用 IMDSv2
。
new ec2.Instance(this, 'Instance', {
// <... other parameters>
requireImdsv2: true,
})
使用 亚马逊云科技 开发工具包
适用于
Java 的 亚马逊云科技 开发工具包 2.x
的新客户端 使用 IMDSv2,您可以使用新客户端来检索 EC2 实例的实例元数据。有关说明
,请参阅适用于 Java 的 亚马逊云科技 开发工具包 2.x 中 引入用于检索 EC2 实例元数据的新客户端
。
仅维护 IMDSv2 EC2 实例
要仅维护 IMDSv2 实例,您可以实施服务控制策略和 IAM 策略,以验证您的 EC2 实例上的用户和软件只能使用 IMDSv2 的
实例元数据
。此策略规定, 运行实例 API 调用要求 EC2 实例仅使用 IMDSv2。我们建议在关联账户中的所有实例都没有 IMDSv1 调用并且您已将所有实例迁移到仅使用 IMDSv2 之后实施此策略。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "RequireImdsV2",
"Effect": "Deny",
"Action": "ec2:RunInstances",
"Resource": "arn:aws:ec2:*:*:instance/*",
"Condition": {
"StringNotEquals": {
"ec2:MetadataHttpTokens": "required"
}
}
}
]
}
您可以在《
EC2 用户指南 》 中找到有关适用的服务控制策略 (SCP) 和 IAM 策略的
更多详细信息。
使用条件密钥限制凭证的使用
作为额外的防御措施,您可以限制使用您的 Amazon EC2 角色证书,使其仅在颁发证书的 EC2 实例中使用时才有效。此控件与 IMDSv2 相辅相成,因为两者可以协同工作。
EC2 凭证控制属性
(
aws: ec2InstanceSourceVPC 和 aws: ec2InstanceSourceP rivate
IPv4 )的 AW
S 全局条件上下文密钥
限制了可以使用您的 EC2 实例证书的 VPC 终端节点和私有 IP,您可以在服务控制策略 (SC P) 或 IAM 策略中使用这些密钥。
这些政策的示例
在这篇博客文章
中 。
结论
除非你禁用 IMDSv1,否则你将无法获得 IMDSv2 的全部好处。在这篇博客文章中,我们向您展示了如何识别支持 IMDSv1 的 EC2 实例,以及如何确定您的软件是否以及何时调用 IMDSv1。我们还向您展示了在您的软件不再调用 IMDSv1 后,如何在新的和现有的 EC2 基础设施上禁用 IMDSv1。您可以使用这些工具来转换现有的 EC2 实例,并将新的 EC2 启动设置为仅使用 IMDSv2。
如果您对这篇文章有反馈,请在下面的评论部分提交评论。如果您对这篇文章有疑问,请在
亚马逊云科技 Compute re: Pos
t 上开始一个新话题 或
联系 亚马逊云科技 S
upport。
想了解更多 亚马逊云科技 安全新闻?在
推特
上关注我们 。