搭建 MinIO Gateway 的一點點問題


前言

MinIO Gateway 是一款可以代理 S3、Azure、Nas、HDFS 等服務的軟件。可以讓用戶以兼容 S3 的方式來訪問所代理的服務。

具體介紹見:https://docs.min.io/docs/minio-gateway-for-s3.html

使用場景

一、一套代碼支持不同對象存儲產品。

當前市面常見的對象存儲產品有:

  • 阿里雲 OSS
  • 騰訊雲 COS
  • 華為雲 OBS
  • Amazon S3
  • 開源 MinIO

如果你的服務需要使用對象存儲,但不同的場景下使用的對象存儲服務並不一致,為了避免增加代碼開發中適配多種產品的復雜性,

可以使用 MinIO Gateway 做一層代理,代碼中僅需支持 MinIO 的訪問方式即可。

二、避免大量開通雲服務子帳號。

在公司內部,當我們使用雲服務商的對象存儲產品時,是必須開通雲產品的子帳號才能訪問的。而子帳號的開通和管理其實並不是

很方便,並且還沒辦法接入比如 LDAP 等帳號管理系統。此時也可以將對象存儲服務用 MinIO Gateway 做一層代理,然后通過 Gateway

來管理對象存儲服務的帳號,支持各種帳號管理方式。比如 Keycloak、 LDAP、內部用戶等。

具體參見:https://docs.min.io/docs/minio-sts-quickstart-guide

MinIO Gateway 搭建

基本搭建步驟參考官方文檔:https://docs.min.io/docs/minio-gateway-for-s3.html

可以使用 docker 或者二進制文件等方式啟動 Gateway 服務。

下面說點不一樣的

MinIO 編譯

編譯很簡單,MinIO 使用 Go 語言開發,所以需要安裝 Go,參見:https://go.dev/doc/install

然后源碼中已經有寫好的 Makefile,直接執行 make 即可。

適配騰訊雲 COS

MinIO Gateway 在啟動時會隨機生成一個 Bucket 名稱,然后利用檢查 Bucket 是否存在的 API 確認 S3 服務是否可用,期待的返回狀態碼是 404,

但騰訊雲 COS 強制每個 Bucket 的名字后綴為一串數字 ID,如果不符合格式,則響應 400,導致 MinIO Gateway 探測失敗。

日志如下:

"""
---------START-HTTP---------
GET /probe-bucket-sign-99lrqve1qm4x/?location= HTTP/1.1
Host: cos.ap-beijing.myqcloud.com
User-Agent: MinIO (darwin; amd64) minio-go/v7.0.20
Authorization: AWS4-HMAC-SHA256 Credential=AKID2uWrwlJabKnzwd3CCwPbWBZhZBWZLr64/20220118/us-east-1/s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date, Signature=**REDACTED**
X-Amz-Content-Sha256: UNSIGNED-PAYLOAD
X-Amz-Date: 20220118T155622Z
Accept-Encoding: gzip

HTTP/1.1 400 Bad Request
Content-Length: 437
Connection: keep-alive
Content-Type: application/xml
Date: Tue, 18 Jan 2022 15:56:25 GMT
Server: tencent-cos

<?xml version='1.0' encoding='utf-8' ?>
<Error>
	<Code>InvalidURI</Code>
	<Message>Could not parse the specified URI.</Message>
	<Resource>cos.ap-beijing.myqcloud.com/probe-bucket-sign-99lrqve1qm4x</Resource>
</Error>

---------END-HTTP---------
"""

在 MinIO 官方以及騰訊雲官方都不做修改的情況下,只能通過修改源碼重新編譯來解決問題。

代碼修改位置如下:

https://github.com/minio/minio/cmd/gateway/s3/gateway-s3.go

將其中的 randString 函數返回值修改為數字后綴,比如下圖:

img

然后編譯即可。

使用獨立帳號體系

默認情況下,MinIO 自帶一套帳號管理體系,不需要任何配置,但缺點是一旦服務重啟則帳號信息丟失。

為了持久化存儲帳號數據,需要配合 Etcd 服務。

Etcd部署參見:

https://github.com/etcd-io/etcd/releases

MinIO Gateway 啟動方式如下:

#!/bin/sh
export MINIO_ROOT_USER="Access Key"
export MINIO_ROOT_PASSWORD="Access Secret"
export _MINIO_SERVER_DEBUG=off # 是否開啟DEBUG 僅為了查看日志 on|off
export MINIO_ETCD_ENDPOINTS=http://localhost:2379 # 使用 ETCD 持久化存儲內部用戶
export MINIO_ETCD_PATH_PREFIX=minio/ # ETCD 中存儲的數據的前綴
./minio gateway s3 https://cos.ap-beijing.myqcloud.com --console-address 0.0.0.0:9100

