限制全球访问Amazon S3 URL

3
我已经通过CloudFront配置了一个S3存储桶,并使用CloudFront提供的备用域名(我在DNS区域文件中设置了域名别名images.mydomain.com)。 在我的DNS主机上,我将CNAME指向xyz.cloudfront.net。我的S3存储桶名称和CNAME域名别名都是images.mydomain.com。
我希望全世界都能访问我的图像images.mydomain.com/image.jpg,这个功能运行得非常完美。
问题在于,同样的资源也可以通过以下两个URL直接被全世界访问,而我不想让这种情况发生。我只希望images.mydomain.com/image.jpg对全世界开放,而不是下面两个URL。
images.mydomain.com.s3.amazonaws.com/image.jpg s3.amazonaws.com/images.mydomain.com/image.jpg
如何实现这一点? 请帮忙。
1个回答

3
您可以通过创建一个特殊的CloudFront用户——源访问身份来限制对Amazon S3内容的访问。您需要修改Amazon S3权限,允许源访问身份访问您的对象,并删除其他人的权限。当用户使用CloudFront URL访问Amazon S3对象时,CloudFront源访问身份将代表用户获取对象。如果用户试图使用Amazon S3 URL访问对象,则将被拒绝访问。源访问身份有权限访问Amazon S3存储桶中的对象,但用户没有这个权限。具体信息请参考: http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-restricting-access-to-s3.html

1
我已经按照您所解释的做了,实际上我还是按照您引用的同一资源进行的。另外两个URL仍然有效。我需要等待一段时间吗?以下是我的S3存储桶策略:{ "Version": "2008-10-17", "Id": "PolicyForCloudFrontPrivateContent", "Statement": [ { "Sid": "1", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity ***************" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::images.mydomain.com/*" } ] } - user3708270
另外,当我在DNS主机上创建CNAME记录时,我应该使用CloudFront域名(xyz.cloudfront.net)还是S3路径(images.mydomain.com.s3.amazonaws.com)?哪个是正确的? - user3708270
我创建的新策略仍然无法正常工作: { "Id": "Policy1419249708936", "Statement": [ { "Sid": "Stmt************", "Action": "s3:*", "Effect": "Deny", "Resource": "arn:aws:s3:::images.mydomain.com/*", "Principal": { "AWS": [ "*" ] } }, { "Sid": "Stmt************", "Action": [ "s3:GetObject" ], "Effect": "Allow", "Resource": "arn:aws:s3:::images.mydomain.com/*", "Principal": { "AWS": [ "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity **************" ] } } ] } - user3708270
在删除了我为实现上述目标创建的所有存储桶、IAM用户和CloudFront分发之后,我创建了一个新的存储桶,然后创建了一个CloudFront分发来使用新的存储桶,一切都正常工作了。感谢您的帮助@E.J. Brenan。 - user3708270
@user3708270 那么问题是什么?我遇到了同样的问题,只有在删除你的所有桶后才能正常工作吗? - Raja Khoury

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接