【问题标题】:AWS S3 StringLike Condition preventing requests to bucketAWS S3 StringLike 条件阻止对存储桶的请求
【发布时间】:2021-01-25 19:31:47
【问题描述】:

我有以下 s3 IAM 政策。它旨在允许我从存储桶中的 temp/prod/tests 位置复制文件或将文件放入存储桶中。

在策略中,我添加了 StringLike 条件,我希望在对象前缀包含 temp/prod/tests 时允许策略中的权限允许复制和放置。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "",
            "Effect": "Allow",
            "Action": [
                "s3:ReplicateObject",
                "s3:PutObject",
                "s3:ListBucket",
                "s3:GetObjectAcl",
                "s3:GetObject",
                "s3:GetBucketLocation",
                "s3:GetBucketAcl",
                "s3:DeleteObject"
            ],
            "Resource": [
                "arn:aws:s3:::MYBUCKET/temp/prod/tests/*",
                "arn:aws:s3:::MYBUCKET"
            ],
            "Condition": {
                "StringLike": {
                    "s3:prefix": [
                        "temp/prod/tests/*",
                        "temp/prod/tests/"
                    ]
                }
            }
        }
    ]
}

我的问题是该条件阻止我复制 temp/prod/tests/ 下的任何内容,或将任何新对象放入此存储桶中的此位置下方。

 $ aws s3 cp --recursive s3://MYBUCKET/temp/prod/tests/ /tmp
download failed: s3://MYBUCKET/temp/prod/tests/testfiles/testfile to ../../../tmp/testfiles/testfile An error occurred (AccessDenied) when calling the GetObject operation: Access Denied

$ aws s3 cp /tmp/test s3://MYBUCKET/temp/prod/tests/
 An error occurred (AccessDenied) when calling the PutObject operation: Access Denied

如果我删除条件,我可以按预期复制文件。

我不明白为什么条件不起作用,因为据我所知,我发出的请求与条件的前缀匹配。

有谁知道为什么这不符合我的预期?

【问题讨论】:

    标签: amazon-web-services amazon-s3 amazon-iam


    【解决方案1】:

    我认为这里的部分困惑是您期望 s3:prefix 在 CopyObject 操作期间将出现并可测试。它在 ListBucket 操作期间存在,我认为这可能是它存在的唯一操作。 Condition keys for S3 已记录在案,但该文档似乎没有包含在哪些 API 操作期间存在哪些密钥的矩阵。

    具体来说,我认为s3:prefix 在实际的 CopyObject 操作期间将不存在,这意味着 IAM 会将其视为values do not match,因此条件测试失败并且 CopyObject 操作被拒绝。

    AWS policy evaluation logic 相当直截了当且定义明确,但 AWS global condition context keys 所在的上下文没有明确定义,或者至少没有充分记录。在事后确定给定 API 操作被拒绝的确切原因(即聚合策略的哪一部分导致失败)也非常困难,这使得编写和测试复杂的策略变得困难。

    理想情况下,您应该知道哪些键存在于哪些操作中,但这似乎没有记录在案。解决这个问题的一种方法是测试(看看什么有效,什么无效)。另一种方法是使用...IfExists 条件检查,但这实际上是为与可选而不是甚至不相关的策略键一起使用而设计的。当你使用StringLikeIfExists时,例如:

    如果请求的上下文中存在策略密钥,则按照策略中指定的方式处理密钥 [即执行 StringLike 测试]。如果键不存在,则将条件元素评估为真。

    就您的政策而言,我建议:

    • 将存储桶资源与存储桶操作一起使用,将对象资源与对象操作一起使用(现在,您将它们混合在一起)
    • 将前缀条件限制为 ListBucket 操作
    • 无需使 GetObject 或 PutObject 成为条件,只需指明允许这些操作的资源 ARN(例如arn:aws:s3:::MYBUCKET/temp/prod/tests/*

    【讨论】:

      【解决方案2】:

      大部分政策来源于这篇博文Writing IAM Policies: Grant Access to User-Specific Folders in an Amazon S3 Bucket

      您在问题中提到的遵循政策

      它旨在允许我从存储桶中的 temp/prod/tests 位置复制文件或将文件放入存储桶中

      加上文件夹temp/prod/tests/* 中的所有操作。这些可以进一步限制。就像您分配的权限很少一样。

      {
          "Version": "2012-10-17",
          "Statement": [
              {
                  "Sid": "AllowGroupToSeeBucketListInTheConsole",
                  "Effect": "Allow",
                  "Action": [
                      "s3:ListAllMyBuckets",
                      "s3:GetBucketLocation"
                  ],
                  "Resource": "*"
              },
              {
                  "Sid": "AllowListingOfUserFolder",
                  "Action": [
                      "s3:ListBucket"
                  ],
                  "Effect": "Allow",
                  "Resource": [
                      "arn:aws:s3::: MYBUCKET"
                  ],
                  "Condition": {
                      "StringLike": {
                          "s3:prefix": [
                              "temp/prod/tests/*"
                          ]
                      }
                  }
              },
              {
                  "Sid": "AllowAllS3ActionsInUserFolder",
                  "Effect": "Allow",
                  "Action": [
                      "s3:*"
                  ],
                  "Resource": "arn:aws:s3::: MYBUCKET/temp/prod/tests/*"
              }
          ]
      }
      

      【讨论】:

        【解决方案3】:

        首先,我认为根据资源拆分规则是一个很好的做法。一些 s3 操作需要一个存储桶,其中一些需要一个对象。它在每个服务的文档中:https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazons3.html

        此外,条件而不是适当的资源使政策更加混乱。

        理论上,上传一个对象只需要 PutObject,甚至不需要任何 List 操作。但是对于各种 cmdline 工具,我很好奇你能用这样的东西走多远:

        {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Sid": "rule1",
                    "Effect": "Allow",            
                    "Action": [
                        "s3:ListMultipartUploadParts",
                        "s3:AbortMultipartUpload",
                        "s3:PutObject",
                        "s3:GetObject",
                        "s3:DeleteObject"
                    ],
                    "Resource": [
                        "arn:aws:s3:::MYBUCKET/temp/prod/tests/*",
                    ]
                },
                {
                    "Sid": "rule2",
                    "Effect": "Allow",            
                    "Action": [
                        "s3:ListBucket",
                        "s3:ListBucketMultipartUploads"
                    ],
                    "Resource": [
                        "arn:aws:s3:::MYBUCKET",
                    ]
                }       
            }
        }
        

        【讨论】:

          【解决方案4】:

          我找到了一个解决方案,只需对政策进行最少的更改。 我在条件中添加了 ForAllValues,现在我可以复制 temp/prod/tests/ 下的任何对象或 temp/prod/tests/ 下的任何子目录。

                  "Condition": {
                      "ForAllValues:StringLike": {
                          "s3:prefix": [
                              "temp/prod/tests/*",
                              "temp/prod/tests/"
                          ]
                      }
                  }
          

          【讨论】:

          • 理想情况下,您应该更关心编写 100% 正确和有效的政策,而不是尽量减少对无效政策所做的更改次数。
          猜你喜欢
          • 1970-01-01
          • 2021-01-20
          • 1970-01-01
          • 2020-08-06
          • 2019-03-30
          • 1970-01-01
          • 1970-01-01
          • 2018-10-06
          • 1970-01-01
          相关资源
          最近更新 更多