我将一个存储桶配置为网站,并且存储桶策略允许公共访问存储桶中的所有文件夹,但' / _ admin /'夹。只有发出请求的特定Iam用户才能访问' / _ admin /'。这是为了网站的后端管理,所以我正在为用户提供html,js,css等。现在我使用aws javascript sdk将每个url签名为js / css / img src / href链接,然后更新该属性,或者创建它。 (这意味着几乎没有任何内容被缓存,因为每次访问时签名都会更改。)我已经证明了这个概念,我可以通过签署网页中的每个网址来访问这些文件,但这似乎是一种尴尬的构建方式一个网站。
有没有办法可以为每个请求中包含的每个页面添加某种访问标头?如果是这样,这也适用于所有ajax类型的请求吗?
答案 0 :(得分:2)
这就是我想出来解决这个问题的方法。我修改了我的存储桶策略以拒绝对“/ _admin /”的所有匿名访问,除非它来自我的主帐户ID,特定的Iam用户,或者除非引荐来源网址与特定令牌匹配。在用户从我站点上的可公开访问的页面进行身份验证后,我生成一个新令牌,然后使用sdk使用该新令牌的值修改存储桶策略。 (我可能还会添加另一个带有过期日期的条件。)
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicReadGetObject",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::test-domain-structure/*"
},
{
"Sid": "AllowAdminWithToken",
"Effect": "Deny",
"NotPrincipal": {
"AWS": [
"arn:aws:iam::AWS-USER-ID:user/IAM-USER",
"arn:aws:iam::AWS-USER-ID:root"
]
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::test-domain-structure/_admin/*",
"Condition": {
"StringNotLike": {
"aws:Referer": "*?t=a77Pn"
}
}
}
]
}
在每个页面中,我使用javascript在每个链接/ href前面加上新的查询字符串(?t = a77Pn ...或新生成的标记)。
编辑:真的很痛苦。链接一直在破坏,所以最终我采用了下面的解决方案,再加上到期日期的附加条件。工作得更好。
另一种选择是将存储桶策略修改为仅允许从某个IP地址进行访问。这将消除必须修改所有链接/ href并保持网址清洁。仍然愿意接受更好的想法,但现在这仍然适用。