Amazon web services S3存储桶策略-隐式允许获取
当使用下面的bucket策略时,我看到它像预期的那样限制了PUT访问,但是在创建的对象上允许GET,即使没有什么应该允许这个操作Amazon web services S3存储桶策略-隐式允许获取,amazon-web-services,amazon-s3,amazon-policy,Amazon Web Services,Amazon S3,Amazon Policy,当使用下面的bucket策略时,我看到它像预期的那样限制了PUT访问,但是在创建的对象上允许GET,即使没有什么应该允许这个操作 { "Version": "2012-10-17", "Statement": [ { "Sid": "AllowPut", "Effect": "Allow", "Principal": { "AWS": "*"
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowPut",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::<BUCKET>/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": [
"<IP ADDRESS>"
]
}
}
}
]
}
{
“版本”:“2012-10-17”,
“声明”:[
{
“Sid”:“AllowPut”,
“效果”:“允许”,
“委托人”:{
“AWS”:“*”
},
“操作”:“s3:PutObject”,
“资源”:“arn:aws:s3:::/*”,
“条件”:{
“IP地址”:{
“aws:SourceIp”:[
""
]
}
}
}
]
}
我可以使用curl将文件从
放入
,如下所示:
curl https://<BUCKET>.s3-<REGION>.amazonaws.com/ --upload-file test.txt
curlhttps://.s3-.amazonaws.com/ --上传文件test.txt
文件上载成功,并显示在S3控制台中。由于某种原因,我现在可以从互联网上的任何地方获取该文件
curl https://<BUCKET>.s3-<REGION>.amazonaws.com/test.txt -XGET
curlhttps://.s3-.amazonaws.com/test.txt -XGET
这仅适用于使用上述方法上载的文件。在S3Web控制台中上载文件时,我无法使用curl获取它(访问被拒绝)。因此,我假设这是一个对象级权限问题。虽然我不明白为什么bucket策略不会隐式拒绝这种访问
在控制台中查看对象级权限时,通过控制台上载的文件(方法1)与从允许的
(方法2)上载的文件之间的唯一区别在于,方法2中的文件没有“所有者”、权限或元数据,而方法1文件具有所有这些
此外,当尝试使用Lambda脚本(boto3download_file()
)获取对象时,该脚本假定角色具有对bucket的完全访问权限,对于使用方法2上载的对象,该脚本将失败。尽管对于使用方法1上载的对象成功。问题摘要
总结一下这个问题:
- 您有一个允许从给定源IP地址匿名上载对象的策略
- 经过身份验证的用户无法读取这些对象(特别是lambda函数采用的Iam角色)
- 未经身份验证的用户可以从任何IP读取这些对象
- 未经身份验证的用户无法删除该对象
- 未经验证的用户可以从已知IP地址上载对象
- 未经身份验证的用户不能从任何IP地址下载对象
- 对象可由经过身份验证的Iam用户检索
?acl
)-您将收到:
<?xml version="1.0" encoding="UTF-8"?>
<AccessControlPolicy xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<Owner>
<ID>65a011a29cdf8ec533ec3d1ccaae921c</ID>
</Owner>
<AccessControlList>
<Grant>
<Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="CanonicalUser"><ID>65a011a29cdf8ec533ec3d1ccaae921c</ID></Grantee>
<Permission>FULL_CONTROL</Permission>
</Grant>
</AccessControlList>
</AccessControlPolicy>
感谢您的评论。关于你所要求的澄清,我已经用一些额外的信息修改了原来的帖子。基本上只是Lambda函数使用的角色。由于某种原因,GET操作被拒绝。这似乎很奇怪,好像对象级权限明确拒绝任何非匿名的内容,或者拒绝bucket所有者(我可以通过控制台下载)。因此,我不确定是什么在否定Lambda角色。>这就好像对象级权限明确否定了任何非匿名的内容,或者bucket owner<我相信这正是正在发生的事情。该对象是使用“匿名”所有者创建的,没有其他权限。您可以粘贴与lambda函数所承担的角色相关联的策略吗?我尝试在角色上使用内联策略指定特定访问权限,但最终使用“AmazonS3FullAccess”托管策略进行了测试,我得到了相同的行为(您应该能够在IAM策略中亲自检查).我只是尝试删除匿名创建的对象,不允许作为匿名用户。因此,我认为默认情况下它只允许GET操作。值得一提的是。好吧,我想我已经破解了它-有趣的挑战!对答案进行主要编辑,以更清晰地解释原因和解决方案。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "allow-anonymous-put",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::<BUCKETNAME>/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": "<IPADDRESS>"
},
"StringEquals": {
"s3:x-amz-acl": "bucket-owner-full-control"
}
}
},
{
"Sid": "deny-not-my-user-everything-else",
"Effect": "Deny",
"NotPrincipal": {
"AWS": "arn:aws:iam::<ACCOUNTNUMBER>:role/<ROLENAME>"
},
"NotAction": [
"s3:PutObject",
"s3:PutObjectAcl"
],
"Resource": "arn:aws:s3:::<BUCKETNAME>/*"
}
]
}