我将我的资产(图像/视频等)存储在S3中,并且一切正常。
但是,视频需要用户安全下载。我已经考虑过使用Ajax和Blob以及隐藏上下文菜单等多种方式,但希望使用更简单但更强大的技术。
我想到的想法是在S3存储桶上添加保护,以便只能从网站本身(EC2实例可以访问的Iam角色)访问资产。
只是不确定这是如何工作的。该存储桶设置为静态网站托管,因此其中的所有内容都是公共的,我想我需要进行更改,然后添加一些直接权限。有没有人做过或者没有人提供有关是否可能的信息。
谢谢
答案 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/*"]}
}
}
]
}