在浏览器中管理对s3文件夹的访问 - 最佳做法?

时间:2015-11-10 04:16:32

标签: javascript amazon-web-services amazon-s3 aws-sdk

我将一个存储桶配置为网站,并且存储桶策略允许公共访问存储桶中的所有文件夹,但' / _ admin /'夹。只有发出请求的特定Iam用户才能访问' / _ admin /'。这是为了网站的后端管理,所以我正在为用户提供html,js,css等。现在我使用aws javascript sdk将每个url签名为js / css / img src / href链接,然后更新该属性,或者创建它。 (这意味着几乎没有任何内容被缓存,因为每次访问时签名都会更改。)我已经证明了这个概念,我可以通过签署网页中的每个网址来访问这些文件,但这似乎是一种尴尬的构建方式一个网站。

有没有办法可以为每个请求中包含的每个页面添加某种访问标头?如果是这样,这也适用于所有ajax类型的请求吗?

1 个答案:

答案 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并保持网址清洁。仍然愿意接受更好的想法,但现在这仍然适用。