【问题标题】:Malformed S3 policy from Terraform来自 Terraform 的畸形 S3 策略
【发布时间】:2018-12-20 23:03:19
【问题描述】:

看起来我在 Terraform 部署中得到了一个格式错误的策略,并且在查看它时没有看到任何问题,所有 Principals 似乎都已到位并且看起来什么都没有 与众不同。有人可以找出为什么此政策被认为格式不正确吗?

这是抛出的 TF 输出

module.s3-bucket.aws_s3_bucket_policy.bucket_policy: Creating...
  bucket: "" => "the_s3_bucket"
  policy: "" => "{\n  \"Version\":\"2012-10-17\",\n    \"Statement\":[{\n      \"Principal\": \"*\",\n      \"Action\":[\n        \"s3:GetBucketLocation\",\n        \"s3:ListAllMyBuckets\"\n      ],\n        \"Resource\":[\n          \"arn:aws:s3:::*\"\n      ],\n    \"Effect\":\"Allow\"\n  }, {\n    \"Principal\": \"*\",\n    \"Action\":[\n      \"s3:ListBucket\",\n      \"s3:ListBucketMultipartUploads\"\n    ],\n    \"Resource\":[\n      \"arn:aws:s3:::the_s3_bucket\"\n    ],\n    \"Effect\":\"Allow\"\n    }, {\n      \"Principal\": \"*\",\n    \"Action\":[\n      \"s3:GetObject\",\n      \"s3:AbortMultipartUpload\",\n      \"s3:ListMultipartUploadParts\",\n      \"s3:DeleteObject\",\n      \"s3:PutObject\",\n      \"s3:GetObjectAcl\",\n      \"s3:PutObjectAcl\"\n    ],\n    \"Resource\":[\n      \"arn:aws:s3:::the_s3_bucket/*\"\n    ],\n    \"Effect\":\"Allow\"\n  }]\n}\n"

(非详细)错误:

Error applying plan:

1 error(s) occurred:

* module.s3-bucket.aws_s3_bucket_policy.bucket_policy: 1 error(s) occurred:

* aws_s3_bucket_policy.bucket_policy: Error putting S3 policy: MalformedPolicy: Policy has invalid action
    status code: 400, request id: DCAEB510D9FE431C, host id: FwZ187PM8RKZljAZGo1578UvsgW3kwtZpaI2Mom46lu7Jr+NV9Jum8txjsfwdJw0jm9ct0awRWk=

这是它所包含内容的漂亮打印

{
  "Version":"2012-10-17",
    "Statement":[{
      "Principal": "*",
      "Action":[
        "s3:GetBucketLocation",
        "s3:ListAllMyBuckets"
      ],
        "Resource":[
          "arn:aws:s3:::*"
      ],
    "Effect":"Allow"
  }, {
    "Principal": "*",
    "Action":[
      "s3:ListBucket",
      "s3:ListBucketMultipartUploads"
    ],
    "Resource":[
      "arn:aws:s3:::the_s3_bucket"
    ],
    "Effect":"Allow"
    }, {
      "Principal": "*",
    "Action":[
      "s3:GetObject",
      "s3:AbortMultipartUpload",
      "s3:ListMultipartUploadParts",
      "s3:DeleteObject",
      "s3:PutObject",
      "s3:GetObjectAcl",
      "s3:PutObjectAcl"
    ],
    "Resource":[
      "arn:aws:s3:::the_s3_bucket/*"
    ],
    "Effect":"Allow"
  }]
}

更新

显然这与Principal 字段有关,通过 AWS 控制台运行后我得到错误

This policy contains the following error: Has prohibited field Principal For more information about the IAM policy grammar, see AWS IAM Policies 

【问题讨论】:

  • 里面有Principal 有效吗?我倾向于在这里找到使用 IAM 策略编辑器的帮助 - 如果您将上述内容粘贴到其中,它应该有助于找出问题所在。此外,您可以使用第一个选项卡来构建策略,然后切换到 json 选项卡将其复制出来以在 Terraform 中使用。
  • Principal 适用于存储桶策略,但不适用于 IAM 策略(承担角色策略除外……叹息……)。您应该使用实际的存储桶策略编辑器进行测试,而不是使用类似语法但实际上不同的密切相关的 IAM 策略编辑器。

标签: amazon-s3 terraform policy terraform-provider-aws


【解决方案1】:

s3:ListAllMyBuckets 权限不能应用于 S3 存储桶策略,而是 IAM 策略权限。您还必须在存储桶策略中直接指定策略附加到的存储桶,而不是为存储桶使用"Resource": ["*"] 或其他通配符。

IAM 政策和 S3 存储桶政策密切相关且重叠程度很高,但您应该将它们视为有时可能需要的进一步控制级别。不幸的是,S3 权限模型非常混乱,并且有多层添加访问控制,从bucket ACLs 和对象 ACL(包括完全可配置的和固定的)到 bucket policies 以及附加到 IAM 用户的直接 IAM permissions或角色。

大多数情况下,您最好使用canned ACLs,然后使用 IAM 用户策略来控制谁可以执行 ACL 不允许的额外操作。在User Guide 中有对这些的进一步解释。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-28
    • 2021-04-04
    • 1970-01-01
    • 2019-05-15
    • 1970-01-01
    • 2021-10-17
    • 2022-11-03
    • 2021-10-21
    相关资源
    最近更新 更多