如何使用S3,CloudFront和Carrierwave设置私有文件

时间:2016-07-11 14:28:49

标签: amazon-s3 carrierwave fog

目前我有一个S3 Bucket,其访问策略仅允许从CloudFront Origin Access Identity访问:

{
    "Version": "2012-10-17",
    "Id": "PolicyForCloudFrontPrivateContent",
    "Statement": [
        {
            "Sid": "Grant a CloudFront Origin Identity access to support private content",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity XXXXXXXXXX"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::my-bucket/*"
        }
    ]
}

这可以防止对不通过CloudFront分配的S3资产的任何访问。

但是,当我将S3网址输入网络浏览器时,我仍然可以访问该文件。

我正在使用Carrierwave和Fog将文件上传到S3并拥有config.fog_public = true所以我相信发生的事情是Fog正在对上传的对象进行公共访问设置。

我尝试将设置更改为config.fog_public = false,但之后又开始返回忽略我的asset_host设置的已签名网址(因此提供了已签名的S3网址而非未签名的CloudFront网址)。 / p>

我认为我需要保留config.fog_public = true并拥有一个S3存储桶策略来覆盖Fog对我的对象施加的公共访问设置。

任何人都可以建议这是否正确或是否有更好的方法?

2 个答案:

答案 0 :(得分:3)

TLDR:您应该将fog_public设置为false,以确保文件在其他设置之外是私有的。然后,不是根据url设置调用fog_public,而是调用应始终返回asset_host样式网址的public_url

详细说明:

config.fog_public = true做两件事:

  1. 在创建文件时设置公共可读
  2. 返回公共风格的网址以供阅读
  3. config.fog_public = false做了两件不同的事情:

    1. 创建文件时将public readable设置为false
    2. 返回私人/签名式网址以供阅读
    3. 不幸的是,你想要每种方法的1/2,而载波中的url并不直接支持。

      我想您可能希望离开config.fog_public = false以确保文件是您想要的私密文件,但您可能必须以不同的方式获取网址,以便让它们显示在看似公共的网址中欲望。通常使用carrierwave建议你应该使用url来获得你想要的东西,并且它具有基于fog_public设置的分支逻辑。您可以跳过此逻辑,只需调用public_url即可获取asset_host网址。

      所有这一切,出于我自己的好奇心,如果文件将通过CDN公开提供,为什么他们需要通过S3私有?

答案 1 :(得分:0)

在这里,您可以了解如何配置每个模型(一个公开,另一个私有):https://stackoverflow.com/a/18800662/5945650