# MinIO 存储桶权限安全优化笔记 ## 1. 背景 ### 1.1 问题现象 安全测试系统中发现 MinIO 存储桶存在匿名访问风险。Contents Keyupload/20250813/1be6ba05988129d5deff1c3b362e88c1.jpeg/Key LastModified2026-04-03T06:25:44.545Z/LastModified ETag9d7546b9ac36a5cc934c49f627441989/ETag Size77506/Size Owner ID02d6176db174dc93cb1b899f7c6078f08654445fe8cf1b6ce98d8855f66bdbf4/ID DisplayNameminio/DisplayName /Owner StorageClassSTANDARD/StorageClass /Contents Contents Keyupload/20250813/1d183e7062fd1f00822250ee9d7f13a6.jpeg/Key LastModified2026-04-03T06:25:44.555Z/LastModified ETagd8077aac12f399a22d96838981960070/ETag Size635282/Size Owner ID02d6176db174dc93cb1b899f7c6078f08654445fe8cf1b6ce98d8855f66bdbf4/ID DisplayNameminio/DisplayName /Owner StorageClassSTANDARD/StorageClass /Contents Contents Keyupload/20250813/2ea120e410016228ea8d11c15434fe59.jpeg/Key LastModified2026-04-03T06:25:44.561Z/LastModified ETag2088d94a95ebdcdf4fabea042496eaf5/ETag Size1303390/Size Owner ID02d6176db174dc93cb1b899f7c6078f08654445fe8cf1b6ce98d8855f66bdbf4/ID DisplayNameminio/DisplayName /Owner StorageClassSTANDARD/StorageClass /Contents Contents Keyupload/20250813/49365e3791f6c2c01b9e600d1a2f08ac.png/Key LastModified2026-04-03T06:25:44.596Z/LastModified ETagf19cc52e94b6845585a50fdb0ac31190/ETag Size569854/Size Owner ID02d6176db174dc93cb1b899f7c6078f08654445fe8cf1b6ce98d8855f66bdbf4/ID DisplayNameminio/DisplayName /Owner StorageClassSTANDARD/StorageClass /Contents说明匿名用户可以直接访问 Bucket并获取对象列表。2. 漏洞风险分析当前 Bucket 策略{ Version: 2012-10-17, Statement: [ { Effect: Allow, Principal: { AWS: [ * ] }, Action: [ s3:GetBucketLocation, s3:ListBucket, s3:ListBucketMultipartUploads ], Resource: [ arn:aws:s3:::000000-internet ] }, { Effect: Allow, Principal: { AWS: [ * ] }, Action: [ s3:AbortMultipartUpload, s3:DeleteObject, s3:GetObject, s3:ListMultipartUploadParts, s3:PutObject ], Resource: [ arn:aws:s3:::000000-internet/* ] } ] }该策略实际效果匿名用户拥有权限风险查看Bucket列表高危查看文件路径高危下载文件中匿名上传文件严重匿名删除文件严重查看分片上传低等价于互联网用户 | | -- 查看所有文件 | -- 下载任意文件 | -- 上传任意文件 | -- 删除任意文件3. MinIO权限模型MinIO 使用 AWS S3 兼容权限模型。权限结构Bucket | -- Bucket级权限 | -- Object对象级权限例如Bucket:arn:aws:s3:::000000-internet-hospital对象arn:aws:s3:::000000-internet-hospital/*区别资源作用bucket ARN控制桶级操作bucket/*控制文件对象操作4. Policy JSON结构说明标准结构{ Version: 2012-10-17, Statement: [] }4.1 Version示例Version:2012-10-17表示使用 AWS IAM Policy 最新版本规范。固定值2012-10-17一般不用修改。5. Statement参数说明Statement 是权限规则集合。例如{ Effect:Allow, Principal:*, Action:s3:GetObject, Resource:xxx }5.1 Effect权限效果。两个值Allow允许Effect:AllowDeny拒绝Effect:Deny注意Deny优先级最高。例如同时存在Allow GetObject Deny GetObject最终拒绝。6. Principal 参数表示谁拥有这个权限。6.1 匿名用户Principal:{ AWS:[ * ] }表示所有互联网用户。风险最高。6.2 指定用户例如Principal:{ AWS:[ minio-user ] }表示指定账号。7. Action权限说明Action决定可以执行什么操作。7.1 Bucket相关权限s3:ListBucket作用列出Bucket文件。请求GET /bucket返回ListBucketResult Contents Keyxxx.jpg/Key /Contents /ListBucketResult风险高。互联网公开图片场景通常禁止。s3:GetBucketLocation作用查询Bucket位置。例如GET /?location风险低。s3:ListBucketMultipartUploads作用查看正在进行的分片上传任务。风险低。7.2 Object对象权限s3:GetObject作用读取文件。例如GET /bucket/a.jpg用途图片访问。公开图片允许。s3:PutObject作用上传文件。例如PUT /bucket/a.jpg风险非常高。不要给匿名。s3:DeleteObject作用删除对象。风险非常高。不要给匿名。s3:AbortMultipartUpload作用取消分片上传。风险中低。s3:ListMultipartUploadParts作用查看分片上传详情。风险低。8. 本次整改目标目标允许匿名访问图片禁止匿名查看文件列表 匿名上传 匿名删除9. 最终安全策略MinIO Bucket:000000-internetAnonymous Policy:{ Version: 2012-10-17, Statement: [ { Effect: Allow, Principal: { AWS: [ * ] }, Action: [ s3:GetObject ], Resource: [ arn:aws:s3:::000000-internet/* ] } ] }10. 整改后的权限效果Bucket访问请求GET /000000-internet结果403 AccessDenied禁止ListBucketResult文件访问请求GET /000000-internet/upload/a.jpeg结果200 OK图片正常显示。11. Java上传是否影响后端SDK上传模式架构用户 | Spring Boot | MinIO SDK | MinIOJava配置minio: endpoint: access-key: secret-key:属于认证用户。不会受到匿名策略影响。不推荐模式前端直接上传浏览器 | | MinIO依赖匿名PutObject修改后会失败。12. 推荐生产架构普通图片例如医生头像医院Logo宣传图片策略private bucket 后端生成临时URL或者匿名GetObject 随机文件名 禁止ListBucket医疗敏感文件例如检查报告病历身份资料必须private bucket Presigned URL例如有效时间10分钟13. 文件命名安全不推荐patient/10001/report.pdf容易猜测。推荐upload/20260708/ 8f8d9d3f-a3f9-xxxx.pdf特点随机不可枚举。14. MinIO安全检查清单Bucket禁止Public权限禁止匿名ListBucket禁止匿名PutObject禁止匿名DeleteObject网络MinIO Console不要公网开放API端口限制访问使用HTTPS数据敏感文件私有存储使用随机文件名开启访问日志账号禁止使用root账号给应用使用创建独立AccessKey最小权限原则15. 验证命令测试Bucket枚举curl -I \ https://xxx.com/oss/bucket期望403 Forbidden测试文件访问curl -I \ https://xxx.com/oss/bucket/upload/test.jpg期望200 OK16. 本次最终结论整改前匿名用户 ListBucket GetObject PutObject DeleteObject属于高风险公开Bucket。整改后匿名用户 只允许 GetObject 禁止 ListBucket PutObject DeleteObject达到图片可访问 目录不可枚举