我正在尝试为S3设置我的角色策略。我正在尝试做的是允许用户在其名称中删除任何包含“public”的图像。问题是我似乎得到了正确的策略(它在策略模拟器中成功)但是当我在我的应用程序中运行它时,它似乎没有正常工作。
这是我的政策:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"mobileanalytics:PutEvents",
"cognito-sync:*"
],
"Resource": [
"*"
]
},
{
"Effect": "Allow",
"Action": [
"s3:Get*",
"s3:List*"
],
"Resource": [
"arn:aws:s3:::*"
],
"Condition": {
"StringLike": {
"s3:prefix": "*public*"
}
}
}
]
}
我将s3:prefix
设为user1/image1-public
。就像我之前提到的,在策略模拟器上,它允许所有“Get”和“List”命令(就像它应该的那样)。
问题是当我使用iOS应用中的传输管理器从数据库下载示例图像时,出现以下错误:
2015-10-07 14:22:01.716 SimpleAuth[71584:8584520] Error: Error Domain=com.amazonaws.AWSS3ErrorDomain Code=1 "The operation couldn’t be completed. (com.amazonaws.AWSS3ErrorDomain error 1.)" UserInfo=0x7fcbf2d8c560 {HostId=ke/f5x+DKCnjuzlbH5XBWCQfawbkUIRWWhPcY9LdqjPqP5kUyq0rzIjkqeL+8Bm/fvr/l24Wm94=, Message=Access Denied, Code=AccessDenied, RequestId=180803E4DDD0BB73}
我在Xcode项目中的代码是
AWSS3TransferManagerDownloadRequest *downloadRequest = [AWSS3TransferManagerDownloadRequest new];
downloadRequest.bucket = @"test";
downloadRequest.key = @"user1/image1-public";
downloadRequest.downloadingFileURL = downloadingFileURL;
// Download the file.
[[transferManager download:downloadRequest] continueWithExecutor:[AWSExecutor mainThreadExecutor]
withBlock:^id(AWSTask *task)
{
if (task.error){
if ([task.error.domain isEqualToString:AWSS3TransferManagerErrorDomain]) {
switch (task.error.code) {
case AWSS3TransferManagerErrorCancelled:
case AWSS3TransferManagerErrorPaused:
break;
default:
NSLog(@"Error: %@", task.error);
break;
}
} else {
// Unknown error.
NSLog(@"Error: %@", task.error);
}
}
if (task.result)
{
AWSS3TransferManagerDownloadOutput *downloadOutput = task.result;
//File downloaded successfully.
NSLog(@"Now go to the next screen");
[self performSegueWithIdentifier:@"LoginSuccessSegue" sender:self];
}
return nil;
}];
非常感谢任何帮助。我从来没有能够获得一个“条件”来处理ACL。
答案 0 :(得分:0)
"s3:prefix": "*public*"
基本上永远不会匹配任何有意义的内容。
它指定前缀 - 而不是通配符匹配。
要匹配/user-1/image/public/kitten.jpg
处的图像对象以及同一结构级别的所有其他内容,政策条件必须为"s3:prefix": "user-1/image/public/"
对于这样的政策来说," public"需要位于路径的最左侧 - 前缀。
文档不清楚,但可能而不是条件,您可以在资源中使用通配符。它简单地说"You can use wild card."。如果是真的,那么可能就是这样:
"Resource": [
"arn:aws:s3:::example-bucket/*/public/*"
],
如果没有,你再次受限于前缀,这可能是我怀疑的情况。
我原本想过,政策模拟器会发出警告,就像这样,让你知道政策模拟器没有彻底评估政策的所有方面,对于某些服务:
“此操作属于支持附加到资源的访问控制机制的服务。模拟器不会对这些机制建模,因此生产环境中的结果可能会有所不同。“
http://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_testing-policies.html