实现思路
要实现 S3 目录级别的公开访问,核心是通过 Bucket Policy(存储桶策略) 来精确控制权限,而不是直接开放整个存储桶。策略会指定允许匿名用户(所有互联网用户)对特定前缀(即目录)下的所有对象执行
s3:GetObject 操作(下载操作)。具体操作步骤
1. 编写精准的 Bucket Policy
以下是可以直接使用的策略模板,你需要替换其中的占位符:
your-bucket-name:你的 S3 存储桶名称your-target-directory/:你要公开的目录路径(结尾必须加/,表示该目录及所有子文件 / 子目录)
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicReadForSpecificDirectory",
"Effect": "Allow",
"Principal": "*", // 表示所有用户(匿名用户)
"Action": "s3:GetObject", // 允许下载操作
"Resource": "arn:aws:s3:::your-bucket-name/your-target-directory/*" // 限定目录下的所有文件
}
]
}
2. 应用 Bucket Policy 的操作步骤
方式 1:通过 AWS 控制台设置
- 登录 AWS 管理控制台,进入 S3 服务。
- 选择你的目标存储桶,点击 权限(Permissions) 标签。
- 找到 Bucket policy 选项,点击 编辑(Edit)。
- 将上述模板替换占位符后粘贴进去,点击 保存更改(Save changes)。
- (可选)验证:进入该目录,点击某个文件的 对象操作(Actions) → 查看对象 URL(View object URL),在浏览器中打开该 URL,若能直接下载 / 查看则配置成功。
方式 2:通过 AWS CLI 设置(适合批量 / 自动化场景)
先将上述策略保存为
bucket-policy.json 文件,然后执行以下命令:# 替换占位符后执行
aws s3api put-bucket-policy --bucket your-bucket-name --policy file://bucket-policy.json
3. 注意事项(避坑关键)
- 关闭存储桶的 “Block public access” 限制:
- 进入存储桶的 权限(Permissions) → Block public access (bucket settings) → 点击 编辑(Edit)。
- 取消勾选
Block public access to buckets and objects granted through new bucket policies和Block public access to buckets and objects granted through any bucket policies(仅针对需要公开的存储桶),保存更改。
- 目录路径的写法:
- 若要公开
docs/download/目录,Resource需写为arn:aws:s3:::your-bucket-name/docs/download/*(*表示该目录下所有文件)。 - 不要遗漏结尾的
/*,否则仅匹配目录本身(S3 中目录不是实际对象,无意义)。
- 若要公开
- 最小权限原则:
- 仅开放
s3:GetObject操作,不要开放s3:ListBucket(避免匿名用户列出目录下的所有文件)。 - 仅限定需要公开的目录,不要开放整个存储桶。
- 仅开放
验证是否生效
- 复制目录下某个文件的 对象 URL(格式:
https://your-bucket-name.s3.REGION.amazonaws.com/your-target-directory/filename.txt)。 - 在浏览器中打开该 URL,若能直接下载 / 查看文件,说明权限配置成功。
- 尝试访问存储桶中其他非公开目录的文件,应返回
AccessDenied错误(确保权限仅作用于目标目录)。
总结
- 核心是通过 Bucket Policy 精准限定匿名用户仅能对指定目录执行
s3:GetObject操作,实现公开下载。 - 必须调整存储桶的 “Block public access” 配置,否则策略会被拦截,无法生效。
- 遵循最小权限原则,仅开放必要的目录和操作,避免安全风险。
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/tech/aiops/319316.html