我试图使用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)
您能否尝试将以下语句添加到存储桶策略中?
{
"Sid": "AllowIncomingGet",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::bucket-name/incoming/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": [
"..."
]
}
}
}
根据文档(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调用。
因此,您的Allow
在GetObject
上使用条件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:/