MinIO設置永久訪問鏈接


MinIO 介紹

MinIO 是一個基於 Apache License v2.0 開源協議的對象存儲服務。它兼容亞馬遜 S3 雲存儲服務接口,非常適合於存儲大容量非結構化的數據,例如圖片、視頻、日志文件、備份數據和容器/虛擬機鏡像等,而一個對象文件可以是任意大小,從幾 kb 到最大 5T 不等。

https://docs.min.io/cn/

有效期限制

文件上傳到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 OnlyRead 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存儲空間的策略,依照實際使用需要可以選擇不同途徑設置。如此可以對一些公共資源提供永久訪問,但是也要注意安全性。

參考

  1. https://docs.min.io/docs/
  2. https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/userguide/access-policy-language-overview.html

2021-11-25,望技術有成后能回來看見自己的腳步


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM