亚马逊s3视频文件只能从我的域/服务器访问?

时间:2012-03-11 21:20:09

标签: amazon-s3

现在,我知道我无法阻止某人下载我的视频和分享,但我更愿意这样做,以便人们不会将粘贴链接直接复制到我的存储桶中。因此,有没有办法让我的存储桶只能从我的服务器/域发出请求?

如果有帮助,我正在使用jwplayer,它从包含所有链接的xml播放列表加载。这个播放列表绝对可以在任何地方打开和查看,是我希望轻松复制和粘贴的地方。

我不想屏蔽网址,因为这意味着我的存储桶对所有人都可读。可能有人有机会找到我的桶的URL和文件的名称并将所有内容连接在一起......

5 个答案:

答案 0 :(得分:7)

这可以通过Using Bucket Policies来实现,它允许您定义Amazon S3资源的访问权限 - 有几个Example Cases for Amazon S3 Bucket Policies说明了这些功能,其中包括我们还将找到限制访问特定IP地址的示例:

  

此语句向任何用户授予执行任何S3操作的权限   在指定存储桶中的对象上。但是,请求必须   源自条件中指定的IP地址范围。

根据您的用例的具体情况,针对此的存储桶策略可能如下所示:

{
    "Version": "2008-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "*" 
            },
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::bucket/*",
            "Condition" : {
                "IpAddress" : {
                    "aws:SourceIp": "192.168.143.0/24" 
                },
                "NotIpAddress" : {
                    "aws:SourceIp": "192.168.143.188/32" 
                } 
            } 
        } 
    ]
}

如图所示,参数aws:sourceIpIPAddress的{​​{1}}值在CIDR notation中表示,从而为组成所需范围提供了相应的灵活性。

最后,您可能需要查看推荐的AWS Policy Generator,选择类型 S3 Bucket Policy 并浏览可用的操作条件最终为您的用例撰写更具针对性的策略 - Conditions的文档详细解释了这一点。

答案 1 :(得分:6)

如果您的服务器要访问您的存储桶,IP地址将有所帮助。但JWPlayer来自客户端。所以请求直接从jwplayer(浏览器)到s3 bucket url,而不是通过你的服务器。在这种情况下,“推荐人桶政策”将帮助您。

{
"Version": "2008-10-17",
"Statement": [
  {
    "Sid": "1",
    "Effect": "Deny",
    "Principal": {
      "AWS": "*"
    },
    "Action": "s3:GetObject",
    "Resource": "arn:aws:s3:::yourbucketname/*",
    "Condition": {
      "StringNotLike": {
        "aws:Referer": [
          "http://yoursitename.com/*",
          "http://*.yoursitename.com/*"
        ]
      }
    }
  }
]
}

所以现在s3将允许该请求仅来自您的网站。

答案 2 :(得分:1)

您可以保护您的存储桶,默认情况下是这样。 (意味着您只能访问其中的对象)然后,您可以从您的网站请求Amazon S3中的文件,并为其提供用户可以看到的时间限制。

//set time so that users can see file for 1 minute. then it is protected again.
$response = $s3->get_object_url(YOUR_A3_BUCKET, PATH/TO/FILE, '1 minutes');

这将自动为您提供一个与其关联的参数的网址,该网址只能在1分钟内访问。您可以将其用作网站中的来源,然后在1分钟后无法将其复制并粘贴到浏览器中。

您可以在Amazon SDK for PHP

了解详情

答案 3 :(得分:0)

限制对特定HTTP引荐来源的访问

假设您有一个域名网站(www.example.com或example.com),其中包含存储在您的Amazon S3存储桶中的照片和视频的链接,examplebucket。默认情况下,所有Amazon S3资源都是私有的,因此只有创建资源的AWS账户才能访问它们。要允许从您的网站对这些对象进行读访问,您可以使用aws:referer键添加一个允许s3:GetObject权限的存储桶策略,该条件允许get请求必须来自特定网页。以下策略使用aws:Referer条件键指定StringLike条件。

http://docs.aws.amazon.com/AmazonS3/latest/dev/example-bucket-policies.html

答案 4 :(得分:0)

对于现在遇到这个问题的每个人,请注意亚马逊已经更改了存储桶策略的 JSON 格式,现在要求单独列出每个允许/拒绝的 IP 或域。请参阅下面的示例。

无论哪种方式,我都强烈建议您使用 AWS Policy Generator 来确保您的格式正确。

AWS S3 存储桶策略 - 仅允许从多个 IP 访问

{
  "Id": "Policy1618636210012",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1618635877058",
      "Action": [
        "s3:GetObject"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::bucketname/folder/*",
      "Condition": {
        "IpAddress": {
          "aws:SourceIp": "333.444.555.666"
        }
      },
      "Principal": "*"
    },
    {
      "Sid": "Stmt1618636151833",
      "Action": [
        "s3:GetObject"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::bucketname/folder/*",
      "Condition": {
        "IpAddress": {
          "aws:SourceIp": "222.333.444.555"
        }
      },
      "Principal": "*"
    },
    {
      "Sid": "Stmt1618636203591",
      "Action": [
        "s3:GetObject"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::bucketname/folder/*",
      "Condition": {
        "IpAddress": {
          "aws:SourceIp": "111.222.333.444"
        }
      },
      "Principal": "*"
    }
  ]
}