
应用安全SASTIaC【免费下载链接】tfsecTfsec is now part of Trivy项目地址https://gitcode.com/gh_mirrors/tf/tfsec点击查看免费下载本文以 tfsec 的aws-ec2-enforce-http-token-imds规则(内部编号 AWS079)为核心,讲清它检查什么、为什么重要、如何在 Terraform 代码中通过检查,并结合 tfsec 仓库中的规则表、遗留 ID 映射、示例配置与测试用例,展示如何用 tfsec 命令行验证修复效果。读完后你可以直接在自己的 Terraform 项目中定位并修复aws_instance的 IMDSv2 配置问题,并掌握忽略、排除与自定义检查这类配套用法。规则概览:aws-ec2-enforce-http-token-imds (AWS079)该规则的定义性描述是:aws_instance should activate session tokens for Instance Metadata Service.(aws_instance应当激活实例元数据服务的会话令牌)。属性值依据规则 IDaws-ec2-enforce-http-token-imds规则总表 rules.md#L71遗留(legacy) IDAWS079internal/pkg/legacy/map.go#L36Provider / Serviceaws / ec2rules.md#L71默认严重级别High规则文档 docs/checks/aws/ec2/enforce-http-token-imds/index.md适用资源aws_instance同上两个 ID 的关系可以从源码确认:tfsec 在 internal/pkg/legacy/map.go 中维护了一张AWS079 - aws-ec2-enforce-http-token-imds的映射表,并提供FindIDs函数做反向查询。这意味着在旧版 tfsec 报告中以AWS079出现的发现,与新版报告中以长 ID 出现的发现是同一条规则——在跨版本对账存量报告时,这张映射表是重要的核对依据。该规则在 EC2 规则族中的位置可以见 docs/checks/aws/ec2/index.md:它与enforce-launch-config-http-token-imds(针对启动模板)并列,共同构成 EC2 侧的 IMDSv2 加固检查。威胁模型:为什么 IMDS 需要会话令牌规则文档给出的解释很简洁:IMDS v2 (Instance Metadata Service) introduced session authentication tokens which improve security when talking to IMDS. By defaultaws_instanceresource sets IMDS session auth tokens to be optional.用中文展开一下背景:IMDS(实例元数据服务)是 EC2 实例内部的本地 HTTP 端点,应用通过它可以获取实例的 Profile、临时安全凭证(IAM Role 凭证)、用户数据等敏感信息。IMDS v1是无状态的:任何能访问该端口的进程发一个 GET 就能拿到元数据。一旦实例上运行着存在 SSRF(Server-Side Request Forgery)漏洞的应用,攻击者就可能借道应用进程去请求本地元数据端点,直接窃取临时 IAM 凭证。IMDS v2引入会话令牌:客户端必须先向元数据端点发PUT请求获取一个会话令牌(设置过期时间),之后的GET请求都必须携带该令牌。这个先 PUT 后 GET的协议特征使得常规 SSRF 载荷难以绕过,从而把元数据访问限定在实例内真正会主动发起令牌交换的合法客户端上。规则文档中列出的可能影响(Possible Impact)是:Instance metadata service can be interacted with freely——即元数据服务可被任意进程自由交互,凭证泄露风险随之而来。建议的修复方式(Suggested Resolution)则是:Enable HTTP token requirement for IMDS——为 IMDS 启用 HTTP 令牌强制要求。判定逻辑与修复方式:metadata_options 块规则文档原文指出,要完全保护 IMDS,需要使用aws_instance的metadata_options块并将其中的http_tokens变量设置为required。不安全的写法(规则会失败)resource aws_instance bad_example { ami ami-005e54dee72cc1d00 instance_type t2.micro }该aws_instance没有声明metadata_options,IMDS 会话令牌保持默认状态(不强制),会触发aws-ec2-enforce-http-token-imds失败。安全的写法(规则会通过)resource aws_instance good_example { ami ami-005e54dee72cc1d00 instance_type t2.micro metadata_options { http_tokens required } }只要http_tokens required,该实例强制使用 IMDS v2,规则检查通过。仓库中的更完整示例tfsec 仓库自带的自定义检查示例 _examples/custom_functions/main.tf#L1-L11 给出了一个更完整的metadata_options配置,展示了该块中其他常用字段:resource aws_instance bastion { metadata_options { http_endpoint enabled http_put_response_hop_limit 1 http_tokens required } tags { Environment test } }从该示例可以看出metadata_options块内通常包含三类字段:http_endpoint(元数据端点是否可用)、http_put_response_hop_limit(元数据响应允许经过的跳转层数,示例中取最小值 1,可进一步收敛元数据可达范围)以及本规则关注的http_tokens。对本规则而言,判定的核心是http_tokens是否等于required;http_endpoint disabled之类的做法虽然从根本上关闭了元数据端点,但不是本规则的预期写法,且会破坏依赖 IMDS 的常规工作负载(如 EC2 IAM 角色),应作为特殊场景对待。兄弟规则:同一防御面上的其他入口IMDSv2 强制要求并不只在aws_instance上设置。从 docs/checks/aws/ec2/index.md 的规则列表与对应文档页可以看到 tfsec 覆盖了 EC2 生态中几个会生成实例元数据的资源:aws-ec2-enforce-http-token-imds(本文主角):针对aws_instance资源。aws-ec2-enforce-launch-config-http-token-imds:针对启动模板(文档页),示例资源为aws_launch_template,修复方式同样是添加metadata_options { http_tokens required }。aws-autoscaling-enforce-http-token-imds:自动扩展域下的同名规则(文档页),同样面向aws_launch_template这类启动配置资源。实际项目里,如果实例是经由aws_launch_template或aws_launch_configuration创建的,aws_instance规则不会命中,但对应资源上的兄弟规则会命中。修复思路完全一致,建议在代码评审时把这三个规则一起纳入检查。用 tfsec 验证:从扫描到修复闭环基本运行tfsec 通过静态分析 Terraform 代码发现潜在误配置。基本用法是扫描指定目录,不传目录时默认扫描当前工作目录(见 README.md 的 Usage 一节):tfsec .退出码语义可以在源码 internal/app/tfsec/cmd/root.go#L139-L154 的getDetailedExitCode中确认:无失败规则返回 0;失败规则全部为 LOW 级别时返回专用退出码 2;存在 CRITICAL/HIGH/MEDIUM 级别的失败则返回 1。aws-ec2-enforce-http-token-imds默认严重级别为 High,因此命中后(未加--soft-fail时)退出码为 1,可以直接用于 CI 卡点。常用的配套参数(定义于 internal/app/tfsec/cmd/flags.go):# 只查看是否通过,把通过项也打印出来 tfsec . --include-passed # JSON 输出便于管道处理 tfsec . --format json # 临时排除某条规则(例如迁移期先豁免) tfsec . -e aws-ec2-enforce-http-token-imds-e/--exclude接收逗号分隔的规则 ID 列表;--format支持lovely、json、csv、checkstyle、junit、sarif、text、markdown、html、gif等格式。文件内忽略与到期时间如果某处确实需要保留默认 IMDS 行为,可以按 README.md 的 Ignoring Warnings 一节,在问题行或块上方添加忽略注释:resource aws_instance legacy { ami ami-005e54dee72cc1d00 instance_type t2.micro #tfsec:ignore:aws-ec2-enforce-http-token-imds:exp:2025-01-02 }忽略注释支持yyyy-mm-dd格式的到期时间(如上面的:exp:2025-01-02),到期后忽略自动失效,避免豁免被无限期遗忘——对安全基线类规则尤其有用。进阶:用自定义检查约束完整的 metadata_options除了内置规则,tfsec 支持用户自定义检查。仓库测试文件 internal/pkg/custom/multiple_submatches_test.go#L13-L52 恰好展示了一个与本主题高度相关的自定义规则:要求aws_instance必须存在metadata_options块,且其中http_endpoint、http_put_response_hop_limit、http_tokens三个子项同时满足(isPresentand子匹配)。对应的通过/失败断言在TestInstanceMetadataEndpointPresent(L55)、TestInstanceMetadataEndpointMissing(L69,缺失块判失败)和TestOneSubmatchHasWrongValue(L78,任一项取值错误判失败)三个用例中,其中最后一个用例明确验证了http_tokens definitely-wrong-not-required会被判为不合规。从测试结构可以看出,tfsec 的自定义检查引擎能够对metadata_options这类嵌套块做存在性 逐项取值的联合判定。如果你所在团队的标准高于内置规则(例如还要求http_put_response_hop_limit 1),可以参照 docs/guides/configuration/custom-checks.md 编写自定义检查,复用同样的判定能力,而无需等待内置规则更新。实现位置说明:规则逻辑在 defsec 引擎中需要说明一点架构事实:本仓库(模块名github.com/aquasecurity/tfsec,见 go.mod)承载的是命令行入口、规则文档、规则表与遗留 ID 映射;实际的扫描与规则判定逻辑由依赖的 defsec 库提供——go.mod#L10 中声明了github.com/aquasecurity/defsec v0.84.1,而 internal/app/tfsec/cmd/root.go#L82-L83 中scanner.New(options...)与scnr.ScanFSWithMetrics(...)就是调用 defsec 的 Terraform 扫描器完成全量规则执行的。从源码结构看,aws-ec2-enforce-http-token-imds的具体判定函数定义在 defsec 依赖包内,tfsec 仓库负责承载、编排与呈现。这一点也解释了为什么仓库内的rules.md、docs/checks/**与internal/pkg/legacy/map.go是规则信息的三个可信来源:分别对应规则清单、规则文档与 ID 映射。另外注意 README.md 开头的迁移公告:tfsec 的扫描能力已并入 Trivy,官方建议社区逐步迁移(仓库内有 tfsec-to-trivy-migration-guide.md 说明对应关系)。如果你是在新项目选型,建议把本文的规则要点与迁移指南一并阅读,在 tfsec 与 Trivy 的 IaC 规则体系之间做映射。小结与核对清单针对aws-ec2-enforce-http-token-imds(AWS079),修复与验收可以归纳为一条清单:为每个aws_instance添加metadata_options块,并设置http_tokens required;对经由启动模板/启动配置创建实例的场景,同步检查aws-ec2-enforce-launch-config-http-token-imds与aws-autoscaling-enforce-http-token-imds;用tfsec .复扫确认命中消除,退出码归 0;确需豁免时使用带:exp:到期时间的#tfsec:ignore:注释;需要更高标准(如限制 hop limit)时,用自定义检查 子匹配扩展判定,参照 internal/pkg/custom/multiple_submatches_test.go。核心参考文件:规则文档:docs/checks/aws/ec2/enforce-http-token-imds/index.md规则总表:rules.md#L71遗留 ID 映射:internal/pkg/legacy/map.go#L36EC2 规则索引:docs/checks/aws/ec2/index.md完整配置示例:_examples/custom_functions/main.tf扫描入口与退出码:internal/app/tfsec/cmd/root.go命令行参数:internal/app/tfsec/cmd/flags.go赞分享应用安全SASTIaC【免费下载链接】tfsecTfsec is now part of Trivy项目地址https://gitcode.com/gh_mirrors/tf/tfsec点击查看免费下载相关推荐tfsec aws-ec2-enable-volume-encryption 规则解析Terraform 中 EBS 卷必须启用加密tfsec aws ec2 enable volume encryption 规则解析Terraform 中 EBS 卷必须启用加密 本文围绕 tfsec 内应用安全SASTIaCtfsec aws-ec2-enable-at-rest-encryption 检查详解确保 EC2 实例块设备静态加密tfsec aws ec2 enable at rest encryption 检查详解确保 EC2 实例块设备静态加密 tfsec 将 Terraform应用安全SASTIaCtfsec 规则解析aws-ec2-enable-launch-config-at-rest-encryption 检查未加密的启动配置块设备tfsec 规则解析aws ec2 enable launch config at rest encryption 检查未加密的启动配置块设备 本文围绕 tf应用安全SASTIaC上一篇GraalVM Truffle AOT 编译实战教程让静态语言在零预热下直接生成机器码下一篇Egg.js 安全策略详解版本支持、漏洞披露流程与 Shell 命令注入防护实战创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考