欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

如何为MinIO存储桶设置自定义权限

最编程 2024-07-27 15:56:55
...

趁热记录下,给未来的自己

前言

我们在使用MinIO作为文件存储组件的时候,遇到了这样一个业务问题:

首先,MinIO的桶只有publicprivate两种权限:

  • public:所有人都可以访问该桶的资源,包括桶内的文件内容和文件目录
  • private:所有人都无法直接访问该桶的资源,如果外部需要访问,只能通过外链(最长有效期7天)

而我们的业务需求是要把用户头像放入MinIO的桶中,如果设置桶为public,那么所有人都可以遍历平台上注册用户的头像信息,这会造成隐私泄露;如果桶设置为private,那么只能以外链的形式给到给到前端,7天后,该外链i失效,导致前端页面无法展示用户头像。

那么,是否可以既不暴露桶中所有的用户头像信息,又能永久访问(不通过外链形式)指定的用户头像文件呢?

解决方案

通过mc工具,对指定桶的policy进行定制化配置

1. 创建一个名为test的桶

默认policyprivate,演示起见,可以先设为public

2. 上传一个文件到test桶中

在浏览器中访问该桶的目录,可以发现列出了该桶下的文件目录:

3. 设置该桶具有下载权限:

mc policy download minio/test

4. 查看当前桶策略json文件:

mc get-json minio/test

Policy文件 (test_policy.json) 如下:

{
	"Statement": [{
			"Action": [
				"s3:GetBucketLocation",
				"s3:ListBucket"
			],
			"Effect": "Allow",
			"Principal": {
				"AWS": [
					"*"
				]
			},
			"Resource": [
				"arn:aws:s3:::test"
			]
		},
		{
			"Action": [
				"s3:GetObject"
			],
			"Effect": "Allow",
			"Principal": {
				"AWS": [
					"*"
				]
			},
			"Resource": [
				"arn:aws:s3:::test/*"
			]
		}
	],
	"Version": "2012-10-17"
}

可以看到,在action中有s3:ListBucket这一项是allow的,所以我们可以在浏览器中遍历目录,删除即可

5. 修改test_policy.json如下:

{
	"Statement": [{
			"Action": [
				"s3:GetBucketLocation"
			],
			"Effect": "Allow",
			"Principal": {
				"AWS": [
					"*"
				]
			},
			"Resource": [
				"arn:aws:s3:::test"
			]
		},
		{
			"Action": [
				"s3:GetObject"
			],
			"Effect": "Allow",
			"Principal": {
				"AWS": [
					"*"
				]
			},
			"Resource": [
				"arn:aws:s3:::test/*"
			]
		}
	],
	"Version": "2012-10-17"
}

6. 重新应用该policy

mc policy set-json test_policy.json minio/test

7. 验证:

可以看到,无法再遍历桶目录了。