当前位置: 首页 > 知识库问答 >
问题:

S3存储桶策略和IAM角色冲突

东方文林
2023-03-14

我试图使用S3存储桶策略提供对存储桶的一般访问,同时也允许使用角色策略对角色进行特定访问。Lambda函数使用该角色来处理桶中的对象。它在第一个障碍处被阻止了——它无法获取前缀为“incoming/”的任何内容,即使在角色策略中允许,但在bucket策略中没有明确拒绝。

角色策略:

{
    "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/including*”,这似乎只改变了策略模拟器的行为。另一个注意事项:从带有“incoming/*”前缀的bucket中获取在模拟器中确实有效,只是在实践中不起作用。

我没有删除以下存储桶策略中的任何语句,因为我不确定可能相关的内容。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)

共有2个答案

花飞尘
2023-03-14

您能否尝试将以下语句添加到存储桶策略中?

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

根据文档(http://docs . AWS . Amazon . com/Amazon S3/latest/dev/Amazon-S3-policy-keys . html),< code>s3:prefix条件仅适用于< code>s3:ListBucket API,以强制调用方在ListBucket操作上指定前缀。这似乎不适用于< code>GetObject API调用。

因此,您的AllowGetObject上使用条件s3:prefix==不会匹配任何GET(Object)请求(因为这些请求不包含策略键“s3:prefix”!),因此您实际上不允许在Role策略中使用这些请求。由于您似乎也不允许桶策略上的请求,而且任何地方都没有Deny语句,因此您的Lambda代码被隐式拒绝。

您应该使用< code>Resource来代替,正如您提到的,您已经在策略模拟器上进行了尝试:< code > " Resource ":" arn:AWS:S3:::bucket-name/incoming/* " 。

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

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

 类似资料:
  • 我已经读了很多文档,看了很多视频,但是我对IAM角色和Bucket策略仍然很困惑。让我困惑的是: 1)我创建了一个Bucket。那时我可以将它公有或私有。如果我将它公有,那么任何人或任何应用程序都可以“看到”Bucket中的对象。我认为可以将权限设置为添加/删除/获取/列出Bucket中的对象。如果是这样,那么为什么我需要为S3 Bucket添加任何IAM角色,或者添加任何Bucket策略(???

  • 所以我就做了如下的桶策略: {“版本”:“2012-10-17”,“ID”:“HTTP引用策略示例”,“语句”:[{“SID”:“允许从www.example.com和example.com发起的get请求”,“Effect”:“Allow”,“Principal”:“”Action“:”S3:“,”Resource“:”arn:aws:s3:::exampleBucket/“,”Conditio

  • 我正尝试使用IAM角色从spark读取s3桶中的csv文件,但在上获得 我安装了没有hadoop的Spark 2.4.4,安装了hadoop 3.2.1以及hadoop-aws-3.2.1.jar和aws-java-sdk-1.11.655.jar。我必须安装一个没有hadoop的spark版本,因为作为spark构建一部分的hadoop jars是来自2016年的2.7.3版本。 附加到角色的“

  • 我知道这可以用EC2s完成,所以我想知道同样的方法是否适用于S3桶,因为我在上面找不到任何文档。谢谢!

  • 我搞不清这里出了什么问题。如有任何帮助,我们将不胜感激。

  • 我发现,当我在IAM策略中使用NotResource作为掩码并将其附加到bucket时,受策略影响的资源是那个bucket中没有在NotResource子句中指定的所有资源。我需要指出一个文档,它清楚地表明情况是这样的。我一直在查看内联策略的文档,以及s3访问管理和策略的文档,但我很难找到这些特定的信息。文档中是否说明了在内联策略中指定资源的限制?

  • 我们的目标是创建只允许登录用户访问S3的S3 bucket和IAM角色策略。 我们在S3 bucket上托管私人文件,可以从web和移动应用程序访问。我们试图通过Amazon Cognito添加一层安全性,使用一个未经身份验证的角色,这样任何登录到我们应用程序的用户都可以访问S3 bucket。 使用AWS-SDK for JS并遵循基本的设置,我们可以在Amazon Cognito identi

  • 最新sigv4 s3浏览器上传帖子的文档-http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-post-example.html -显示我需要使用、和。 如果我尝试这样做,我会得到一个错误,说我错过了,这在文档中没有提到,并且需要是。 我应该做上面的bas64桶策略文档,还是应该做规范的方法,比如python发布到DynamoDB-http:/