MinIO 介绍
MinIO 是一个基于 Apache License v2.0 开源协议的对象存储服务。它兼容亚马逊 S3 云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几 kb 到最大 5T 不等。
有效期限制
文件上传到minio后,要进行分享时,从管理界面点击分享只能生成最多7 天有效期的链接。
或是使用sdk通过代码调用minio的Api的请求参数也是最大7天有效期。
超过期限再次访问便看不到了
有些资源是需要一直可以访问(公共资源),需要对存储空间(Bucket)进行一番设置方可。
Bucket访问策略
存储空间(Bucket)默认策略有如下几种
- Read Only - download
- Write Only - upload
- Read and Write - public
- 不设置 - none
从管理界面新建一个存储空间,然后查看策略,默认是为空的。
对存储空间(Bucket)的策略更改,可通过管理界面或是命令行形式更改目标桶的访问策略,当然了本质上最终都是对minio server的设置。
解决方案
- minio server管理界面直接操作修改
- minio相关的各语言SDK使用Api请求修改
- minio提供的客户端修改
使用效果
当对存储空间(Bucket)按照如上三种之一设置访问策略后,直接通过如下格式访问即可
域名或ip:端口/桶名称/[文件前缀]/文件名
与直接点击分享链接相比,后缀那节加密算法和凭证参数就不用了
方案一:管理界面
新增一条策略,设置匹配前缀,再选择Read Only 或 Read and Write后点击添加即可。
- 当填写前缀 * 默认该存储空间(Bucket)下所有文件都可以访问
- 当填写特殊前缀对应该存储空间(Bucket)下特定这个前缀开头文件可以访问
如此处设置以下d开头的前缀,那么便只有d开头的文件可以公开访问。
同时访问day.png和autumn.jpg,d前缀访问成功,其他跳转到文件目录下
方案二:SDK请求Api
此处以.Net为主,安装MinIO包,快速创建一个Bucket并设置下访问策略。
var minioClient = new MinioClient(Configuration["MinIO:EndPoint"], Configuration["MinIO:AccessKey"], Configuration["MinIO:SecretKey"]);
提供的SDK中由设置存储空间(Bucket)的方法,提供桶名,策略json格式字符串即可。
在官网给出的调用示例中,设置Policy的参数为一个json,其格式如下,其中部分参数是固定化的,此次需要关心的是对Resource中的Prefix设置,即管理界面中要输入的Prefix。
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"s3:GetBucketLocation"
],
"Effect": "Allow",
"Principal": {
"AWS": [
"*"
]
},
"Resource": [
"arn:aws:s3:::starcity"
],
"Sid": ""
},
{
"Action": [
"s3:ListBucket"
],
"Condition": {
"StringEquals": {
"s3:prefix": [
"foo",
"prefix/"
]
}
},
"Effect": "Allow",
"Principal": {
"AWS": [
"*"
]
},
"Resource": [
"arn:aws:s3:::starcity"
],
"Sid": ""
},
{
"Action": [
"s3:GetObject"
],
"Effect": "Allow",
"Principal": {
"AWS": [
"*"
]
},
"Resource": [
"arn:aws:s3:::starcity/foo*",
"arn:aws:s3:::starcity/prefix/*"
],
"Sid": ""
}
]
}
其格式是由aws s3中给出的,需要了解具体格式内容的话可以参考
https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/userguide/access-policy-language-overview.html
此处设置的话我们只设置Resource部分即存储空间资源部分,通过SDK提供的Api传入一个json设置。
[HttpPost("/UpdatePolicy")]
public async Task UpdatePolicyAsync(string bucketName, string prefix)
{
var existedBucket = await _minioClient.BucketExistsAsync(bucketName);
if (existedBucket)
{
// 固定格式只需变更bucketName和prefix即可
var policyJson = $@"{{""Version"":""2012-10-17"",""Statement"":[{{""Action"":[""s3:GetBucketLocation""],""Effect"":""Allow"",""Principal"":{{""AWS"":[""*""]}},""Resource"":[""arn:aws:s3:::{bucketName}""],""Sid"":""""}},{{""Action"":[""s3:ListBucket""],""Condition"":{{""StringEquals"":{{""s3:prefix"":[""{prefix}""]}}}},""Effect"":""Allow"",""Principal"":{{""AWS"":[""*""]}},""Resource"":[""arn:aws:s3:::{bucketName}""],""Sid"":""""}},{{""Action"":[""s3:GetObject""],""Effect"":""Allow"",""Principal"":{{""AWS"":[""*""]}},""Resource"":[""arn:aws:s3:::{bucketName}/{prefix}*""],""Sid"":""""}}]}}";
await _minioClient.SetPolicyAsync(bucketName, policyJson);
}
}
或者从管理界面设置好后再通过SDK提供的获取桶策略获取json结构,是一致的。
var defaultPolicy = await _minioClient.GetPolicyAsync(bucketName);
如此一来,同样可以在管理界面中看到设置的策略信息以及不需要设置有效期访问文件。
方案三:客户端
minio提供了用来管理minioserver的client和admin,当使用docker时,都在minio/mc镜像下
安装与绑定
通过命令行形式管理存储空间(Bucket)也方便,如使用docker部署,拉取minio client的镜像来管理minio server即可
拉取minio client镜像
docker pull minio/mc
创建minio client容器并进入容器内
docker run -it --entrypoint=/bin/sh minio/mc
将minio server加入到minio client下
mc alias set <alias> <your-minio-endpoint> [YOUR-ACCESS-KEY] [YOUR-SECRET-KEY]
- ALIAS给绑定的minio server起个别名
- YOUR-MINIO-ENDPOINT格式为 schema://host:port
- YOUR-ACCESS-KEY和YOUR-SECRET-KEY即访问minio server的账号与密码
操作命令
再直接按照给定的命令改变下桶的策略
mc policy或是mc anonymous都行,对存储空间进行策略的一系列相关操作。
(mc policy)
(mc anonymous)
设置策略
设置一个prefix的前缀为public,这样一来该部分前缀的文件便可直接访问。
以上三种方式都可以设置下minio存储空间的策略,依照实际使用需要可以选择不同途径设置。如此可以对一些公共资源提供永久访问,但是也要注意安全性。
参考
- https://docs.min.io/docs/
- https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/userguide/access-policy-language-overview.html
2021-11-25,望技术有成后能回来看见自己的脚步