【问题标题】:S3 Bucket Policy and IAM Role ConflictingS3 存储桶策略和 IAM 角色冲突
【发布时间】:2016-12-23 14:53:45
【问题描述】:

我正在尝试使用 S3 存储桶策略提供对存储桶的一般访问权限,同时还允许使用角色策略对角色进行特定访问。 Lambda 函数使用该角色来处理存储桶中的对象。它在第一个障碍处被阻止 - 它无法获取带有前缀“incoming/”的任何东西,即使它在角色策略中被允许,并且在存储桶策略中没有明确拒绝。

角色政策:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowBucketPut",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::bucket-name/*"
        },
        {
            "Sid": "AllowIncomingGetDelete",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:DeleteObject"
            ],
            "Resource": "arn:aws:s3:::bucket-name",
            "Condition": {
                "StringLike": {
                    "s3:prefix": "incoming/*"
                }
            }
        }
    ]
}

注意:我还尝试删除条件并将资源更改为“arn:aws:s3:::bucket-name/incoming*”,这似乎只会改变策略模拟器的行为方式。另一个注意事项: GET from the bucket with "incoming/*" 前缀在模拟器中确实有效,只是在实践中无效。

我没有删除以下存储桶策略中的任何声明,因为我不确定哪些可能相关。 IP 地址已被省略。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowPublicList",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::bucket-name",
            "Condition": {
                "StringLike": {
                    "s3:prefix": "public*"
                }
            }
        },
        {
            "Sid": "AllowPublicGet",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::bucket-name/public*"
        },
        {
            "Sid": "AllowPrivateList",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::bucket-name",
            "Condition": {
                "StringLike": {
                    "s3:prefix": "private*"
                },
                "IpAddress": {
                    "aws:SourceIp": [
                        "..."
                    ]
                }
            }
        },
        {
            "Sid": "AllowPrivateGet",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::bucket-name/private*",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": [
                        "..."
                    ]
                }
            }
        },
        {
            "Sid": "AllowIncomingPut",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::bucket-name/incoming*",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": [
                        "..."
                    ]
                }
            }
        }
    ]
}

为文字墙道歉。

我不明白为什么我的角色无法获取前缀为“incoming/”的对象。

执行以下操作时,Lambda 函数会出现 403 访问被拒绝:

S3.download_file(bucket, key, localfile)

【问题讨论】:

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


    【解决方案1】:

    根据文档 (http://docs.aws.amazon.com/AmazonS3/latest/dev/amazon-s3-policy-keys.html),s3:prefix 条件仅适用于 s3:ListBucket API,以强制调用者在 ListBucket 操作上指定前缀。它似乎不适用于GetObject API 调用。

    因此,您在GetObject 上的Allow 条件为s3:prefix == ... 将不匹配任何GET(对象)请求(因为这些请求不包含策略键“s3:prefix”!),因此,您实际上不允许角色策略中的这些请求。由于您似乎也不允许存储桶策略上的该请求,并且任何地方都没有 Deny 语句,因此您的 Lambda 代码被隐式拒绝

    您应该改用Resource,正如您提到的,您已在策略模拟器上尝试过:"Resource": "arn:aws:s3:::bucket-name/incoming/*"

    另外——你可能有理由像你一样指定策略,但这似乎有点不寻常——通常是 S3 相关策略上的 "Resource" 元素,当你想描述前缀时,会类似于...incoming/*,而不仅仅是...incoming*。这可以防止一些意想不到的结果。例如,假设您有一个名为incoming/ 的“文件夹”,然后您创建了一个名为incoming-top-secret/ 的文件夹。按照您编写策略的方式,您将授予对这两个前缀的访问权限!但同样 - 如果不真正了解您环境的确切细节,就很难说出您真正需要什么。只是想确保您(以及其他阅读本文的人)知道这个微妙(但重要)的细节!

    这就是我能想到的,根据你给出的描述。如果您尝试了这些更改,但仍然无法正常工作,请使用您尝试过的新政策相应地更新您的问题。祝你好运!

    【讨论】:

    • 非常感谢您的澄清。如帖子中所述,我得到与您描述的指定资源相同的行为。我已经弄清楚了这个问题......有点。等我上班回来更新。
    【解决方案2】:

    您可以尝试将以下语句添加到存储桶策略吗?

        {
            "Sid": "AllowIncomingGet",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::bucket-name/incoming/*",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": [
                        "..."
                    ]
                }
            }
        }
    

    【讨论】:

      猜你喜欢
      • 2018-06-08
      • 2021-08-13
      • 2019-02-26
      • 2021-03-26
      • 2012-11-23
      • 1970-01-01
      • 2023-03-29
      • 2018-10-20
      • 1970-01-01
      相关资源
      最近更新 更多