不過這種方式有個缺點,新創建的 MinIO Gateway 賬密是明文存儲在 Etcd 中的。。。

解決辦法如下:

  1. 控制 Etcd 的訪問權限,避免被其他人訪問。

  2. 使用 MinIO 自己的加密方式,參考:https://docs.min.io/docs/minio-kms-quickstart-guide.html。但加密這個功能,加密的地方有點多,而且有點小BUG,比如展示出來的S3文件列表不全。。。所以我放棄了。

集成 LDAP

官方文檔:https://github.com/minio/minio/blob/master/docs/sts/ldap.md

啟動方式如下:

#!/bin/sh
export MINIO_ROOT_USER="Access Key"
export MINIO_ROOT_PASSWORD="Access Secret"
export _MINIO_SERVER_DEBUG=off # 是否開啟DEBUG 僅為了查看日志  on|off
export MINIO_IDENTITY_LDAP_SERVER_ADDR="LDAP服務器:LDAP服務端口"
export MINIO_IDENTITY_LDAP_LOOKUP_BIND_DN="{LDAP 帳號}" # 例如 cn=readonly,dc=test,dc=com  僅用只讀帳號即可
export MINIO_IDENTITY_LDAP_LOOKUP_BIND_PASSWORD="{LDAP 密碼}"
export MINIO_IDENTITY_LDAP_USER_DN_SEARCH_BASE_DN='ou=People,dc=test,dc=com' # 搜索域
export MINIO_IDENTITY_LDAP_USER_DN_SEARCH_FILTER='(uid=%s)' # 用來過濾登錄的帳號 %s會被填充用戶名
export MINIO_IDENTITY_LDAP_TLS_SKIP_VERIFY=on
export MINIO_IDENTITY_LDAP_SERVER_INSECURE=on
export MINIO_IDENTITY_LDAP_SERVER_STARTTLS=off
./minio gateway s3 https://cos.ap-beijing.myqcloud.com --console-address 0.0.0.0:9100

集成 LDAP 的好處就是不用單獨開通帳號即可使用,但比較麻煩的是,只能通過命令行 mc 來對用戶進行授權。而且當需要給公司外部人員開通帳號時,也必須得開通 LDAP 帳號,可能面臨一定的風險。

集成 Audit Log 功能(審計日志)

默認情況下,當僅僅使用 MinIO 的 Gateway 功能時,Admin API 以及很多特性比如 Audit log 都是沒有開放的。

這個時候就又到了改代碼重新編譯的時候。

首先是啟用 Admin API,修改代碼位置如下:

https://github.com/minio/minio/cmd/gateway-main.go

將下圖所示地方改為 true:

然后重新編譯即可。

下面是開啟 Audit log。參見:https://github.com/minio/operator/tree/master/logsearchapi

按照文檔步驟,啟動 postgres 數據庫,然后啟動 logsearchapi 服務,這些都沒有問題。

postgres啟動:

docker run -d \
    --name postgres \
    -p 5432:5432 \
    -e POSTGRES_PASSWORD="xxx" \
    -e PGDATA=/var/lib/postgresql/data/pgdata \
    -v /data/postgres:/var/lib/postgresql/data \
    postgres:14.1 -c "log_statement=all"

logsearchapi啟動(注意 logsearchapi 命令也是需要下載源碼然后編譯的)

export LOGSEARCH_PG_CONN_STR="postgres://postgres:xxx@localhost/postgres?sslmode=disable"
export LOGSEARCH_AUDIT_AUTH_TOKEN=logsearch_audit
export MINIO_LOG_QUERY_AUTH_TOKEN=logsearch_query
export LOGSEARCH_DISK_CAPACITY_GB=5
./logsearchapi

但當我嘗試使用 mc admin 命令設置 aduit_webhook 參數時,卻會出現莫名奇妙的錯誤,一番嘗試后放棄,改用其他方式。

將如下代碼加入啟動腳本即可:

# audit log 功能
export MINIO_AUDIT_WEBHOOK_ENABLE_1="on" # audit log 功能
export MINIO_AUDIT_WEBHOOK_ENDPOINT_1="http://localhost:8080/api/ingest?token=logsearch_audit" # audit log 功能
export MINIO_LOG_QUERY_URL="http://localhost:8080"
export MINIO_LOG_QUERY_AUTH_TOKEN="logsearch_query"
export LOGSEARCH_QUERY_AUTH_TOKEN="logsearch_query"


免責聲明!

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



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