确定Terraform配置所需的最低AWS权限的最有效方法是什么?

Col*_*ean 7 amazon-web-services terraform

我有一个针对AWS部署的Terraform配置.当使用有权做任何事情的IAM用户时(即{actions: ["*"], resources: ["*"]}.

为了实现Terraform配置的自动化应用,我想确定最初应用配置并影响后续更改所需的最小权限集.我特别想避免在政策中给予过多的权限,例如{actions: ["s3:*"], resources: ["*"]}.

到目前为止,我只是运行terraform apply直到发生错误.我查看输出或terraform日志输出以查看API调用失败,然后将其添加到部署用户策略中.EC2和S3特别令人沮丧,因为动作的名称似乎不一定与API方法名称一致.我有几个小时的时间用简单的方式告诉我多久了.

有没有更有效的方法来做到这一点?

如果Terraform建议我需要什么许可/行动,那将是非常好的,但这是Hashicorp最好的产品增强.

Avn*_*rSo 36

这是另一种方法,类似于上面所说的,但没有进入 CloudTrail -

  1. 向您的 IAM 用户授予完全权限。
  2. TF_LOG=trace terraform apply --auto-approve &> log.log
  3. cat log.log | grep "DEBUG: Request"

您将获得所有使用的 AWS 操作的列表。

  • @AvnerSo 感谢您提供出色的解决方案!但似乎日志格式同时发生了变化。我查找了 ```aws.operation=``` 的出现,并将最后一步替换为: ```cat log.log | grep -o "aws.操作=[a-zA-Z0-9]*" | uniq``` 它为我提供了所使用的 AWS 操作的列表。 (4认同)
  • @ColinDean 谢谢。这是一个很好的方向,但请注意,您无法 100% 自动化,某些操作具有不同名称的权限,例如“s3.GetBucketAccelerateConfiguration”需要权限“s3:GetAccelerateConfiguration”。 (3认同)

Ste*_*ing 32

虽然我仍然相信这种超级严格的政策将是一种持续的痛苦,并可能会扼杀生产力(但可能取决于项目),但现在有一个工具可以做到这一点。

iamlive使用 AWS 开发工具包的客户端监控功能根据执行的 API 调用创建最小策略。由于 Terraform 使用 AWS SDK,因此这也适用于此。

与我之前(和已接受的)答案相反,iamlive 甚至应该正确执行实际的 IAM 操作,这不一定与 API 调用 1:1 匹配(并且将由 CloudTrail 记录)。

为了让它与 terraform 一起工作,你应该这样做export AWS_CSM_ENABLED=true

  • 需要明确的是,让 iamlive 与 Terraform 配合使用的最简单方法是通过以下方式启用“AWS_CSM_ENABLED”环境变量:“export AWS_CSM_ENABLED=true” (4认同)

BMW*_*BMW 10

我遵循的有效方法。

我处理的方法是,首先允许该服务的所有权限(*),然后在不需要时拒绝其中一些权限。

例如

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowSpecifics",
            "Action": [
                "ec2:*",
                "rds:*",
                "s3:*",
                "sns:*",
                "sqs:*",
                "iam:*",
                "elasticloadbalancing:*",
                "autoscaling:*",
                "cloudwatch:*",
                "cloudfront:*",
                "route53:*",
                "ecr:*",
                "logs:*",
                "ecs:*",
                "application-autoscaling:*",
                "logs:*",
                "events:*",
                "elasticache:*",
                "es:*",
                "kms:*",
                "dynamodb:*"
            ],
            "Effect": "Allow",
            "Resource": "*"
        },
        {
            "Sid": "DenySpecifics",
            "Action": [
                "iam:*User*",
                "iam:*Login*",
                "iam:*Group*",
                "iam:*Provider*",
                "aws-portal:*",
                "budgets:*",
                "config:*",
                "directconnect:*",
                "aws-marketplace:*",
                "aws-marketplace-management:*",
                "ec2:*ReservedInstances*"
            ],
            "Effect": "Deny",
            "Resource": "*"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

如果 terraform 不需要或者您的公司不使用某些 aws 服务,您可以轻松调整拒绝会话中的列表。

在此输入图像描述

  • 这当然是一种方法,但我担心会错过一些东西。我最终不得不跟上行动列表的变化,增加了维护负担风险,我不确定我是否愿意接受。 (5认同)

Ste*_*ing 6

编辑 2022 年 2 月:使用 iamlive 和客户端监控有更好的方法。请看我的另一个回答。

因为我猜没有完美的解决方案,所以把这个答案当作我头脑风暴的结果。至少对于初始权限设置,我可以想象以下内容:

首先允许所有内容,然后处理 CloudTrail 日志以查看在terraform apply/destroy周期中进行了哪些 API 调用。

之后,您更新 IAM 策略以准确包含这些调用。

  • 我想如果我再做一次这个过程,我会这样做。我想知道是否有人编写了一种类似于“CloudTrail 记录器”的工具:它启动并过滤掉除一个用户之外的所有用户,然后记录 CloudTrail 在一段时间内看到的每个操作,并在完成时输出这些操作的列表。 (4认同)