☰
tfsec 规则精讲:AWS IAM 组启用 MFA 强制(aws-iam-enforce-mfa)
2026/10/15 1:56:03 网站建设 项目流程
  • 应用安全
  • SAST
  • IaC

【免费下载链接】tfsec

Tfsec is now part of Trivy

项目地址:https://gitcode.com/gh_mirrors/tf/tfsec
点击查看免费下载

本文围绕 tfsec 内置的aws-iam-enforce-mfa检查规则展开,系统讲解该规则检测的 IAM 配置问题、默认严重级别、不安全的 Terraform 写法与通过检查的安全写法,并结合仓库内的真实示例模块terraform-module/enforce-mfa/aws给出可直接落地的修复方案。读完本文,你将掌握如何编写让 tfsec 放行的 IAM 组配置,以及在本地与 CI 中运行该规则的完整方法。

规则概览:检查什么、为何重要

aws-iam-enforce-mfa是 tfsec 内置的 AWS IAM 安全规则之一,其对应的规则文档位于 docs/checks/aws/iam/enforce-mfa/index.md,并在 mkdocs.yml 中注册到文档站点导航。该规则的检查对象是 AWS IAM 组(aws_iam_group)及关联的组策略:

  • 检查项:IAM 组是否启用了多因素认证(MFA)强制;
  • 默认严重级别:medium(中等);
  • 检测逻辑:扫描 Terraform 配置中声明的aws_iam_group,判断其是否通过组策略中的条件键aws:MultiFactorAuthPresent对 MFA 提出强制要求。

MFA 强制要求在用户通过密码登录或使用访问密钥执行操作时,额外提供第二个认证因素(如 TOTP 动态令牌、硬件密钥),从而在密码泄露的场景下为账户加一道安全闸门。IAM 用户账户一旦缺少 MFA 保护,攻击者仅需拿到一组口令即可接管账户权限,这正是该规则以medium严重级别提示风险的原因。

该规则与同目录下的 enforce-group-mfa 规则 语义相近(后者检查对象与措辞侧重 "IAM groups should have MFA enforcement activated"),两者共同构成 tfsec 对 AWS IAM 组 MFA 配置的双保险。完整的 IAM 检查清单可参考 docs/checks/aws/iam/index.md。

可能的隐患:不加 MFA 的账户风险

tfsec 对该规则给出的 "Possible Impact" 说明是:

User accounts are more vulnerable to compromise without multi factor authentication activated.

翻译过来即:未启用多因素认证的 IAM 用户账户更容易被攻破。具体表现为:

  1. 密码一旦泄露(弱口令爆破、钓鱼、凭据复用),攻击者可无阻碍登录控制台或调用 API;
  2. 缺乏第二认证因素时,安全团队难以通过异常登录设备/位置来阻断攻击;
  3. 合规审计(如 SOC 2、ISO 27001)通常要求特权账户具备 MFA 强制能力。

因此,该规则建议所有 IAM 组(尤其是包含高权限用户的组)都应绑定带 MFA 条件键的策略。

不安全的示例:这条配置必然失败

原规则文档给出的失败示例非常简单直观:

data aws_caller_identity current {} resource aws_iam_group developers { name = "developers" }

这段配置只会导致aws-iam-enforce-mfa检查失败,原因在于:

  • 它创建了 IAM 组developers,但没有为组附加任何策略;
  • 组内用户在执行任意 AWS API 操作时,不受aws:MultiFactorAuthPresent条件的约束;
  • 因此在 tfsec 的判定中,该组不具备 MFA 强制能力,命中medium级别告警。

在本地验证时,可直接对该文件运行 tfsec:

tfsec .

tfsec 默认扫描当前工作目录(详见 README.md),发现此类问题时退出码非零,在 CI 中即会阻断构建。

安全的示例:用条件键约束 MFA

要修复上述问题,需要为 IAM 组附加一份包含aws:MultiFactorAuthPresent条件键的组策略。原规则文档给出的安全示例通过给组绑定aws_iam_group_policy,在策略的条件块中强制要求调用者已完成 MFA 认证:

resource "aws_iam_group" "support" { name = "support" } resource aws_iam_group_policy mfa { group = aws_iam_group.support.name policy = <<EOF { "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Action": "ec2:*", "Resource": "*", "Condition": { "Bool": { "aws:MultiFactorAuthPresent": ["true"] } } } ] } EOF }

关键点解析:

