AWS S3 ACL策略条件

时间:2015-10-07 20:19:55

标签: amazon-web-services amazon-s3 acl

我正在尝试为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。

1 个答案:

答案 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