【问题标题】:Policy document for object for AWS s3 - What ACLAWS s3 对象的策略文档 - 什么 ACL
【发布时间】:2018-11-18 14:59:59
【问题描述】:

我想要完成的是使用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(s) 的文件的权限,并且在此用户之后应该能够删除它甚至阅读它。该权限应仅适用于该文件

这是 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

我怎样才能将它限制在文件或文件夹中?情况是每个用户都有私人文件,并且应该只能访问他拥有的文件

【问题讨论】:

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


    【解决方案1】:

    我相信通过包含其他一些方式,您想要获得的粒度会更容易实现。我建议的是使用 AWS IAM 的策略。 (也就是说,我将提供有关使用策略解决此问题的信息,因为我不确定单独使用 ACL 是否可以如您所愿。)

    来自 Amazon:“策略定义了您可以分配给用户、组或角色的 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 创建这些策略,但我不会将其包括在内,因为我认为您可以通过使用它们的接口来更好地理解它。

    如果您希望允许多个存储桶和多种文件类型,您可以制定这些政策来允许多个文件类型。您还可以混合和匹配操作,即仅 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 策略来获得有关事务的更一般权限。干杯

    【讨论】:

    • 感谢您的回复。是的,我有用于制作签名的服务器交互,然后我将其作为 json 返回并开始上传带有附加签名策略的表单,这样我的密钥就不会暴露。好的,所以我可以为每种操作创建 IAM,这是否意味着我将为每个 IAM 拥有 SECRET KEYS ?这是否意味着我只需要生成签名(使用正确的密钥)而不附加政策文件?或者我可以将其中的两个结合起来并附加另一个规则,比如定义一个“start-with”来以我想要的方式命名文件。我相信然后我限制对特定文件的访问。每个文件都有不同的所有者
    • 好的,很好。是的,每个独特的策略都有它自己的访问凭证,您可以使用它来生成临时凭证。您的代码中的某些内容,例如 uploadOnlyPolicyId = &lt;id&gt;deleteOnlyPolicyId = &lt;id&gt; 等。不幸的是,我没有为此使用 AngularJS 或 ruby​​ on rails,我的经验在于 JavaScript 和 PHP。我自己没有附上政策文件,因为这不是必需的,尽管我不能代表你的设置。我不明白为什么你不能两者兼得,我想?如果您可以操作和选择分配给文件的 s3 键,为什么还需要 starts-with
    • 我认为我需要更多地研究这些 IAM 政策。如果我使用 getObject 策略构建 IAM,我希望它仅用于一个特殊对象(该用户拥有)。也许我应该即时创建这些 IAM 策略,但我觉得有一个限制。问题是 getObject、deleteObject IAM 策略需要针对特定​​文件,这太疯狂了
    • ... 为每个文件制定 IAM 策略会很疯狂,这就是为什么我想将 2 组合起来以获得一种“经过身份验证的请求”。或者我又错过了什么
    • 对不起,我一直在这样做,我在解释中跳过了一步 - 您创建策略并创建一个仅编程访问的用户,该用户已应用该策略,并且该用户已密钥不是策略本身。一段时间后感觉都一样:)我可能不理解你的项目。正如我最初的答案一样,每个策略都针对一组特权。这可以指定允许的文件类型,但将其分解为逐个文件过于细化。 (即 - 一种仅用于上传权限的策略,一种用于仅删除权限的策略,等等)
    猜你喜欢
    • 2021-05-17
    • 2022-01-09
    • 2018-12-08
    • 1970-01-01
    • 1970-01-01
    • 2016-06-12
    • 1970-01-01
    • 2012-07-20
    • 1970-01-01
    相关资源
    最近更新 更多