仅限应该打开的网站限制对s3文件的直接访问

时间:2017-09-26 11:37:53

标签: ruby-on-rails amazon-web-services amazon-s3

我试图限制对aws s3存储桶中文件的直接访问,只能从该文件应该可见的网站,我尝试使用不同的策略。但没有什么对我有用。

{ "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:::ex-bucket/*", "Condition": { "StringLike": {"aws:Referer": ["https://www.example.com/*","https://example.com/*"]} } },
{ "Sid": "IPAllow", "Effect": "Allow", "Principal": "*", "Action": "s3:*", "Resource": "arn:aws:s3:::ex-bucket/*", "Condition": { "NotIpAddress": { "aws:SourceIp": "00.00.000.00" }, "IpAddress": { "aws:SourceIp": "00.00.000.00" } } }
] }

对此有任何建议。

1 个答案:

答案 0 :(得分:0)

如果您想允许访问具有特定域的存储桶,请尝试使用

以下是如何将www.example.com和example.com设置为有效参考的示例。 在“添加存储桶策略”字段中添加以下策略:

{ 
"Version": "2012-10-17",
"Id": "http referer policy example",
"Statement": [ 
        { 
               "Sid": "Allow get requests originating from www.example.com and example.com.",
               "Effect": "Allow",
               "Principal": "*", 
               "Action": "s3:GetObject",
               "Resource": "arn:aws:s3:::s3-foo-bar/*",
               "Condition": { 
                       "StringLike": { 
                             "aws:Referer": [ 
                                    "http://www.example.com/*",
                                    "http://example.com/*" 
                              ] 
                       }
               }
        }

默认情况下,除非通过策略授予帐户访问权限,否则会限制帐户访问S3。但是,S3默认设计为允许任何IP地址访问。因此,要阻止IP,您必须在策略中明确指定拒绝而不是允许。

{
"Id": "S3PolicyId1",
"Statement": [
    {
        "Sid": "IPDeny",
        "Effect": "Deny",
        "Principal": {
            "AWS": "*"
        },
        "Action": "s3:*",
        "Resource": "arn:aws:s3:::s3-foo-bar/*",
        "Condition": {
            "NotIpAddress": {
                "aws:SourceIp": "Your IP Address CIDR Notation"
            }
        }
    }
  ]
}

如果要禁用对存储桶的直接访问:

您可以将文件设为私有并生成已签名的网址,以允许某人临时访问这些文件:Share an Object with Others

另一种方法可以是Serve Private Content via Cloudfront

或者您可以设置限制人们直接访问上述文件的策略,只允许他们访问从您的网站链接的文件

或者您可以通过某些脚本发送文件来提供这些文件,即将文件下载到服务器并从那里返回文件内容。在这种情况下,您可以在S3中将这些文件设为私有,甚至可以将它们移动到完全私有的单独存储桶中。我不推荐这种方法,因为它会给你的服务器带来更多的负担。

希望这会有所帮助