在使用下面的桶策略时,我看到它按照预期限制PUT访问,但是允许对所创建的对象进行GET,即使不应该允许此操作。
{
"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>"
]
}
}
}
]
}
我可以使用curl将文件从<BUCKET>
放到<IP ADDRESS>
中,如下所示:
curl https://<BUCKET>.s3-<REGION>.amazonaws.com/ --upload-file test.txt
文件上传成功,并显示在S3控制台中。由于某种原因,我现在可以从互联网上的anywhere获得该文件。
curl https://<BUCKET>.s3-<REGION>.amazonaws.com/test.txt -XGET
这只适用于使用上述方法上载的文件。当在S3网络控制台上传文件时,我无法使用curl来获得它(访问被拒绝)。因此,我假设这是一个对象级别的权限问题。虽然我不明白为什么桶策略不会隐式地拒绝这种访问。
当查看控制台中的对象级权限时,通过控制台上传的文件(方法1)与从允许的<IP ADDRESS>
上传的文件(方法2)之间的唯一区别是,方法2中的文件没有“所有者”、权限或元数据,而方法1文件具有所有这些。
此外,当尝试使用Lambda脚本(boto3 download_file()
)获取对象时,该脚本承担了完全访问桶的角色,但是对于方法2上传的对象,它失败了,尽管它成功地处理了方法1上传的对象。
发布于 2016-08-22 03:06:44
发行摘要
总结这一问题:
其他意见
预期的结果是:
根本原因
下面是正在发生的事情:
1. The Anonymous user becomes the object _owner_
2. Verifiable by retrieving the object acl (do a GET request for the object with query string `?acl`) - you will receive:
所有者ID是匿名用户的通用id --我在一些AWS论坛讨论中看到了相同的id。
分辨率
有一种方法可以实现您想要的结果--不幸的是,您必须引用特定Iam实体(用户、角色、组)的arn,您希望能够在桶acl中读取对象。
解决方案的关键要素是:
抽样政策:
{
"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>/*"
}
]
}
第二个语句的关键是使用NotPrincipal
和NotAction
。
我已经在本地测试过这一点,但是只有在允许访问的常规Iam用户的情况下,才能进行测试,而不是使用假定角色的Lamba函数--但是主体应该保持不变。祝好运!
以下文章有助于理解正在发生的事情--它们各自呈现的场景相似,但与您的情况并不完全相同,但它们用来处理场景的方法却起到了主导作用:
https://stackoverflow.com/questions/39070512
复制相似问题