目前我有一个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对我的对象施加的公共访问设置。
任何人都可以建议这是否正确或是否有更好的方法?
答案 0 :(得分:3)
TLDR:您应该将fog_public
设置为false,以确保文件在其他设置之外是私有的。然后,不是根据url
设置调用fog_public
,而是调用应始终返回asset_host样式网址的public_url
。
详细说明:
config.fog_public = true
做两件事:
而config.fog_public = false
做了两件不同的事情:
不幸的是,你想要每种方法的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