【问题标题】:Restricting file types on amazon s3 bucket with a policy使用策略限制 amazon s3 存储桶上的文件类型
【发布时间】:2016-10-03 17:23:32
【问题描述】:

我正在尝试设置,以便存储桶可以保存的唯一文件类型是 png、jpeg 和 gif 图像。我正在尝试加入这样的存储桶策略

{
    "conditions": [
        {"bucket": "bucketname"},
        ["starts-with", "$Content-Type", "image/jpeg"],
        ["starts-with", "$Content-Type", "image/png"],
        ["starts-with", "$Content-Type", "image/gif"],
        ["content-length-range", 0, 10485760]
    ]
}

然后我也在尝试限制大小,但是当我尝试更新我的策略时,我收到错误“无效的策略元素 - 条件”

我尝试使用此处的答案 - s3 direct upload restricting file size and type,这就是我制作代码的地方,但我不确定执行此操作的正确方法,因为我的政策甚至没有被亚马逊接受。

【问题讨论】:

  • 这是您的整个保单文件吗?因为那不是一份完整的文件。查看这些示例策略文档:docs.aws.amazon.com/AmazonS3/latest/dev/…
  • 上传您将用于此的整个策略,因为上面的代码不完整。
  • 需要注意的是,仅仅因为有人上传了一个名为“blah.png”的文件并不意味着它实际上是一个 PNG 文件,S3 无法验证文件格式。如果您真的想确保只获得这些格式,则必须以其他方式确认。
  • 您是在设置 S3 存储桶策略(详见下文)还是尝试 setup post form s3 policy 您所指的答案是指第 2 点,但看起来您在谈论第 1 点
  • 关注以下tutorial,它解释了如何生成用户池ID并为其分配合适的策略

标签: amazon-web-services amazon-s3


【解决方案1】:

如果你不确定如何编写,你可以使用策略生成器,例如你会有类似的东西

{
  "Id": "Policy1464968545158",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1464968483619",
      "Action": [
        "s3:PutObject"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::<yourbucket>/*.jpg",
      "Principal": "*"
    },
    {
      "Sid": "Stmt1464968543787",
      "Action": [
        "s3:PutObject"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::<yourbucket>/*.png",
      "Principal": "*"
    }
  ]
}

正如doc所说,你可以指定多个资源并聚合这部分,所以不需要乘以声明

    "Resource": [
      "arn:aws:s3:::<yourbucket>/*.jpg",
      "arn:aws:s3:::<yourbucket>/*.png",
      "arn:aws:s3:::<yourbucket>/*.gif",
    ],

所以你会得到类似的东西

{
    "Id": "Policy1464968545158",
    "Version": "2012-10-17",
    "Statement": [
      {
        "Sid": "Stmt1464968483619",
        "Action": [
          "s3:PutObject"
        ],
        "Effect": "Allow",
        "Resource": [
          "arn:aws:s3:::<yourbucket>/*.jpg",
          "arn:aws:s3:::<yourbucket>/*.png",
          "arn:aws:s3:::<yourbucket>/*.gif",
        ],
        "Principal": "*"
      }
    ]
}

您可以在创建存储桶策略时访问策略生成器

【讨论】:

  • 这仅检查文件扩展名而不是文件的实际类型。扩展名为 .jpg 的文件不一定是图像文件。
  • 小心。上面的例子没有检查 real mimetype 只是扩展名
  • 也没有原则,就是说任何人都可以访问你的bucket。
【解决方案2】:

我与 AWS 支持工程师交谈,conditions.starts-with 限制仅受 HTTP POST 策略支持(例如:浏览器表单字段上传请求的策略)。使用此策略,当您或您的用户使用 HTTP PUT 请求上传文件时,应该不可能限制 mineType

参考:https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-HTTPPOSTConstructPolicy.html#sigv4-PolicyConditions

对于通用策略,您可以在此处查看可用的Condition 密钥,https://docs.aws.amazon.com/IAM/latest/UserGuide/list_amazons3.html

我发现还有另一种可以限制 mineType 的解决方案,

  1. 为您的 html 元素指定 mineType,如下所示:&lt;input type="file" accept="image/bmp,image/jpeg,image/png,image/gif"/&gt;
  2. 然后可以通过代码获取bmpjpegpnggif,可以在上传前设置为S3对象的文件URL扩展名。
  3. 最后,您可以添加一般策略来限制文件 URL 扩展名,如下所示。参考:https://aws.amazon.com/premiumsupport/knowledge-center/s3-allow-certain-file-types/
{
    "Id": "Policy1464968545158",
    "Version": "2012-10-17",
    "Statement": [
      {
          "Sid": "Stmt1464968483619",
          "Effect": "Allow",
          "Principal": {
              "AWS": "IAM-USER-ARN"
          },
          "Action": "s3:PutObject",
          "Resource": [
              "arn:aws:s3:::bucket-name/*.bmp",
              "arn:aws:s3:::bucket-name/*.jpeg",
              "arn:aws:s3:::bucket-name/*.png",
              "arn:aws:s3:::bucket-name/*.gif"
         ]
     }
  ]
}
  1. 这样您就可以从浏览器端限制 mimeType

【讨论】:

  • 当你尝试这个时,它会显示以下错误Invalid principal in policy。由于"AWS": "IAM-USER-ARN"这句话是错误的
猜你喜欢
  • 2012-04-05
  • 2011-09-10
  • 2023-02-26
  • 1970-01-01
  • 2023-03-31
  • 2013-01-08
  • 1970-01-01
  • 2013-12-21
  • 1970-01-01
相关资源
最近更新 更多