AWS s3对象的策略文档 - 什么ACL

时间:2018-06-08 14:09:07

标签: javascript ruby-on-rails amazon-web-services amazon-s3 acl

我想要完成的是将文件直接从浏览器发送到带有signature-v4的s3。我在构建对象的策略文档时遇到问题

从这个: https://blog.shikisoft.com/signing-aws-s3-uploads-with-signature-v4-ruby-on-rails-angularjs/

我可以看到这份文件的外观:

Base64.encode64(
    {
      "expiration" => 1.hour.from_now.utc.xmlschema,
      "conditions" => [
        { "bucket" =>  bucket },
        [ "starts-with", "$key", "" ],
        { "acl" => "private" },
        [ "starts-with", "$Content-Type", "" ],
        {"x-amz-algorithm" => x_amz_algorithm },
        {"x-amz-credential" => x_amz_credential },
        {"x-amz-date" => x_amz_date},
        [ "content-length-range", 0, 524288000 ]
      ]
    }.to_json

我不知道应该使用什么ACL。

我想仅授予用户上传含有某些.extension文件的权限,并且在此用户之后可以删除它甚至读取它。该权限应仅适用于该文件

这是一个ACL权限列表(我相信它是正确的地方) https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html#canned-acl

我能否以某种方式获得仅用于上传的权限,仅用于删除,仅用于读取,仅用于读取和删除一个文件?另一个问题是我认为应该基于扩展生成的内容类型。

如果我缺少一些基本概念,请原谅我

编辑1

我没有提到我想使用分段上传和aws的文档 https://docs.aws.amazon.com/AmazonS3/latest/dev/mpuAndPermissions.html

s3:getObjects3:putObject旁边,我还需要s3:ListMultipartUploadParts

如何将其仅限制为文件或文件夹?情况是每个用户都有私有文件,并且只能访问他拥有的文件

1 个答案:

答案 0 :(得分:1)

我相信通过包含其他方法,您尝试获取的内容的粒度将更容易实现。我建议使用AWS IAM的策略。 (也就是说,我将提供有关使用策略解决此问题的信息,因为我不确定是否可以像您一样专门使用ACL来完成。)

来自亚马逊:"策略定义您可以分配给用户,组或角色的AWS权限。您可以在可视化编辑器中使用JSON创建和编辑策略。"

使用该策略,您可以指定特权一直到特定服务,命令,资源和请求。

这些政策的一些例子:

s3 service, putObject only, arn:aws:s3:::<yourbucket>/*.jpg only
s3 service, deleteObject only, arn:aws:s3:::<yourbucket>/*.png only

第一个允许仅将.jpg文件上传到该存储桶,第二个允许仅从该存储桶中删除.png文件。您可以使用原始json创建这些策略,但我不打算包含它,因为我认为通过使用它们的界面可以更好地理解它。 Example showing the putObject policy.

如果您希望允许多个存储桶,则可以将这些策略设置为允许多个存储桶和多种文件类型。您还可以混合和匹配操作,即仅putObject,仅deleteObject,仅getObject,或仅getObject和deleteObject等。

要使用此类创建的策略,您需要记录访问ID和密钥。我看到你提到在浏览器中这样做了;你有服务器互动吗?在客户端代码中对密钥进行硬编码并不是特别安全。我建议在服务器上使用密钥并让服务器代码生成与其传递给客户端以执行操作的策略匹配的临时凭证。 AWS临时凭证允许到期时间至少为15分钟,因此这也可以提供一些额外的安全性。

您可以在此处详细了解IAM政策:https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html

希望有所帮助。

编辑:最后一件事。如果您还没有,您还需要为所涉及的存储桶设置CORS配置。这可以限制哪些域可以执行操作(如果您愿意)并允许来自具有您所做临时凭据的客户端的交互。这是一个例子:

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
    <AllowedOrigin>https://yoursite.com</AllowedOrigin> (or * for any)
    <AllowedMethod>HEAD</AllowedMethod> (the methods allowed on the bucket)
    <AllowedMethod>GET</AllowedMethod>
    <AllowedMethod>PUT</AllowedMethod>
    <AllowedMethod>DELETE</AllowedMethod>
    <AllowedMethod>POST</AllowedMethod>
    <MaxAgeSeconds>3600</MaxAgeSeconds> 
    <ExposeHeader>ETag</ExposeHeader> (information you need exposed to client)
    <AllowedHeader>*</AllowedHeader> 
</CORSRule>
</CORSConfiguration>

您可以在此处阅读有关CORS配置的信息:https://docs.aws.amazon.com/AmazonS3/latest/dev/cors.html

如果这个答案不适合您,我可能会建议更多的中间立场。就像使用您的代码验证文件类型一样,并使用ACL策略获得有关事务的更一般权限。干杯