我使用Cloud-Front访问S3存储桶中的文件并更新文件。我现在禁用Cloud-Front,但是我现在无法直接通过S3访问这些文件。
此外,当我尝试为存储桶中的项目设置权限时,我会收到一条消息,指出访问被拒绝。对于直接通过S3更新的项目,我没有这样的问题。
如何直接通过s3启用对我的存储桶中文件的访问?
答案 0 :(得分:5)
我遇到了同样的问题:使用Origin Access Identity创建的文件无法被主机帐户(或任何用户帐户)读取,也无法通过CLI,Lambda或Console访问。
我的解决方案是在客户端请求上设置一个标头,允许桶所有者控制文件。
yes = ["yes", "y"]
m = "men"
w = "women"
badkeywordslist = ["depression", "pain", "hurt", "dead", "die", "kill", "hell", "suffering", "cutting", "cut", "death"]
Question1 = input("We will start off simple, what is your name?")
if len(Question1) > 0 and Question1.isalpha():
Question2 = input("Ah! Lovely name, %s. Not surprised you get all the women, or is it men?" % Question1)
if Question2.lower() in m:
print ("So, your name is %s and you enjoy the pleasure of %s! I bet you didnt see that coming." % (Question1, Question2))
elif Question2.lower() in w:
print ("So, your name is %s and you enjoy the pleasure of %s! I bet you didnt see that coming." % (Question1, Question2))
else:
print ("Come on! You're helpless. I asked you a simple question with 2 very destinctive answers. Restart!")
else:
print ("Come on, enter your accurate information before proceeding! Restart me!")
Question3 = input("Now I know your name and what gender attracts you. One more question and I will know everything about you... Shall we continue?")
if Question3.lower() in yes:
Question4 = input("Well, it's quite simple really. What's good in your life and what's bad?")
if Question4 in badkeywordslist:
print ("Oh... So your life isn't going so great now, is it? For starters, are you safe?")
这不应要求更改您的Cloudfront分发版。所有x-amz-acl=bucket-owner-full-control
标题都应自动传递。
我使用需要此标头的存储桶策略补充了此解决方案。因此,人们无法破解我的客户端并上传我无法管理的文件。以下内容添加到允许x-amz-*
原始访问标识的策略语句对象中:
s3:PutObject
原因在Managing Access with ACLs中描述。
例如,如果存储桶拥有者允许上载其他AWS账户 对象,只能使用object来管理这些对象的权限 拥有该对象的AWS账户的ACL。
我发现管理由Origin Access Identity创建的ACL的唯一方法是在对象创建时设置"Condition": {
"StringEquals": {
"s3:x-amz-acl": [
"bucket-owner-full-control"
]
}
}
标头。
答案 1 :(得分:1)
Waylon Flinn's answer的替代方法是在Lambda @ Edge函数中添加/覆盖x-amz-acl
标头。在nodejs中遵循以下原则:
exports.handler = (event, context, callback) => {
const { request } = event.Records[0].cf;
const { headers } = request;
headers['x-amz-acl'] = [{key: 'x-amz-acl', value: 'bucket-owner-full-control'}];
callback(null, request);
};
优点是您不再需要Waylon在其答案中写的策略,因为您总是在自己可信任的环境中自行设置x-amz-acl
头。缺点是Lambda @ Edge具有自身的复杂性,怪癖和额外成本。由您决定哪种方法更适合您的用例。
当Waylon在2016年写下答案时,Lambda @ Edge根本不可用。它于2017年7月17日(将近一年后):Lambda@Edge now Generally Available普遍可用。
答案 2 :(得分:-1)
曾经有过几次问题。解决方案是创建CloudFront Origin Access Identity并在创建CF时将其添加到您的分发。
分发 - >流媒体 - >分发设置 - >编辑 限制存储桶访问:是 源访问标识:使用现有(您可能需要设置) 授予读取权限:是的 限制查看者访问(使用签名URL):是 值得信赖的签名者:自我 ...用于休息的默认值...
我希望有帮助