保护 S3 资产不被直接下载



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

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

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

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

谢谢

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

请参阅: 使用 CloudFront 的点播和实时流式传输视频 - Amazon CloudFront

然后,您将在 S3 中将视频保持私有,但使用允许 CloudFront 访问内容并将其提供给用户的源访问身份

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

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

默认情况下,所有 S3 资源都是私有的,因此只有创建资源的 AWS 账户才能访问它们。要允许从您的网站对这些对象进行读取访问,您可以添加一个存储桶策略,该策略允许 s3:GetObject 权限,并使用 aws:referer 密钥的条件是 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/*"]}
}
}
]
}

最新更新