【发布时间】:2020-08-12 04:21:39
【问题描述】:
资源aws_iam_policy_attachment有以下警告
警告:
aws_iam_policy_attachment资源会创建 IAM 策略的独占附件。在整个 AWS 账户中,附加单个策略的所有用户/角色/组必须由单个aws_iam_policy_attachment资源声明。这意味着即使通过任何其他机制(包括其他 Terraform 资源)具有附加策略的任何用户/角色/组都将被该资源撤销该附加策略。请考虑使用aws_iam_role_policy_attachment、aws_iam_user_policy_attachment或aws_iam_group_policy_attachment。这些资源不会强制附加 IAM 策略。
我们更改了部分代码
resource "aws_iam_policy_attachment" "logs" {
name = "${var.function_name}-logs"
roles = [aws_iam_role.lambda.name]
policy_arn = aws_iam_policy.logs[0].arn
}
到
resource "aws_iam_role_policy_attachment" "logs" {
name = "${var.function_name}-logs"
role = aws_iam_role.lambda.name
policy_arn = aws_iam_policy.logs[0].arn
}
上面的更改很简单,但现在 terraform 想要删除 aws_iam_policy_attachment 资源并添加 aws_iam_role_policy_attachment。以前,当我们使用共享托管 IAM 资源为模块应用 terraform 时,它会将策略与 30 个不同的 IAM 角色分离,迫使我们通过查找并重新应用我们的 terraform 模块来重新附加它们。
使用不那么危险的资源aws_iam_role_policy_attachment 的安全策略是什么?
我们目前的策略
-
将托管 IAM 策略重新创建为内联策略并添加到角色
-
使用 AWS 控制台手动删除托管策略
-
使用此 CLI 命令可能更容易。它只是出现在控制台中。
aws iam detach-role-policy \ --role-name my-role-name \ --policy-arn arn:aws:iam:1234567890:role/logs
-
-
从状态中移除坏资源
- 可能不需要,因为它已在上一步中删除
terraform state rm aws_iam_policy_attachment.logs
-
目标应用新附件
target apply -target aws_iam_role_policy_attachment.logs
-
完整性检查
terraform plan
-
从第一步中删除内联策略
【问题讨论】:
-
以什么方式令人不安?它只会删除现有的附件,这意味着您的 IAM 权限可能会出现问题(您也可以使用手动方法)。由于这是活泼的事实,您可能还需要申请两次。如果附加在分离之前运行,则 IAM API 可能会在附加上出错(多次附加相同的策略),然后分离将运行,然后向您显示错误。第二次申请将为您解决此问题,因为该策略已被分离。
-
同意即时重新附加政策确实没有什么令人不安的。由于我认为策略附件没有 AWS ID(出于 API 的目的),因此您也无法进行状态操作来解决此问题。
-
您实际上可以导入
aws_iam_role_policy_attachmentresource,如果您不想在重构时对 IAM 权限有一个短暂的提示,或者还有其他原因想要避免潜在的间歇性在重试修复问题之前失败。我个人只是运行应用程序,如果它失败,请双击它,因为这是重构时的一次性迁移。 -
当我们使用共享托管 IAM 资源为模块应用 terraform 时,它会将策略与 30 个不同的 IAM 角色分离,迫使我们通过查找并重新应用我们的 terraform 模块来重新附加它们。我们已经提出了一系列步骤来在未来安全地执行此操作,但我们希望与我们联系,看看是否可以以更安全的方式完成。你们也遇到过这种情况吗?
-
aws_iam_role_policy_attachment的输入不是问题。问题是删除了aws_iam_policy_attachment,这会导致应用 terraform 模块之外的其他角色脱离。
标签: amazon-web-services terraform terraform-provider-aws