起因

最近因为 C 端项目改造,我们决定将前端的静态资源存储到 AWS S3 服务上,然后再通过 CDN 进行分发。这样减轻主站的流量压力的同时,提高用户的访问速度。

目前我们后端用的 Access ID 是拥有完全权限的,所以这里需要定义一个只能访问特定目录的用户。避免前端同事操作其他对象文件。

为用户指定策略

登录 AWS 控制台,访问Identity and Access Management 页面,点击右侧 User(用户)菜单。

然后在用户列表中点击需要设置访问策略的用户,进入详情页,在用户权限选项卡中点击添加内联策略。然后复制下面的 JSON 策略内容到你的策略编辑器的 JSON 编辑中。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "ReadBucketObjects",
            "Effect": "Allow",
            "Action": "s3:ListBucket",
            "Resource": [
                "arn:aws:s3:::BUCKET_NAME"
            ],
            "Condition": {
                "StringLike": {
                    "s3:prefix": [
                        "SPECIFIC_PATH"
                    ]
                }
            }
        },
        {
            "Sid": "WriteStaticObjects",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:DeleteObject"
            ],
            "Resource": [
                "arn:aws:s3:::BUCKET_NAME/SPECIFIC_PATH/*"
            ]
        }
    ]
}

上面的策略中,只需要根据你实际的情况替换 BUCKET_NAME 为你的 Bucket 名称, SPECIFIC_PATH 替换成指定的路径即可。

例如如果只允许用户访问名为 static 的 Bucket,下的 templates 目录,可以将上述的 BUCKET_NAMESPECIFIC_PATH 分别替换。

特殊情况

当我为用户分配了策略以后使用 Transmit 这个 GUI 客户端登录用户,发现依然可以访问 Bucket 下的所有对象,并且可以删除,似乎策略并没有生效。

经过多次的测试与排查,发现是因为在 Bucket 中的权限设置 ACL 勾选了 经身份验证的用户组(拥有 AWS 账户的任何人) 的所有权限。导致即使未分配任何策略也可以访问整个 Bucket。

I hope this is helpful, Happy hacking…