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

标签 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(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

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

最佳答案

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

来自 Amazon:“策略定义了您可以分配给用户、组或 Angular 色的 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 和 key 。我看到你提到在浏览器中这样做;你有服务器交互吗?在客户端代码中硬编码您的 key 并不是特别安全。我建议将 key 放在服务器上,并让您的服务器代码生成与它传递给客户端以执行操作的策略相匹配的临时凭证。 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 策略来获取有关事务的更一般权限。干杯

关于javascript - AWS s3 对象的策略文档 - 什么 ACL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50762508/

相关文章:

ios - 如何通过 iOS SDK 调用 Lambda 函数?

amazon-web-services - 使用 Amazon-Lex 进行意图评分/置信度

amazon-web-services - S3 存储桶文件夹的 DNS 名称

javascript - 在新选项卡中打开发布请求

ruby-on-rails - 如何向下舍入 DateTime 值

ruby-on-rails - rails : paperclip and creation date based directory structure

ruby-on-rails - 在金钱和时间上添加尾随零

javascript - 在浏览器操作弹出窗口中显示外部内容

javascript - 如何使用 Promise 中的值异步更新 AngularJS 状态

javascript - 使用 JS Proxy 拒绝数组输入