保护S3资产免于直接下载

时间:2018-10-04 22:17:21

标签: amazon-web-services amazon-s3

我将我的资产(图像/视频等)存储在S3中,并且一切正常。

但是,视频需要用户安全下载。我已经考虑过使用Ajax和Blob以及隐藏上下文菜单等多种方式,但希望使用更简单但更强大的技术。

我想到的想法是在S3存储桶上添加保护,以便只能从网站本身(EC2实例可以访问的Iam角色)访问资产。

只是不确定这是如何工作的。该存储桶设置为静态网站托管,因此其中的所有内容都是公共的,我想我需要进行更改,然后添加一些直接权限。有没有人做过或者没有人提供有关是否可能的信息。

谢谢

3 个答案:

答案 0 :(得分:0)

您可以通过Amazon CloudFront提供视频内容,Amazon CloudFront使用视频协议而不是文件下载来提供内容。这样可以使您的内容(大部分)保持安全。

请参阅:On-Demand and Live Streaming Video with CloudFront - Amazon CloudFront

然后,您将在S3中将视频设为私有,但使用原始访问身份,允许CloudFront访问内容并将其提供给用户。

答案 1 :(得分:0)

除了已经提到的Cloudfront,您还可以使用AWS Elastic Transcoder(https://aws.amazon.com/elastictranscoder/)将视频文件转换为mpeg-dash或hls格式(https://en.wikipedia.org/wiki/Dynamic_Adaptive_Streaming_over_HTTP)。这些格式基本上由短(例如10s长)的视频部分组成,从而允许自适应比特率,使得下载1个长视频变得更加困难。

答案 2 :(得分:0)

为使CloudFront与S3静态网站终端节点配合使用,AWS通常建议对S3存储桶具有公共读取权限。在CloudFront和S3静态网站端点之间没有实现安全性的本地方法,但是在这种情况下,我们可以使用一种变通方法来满足您的用例。

默认情况下,所有S3资源都是私有的,因此只有创建资源的AWS账户才能访问它们。要允许从您的网站上对这些对象进行读取访问,您可以使用aws:referer键添加一个存储桶策略,该策略允许s3:GetObject权限并带有条件,即get请求必须源自特定的网页。以下策略使用aws:Referer条件键指定StringLike条件。

{
   "Version": "2012-10-17",
   "Id": "http referer policy example",
   "Statement": [
     {
       "Sid": "Allow get requests referred by www.example.com and example.com.",
       "Effect": "Allow",
       "Principal": "*",
       "Action": "s3:GetObject",
       "Resource": "arn:aws:s3:::examplebucket/*",
       "Condition": {
         "StringLike": {"aws:Referer": ["http://www.example.com/*","http://example.com/*"]}
       }
     },
      {
        "Sid": "Explicit deny to ensure requests are allowed only from specific referer.",
        "Effect": "Deny",
        "Principal": "*",
        "Action": "s3:*",
        "Resource": "arn:aws:s3:::examplebucket/*",
        "Condition": {
          "StringNotLike": {"aws:Referer": ["http://www.example.com/*","http://example.com/*"]}
        }
      }
   ]
}