元素作用
aws_iam_group_policy将策略内联附加到指定 IAM 组,组内所有用户继承该策略
Condition.Bool.aws:MultiFactorAuthPresent = ["true"]IAM 上下文键,声明仅当请求中携带有效的 MFA 认证结果时才允许Allow语句生效
Effect: Allow+ 条件键组合未通过 MFA 的请求会被隐式拒绝,达到"无 MFA 即无法执行操作"的强制效果

注意:示例中Action为ec2:*,在实际生产环境中应遵循最小权限原则,将 Action 与 Resource 收敛到业务实际需要的范围(这与 tfsec 的 no-policy-wildcards 规则 的检查思路一致)。

推荐实践:直接使用 enforce-mfa 官方模块

手写策略模板虽然可以绕过检查,但维护成本高。tfsec 原规则文档的 "Suggested Resolution" 明确推荐使用 Terraform 社区模块terraform-module/enforce-mfa/aws来统一落实 MFA 强制。仓库中提供了两份可直接复用的完整示例:

  • _examples/mfa/group.tf
  • _examples/mfa-module/main.tf

两份示例内容一致,核心配置如下:

data aws_caller_identity current {} resource aws_iam_group support { name = "support" } resource aws_iam_group developers { name = "developers" } module enforce_mfa { source = "terraform-module/enforce-mfa/aws" version = "0.12.0" policy_name = "managed-mfa-enforce" account_id = data.aws_caller_identity.current.id groups = [aws_iam_group.support.name] manage_own_signing_certificates = true manage_own_ssh_public_keys = true manage_own_git_credentials = true }

该模块的入参含义与用途:

参数说明
source/version模块来源与版本,示例固定为terraform-module/enforce-mfa/aws的0.12.0版本
policy_name生成的托管策略名称,示例为managed-mfa-enforce
account_id当前 AWS 账户 ID,通过data.aws_caller_identity.current.id动态获取
groups需要强制 MFA 的 IAM 组名列表,示例仅对support组启用
manage_own_signing_certificates是否允许用户管理自己的签名证书,置为true时策略会放开对应的自管理权限
manage_own_ssh_public_keys是否允许用户管理自己的 SSH 公钥
manage_own_git_credentials是否允许用户管理自己的 Git 凭据(用于 CodeCommit 等场景)

注意:示例中创建的developers组不在groups列表内,说明该模块支持按组粒度选择启用范围——未被纳入的组不受 MFA 强制,tfsec 会继续对其报出aws-iam-enforce-mfa告警。在仓库的测试数据 test/testdata/external-module/main.tf 中可以看到该模块在外部模块引用场景下的另一种写法(不显式传入groups与account_id),可用于验证 tfsec 对模块化配置的解析行为。

在 CI 中落地:运行、忽略与排除

将规则接入流水线只需要三步:

  1. 本地扫描:tfsec .,扫描指定目录(不传目录则扫当前工作目录),发现问题时退出码非零;
  2. 容器化运行:docker run --rm -it -v "$(pwd):/src" aquasec/tfsec /src(镜像选项详见 README.md);
  3. 按需豁免:对于确需豁免的告警,可在对应行添加#tfsec:ignore:aws-iam-enforce-mfa注释;若希望整个模块内的该类告警全部忽略,可将注释置于 module 块上方;如需设置过期时间,可使用#tfsec:ignore:aws-iam-enforce-mfa:exp:2025-01-02格式(详见 README.md)。

若团队暂时不启用该规则,也可通过-e参数在命令行中整体排除:tfsec . -e aws-iam-enforce-mfa。

小结

aws-iam-enforce-mfa以medium级别守护 AWS IAM 组的 MFA 底线:凡是未通过策略条件键强制 MFA 的 IAM 组都会被标记。修复路径有两条——手写带aws:MultiFactorAuthPresent条件键的组策略,或直接引入terraform-module/enforce-mfa/aws模块(参考 _examples/mfa/group.tf 的完整参数)。将本规则与同目录的密码策略类规则(set-minimum-password-length、set-max-password-age 等)组合使用,可系统性地加固 AWS IAM 的身份与访问管理防线。

  • 应用安全
  • SAST
  • IaC

【免费下载链接】tfsec

Tfsec is now part of Trivy

项目地址:https://gitcode.com/gh_mirrors/tf/tfsec
点击查看免费下载
上一篇:iTorrent:iPhone上最强大的种子下载器终极指南
下一篇:Netease_url开发指南:如何为网易云无损解析项目贡献代码和新功能

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询