使用 Keycloak 設定 MinIO 進行身份驗證
概觀
此程序設定 MinIO 使用 Keycloak 作為外部身份提供者 (IDP),以透過 OpenID Connect (OIDC) 協議對使用者進行身份驗證。
此程序具體涵蓋以下步驟
設定 Keycloak 以用於 MinIO 身份驗證和授權
設定新的或現有的 MinIO 租戶以使用 Keycloak 作為 OIDC 提供者
建立策略以控制 Keycloak 驗證使用者的存取權限
使用 SSO 和 Keycloak 管理的身份登入 MinIO 租戶主控台
使用
AssumeRoleWithWebIdentity
安全權杖服務 (STS) API 產生臨時 S3 存取憑證
此程序是針對 Keycloak 21.0.0
編寫和測試的。提供的指示可能適用於其他 Keycloak 版本。此程序假設您先前有 Keycloak 的使用經驗,並已檢閱 其文件,以取得有關部署、設定和管理服務的指導和最佳實務。
先決條件
MinIO Kubernetes 運算子
確保您的目標 Kubernetes 叢集已正確安裝且可運作 MinIO Kubernetes 運算子。此文件假設最新的穩定運算子版本為 6.0.4。
MinIO 租戶
此程序假設您的 Kubernetes 叢集有足夠的資源來部署新的 MinIO 租戶。
您也可以使用此程序作為修改現有 MinIO 租戶以啟用 Keycloak 身份管理的指南。
Keycloak 部署和 Realm 設定
此程序假設您已存在 Keycloak 部署,且您具有管理權限。具體而言,您必須有權限在 Keycloak 部署上建立和設定 Realm、用戶端、用戶端範圍、Realm 角色、使用者和群組。
對於與 MinIO 租戶位於相同 Kubernetes 叢集中的 Keycloak 部署,此程序假設 Keycloak 和 MinIO Pod/服務之間具有雙向存取權。
對於 Kubernetes 叢集外部的 Keycloak 部署,此程序假設存在現有的 Ingress、負載平衡器或類似的 Kubernetes 網路控制元件,用於管理進出 MinIO 租戶的網路存取。
安裝和設定具有存取 MinIO 叢集權限的 mc
此程序使用 mc
來對 MinIO 叢集執行操作。在可存取叢集的網路上安裝 mc
。
您的本機主機必須能夠存取 MinIO 租戶,例如透過 Ingress、負載平衡器或類似的 Kubernetes 網路控制元件。
請參閱 mc
安裝快速入門,以取得有關下載和安裝 mc
的說明。
此程序假設您已為 MinIO 叢集設定 alias
。
為 Keycloak 身分管理設定 MinIO
1) 設定或建立一個用於存取 Keycloak 的客戶端
驗證 Keycloak 管理主控台 並導覽至 客戶端。
選擇 建立客戶端 並按照說明為 MinIO 建立新的 Keycloak 客戶端。 填寫指定的輸入如下
客戶端 ID |
設定為 MinIO 的唯一識別碼 ( |
---|---|
客戶端類型 |
設定為 |
始終顯示在主控台中 |
切換至 |
客戶端身份驗證 |
切換至 |
身份驗證流程 |
開啟 |
(選用)身份驗證流程 |
開啟 |
Keycloak 使用預設的一組組態值部署客戶端。根據您的 Keycloak 設定和所需的行為修改這些值。下表提供要組態的設定和值的基準
根 URL |
設定為 |
---|---|
首頁 URL |
設定為您希望 MinIO 使用的 Realm ( |
有效的重新導向 URI |
設定為 |
金鑰 -> 使用 JWKS URL |
切換至 |
進階 -> 進階設定 -> 存取權杖存續期 |
設定為 |
2) 為 MinIO 客戶端建立客戶端範圍
客戶端範圍允許 Keycloak 將使用者屬性對應為身份驗證請求中傳回的 JSON Web 權杖 (JWT) 的一部分。這允許 MinIO 在為使用者分配原則時參考這些屬性。此步驟會建立必要的客戶端範圍,以支援在 Keycloak 成功身份驗證後進行 MinIO 授權。
導覽至 客戶端範圍 檢視畫面,並為 MinIO 授權建立新的客戶端範圍
名稱 |
設定為原則的任何可識別的名稱 ( |
---|---|
包含在權杖範圍中 |
切換至 |
建立後,從清單中選擇範圍並導覽至 對應器。
選擇 設定新的對應器 以建立新的對應
使用者屬性 |
選擇對應器類型 |
---|---|
名稱 |
設定為對應的任何可識別的名稱 ( |
使用者屬性 |
設定為 |
權杖宣告名稱 |
設定為 |
新增至 ID 權杖 |
設定為 |
宣告 JSON 類型 |
設定為 |
多值 |
設定為 這允許在單一宣告中設定多個 |
彙總屬性值 |
設定為 這允許使用者繼承其群組中設定的任何 |
建立後,將客戶端範圍指派給 MinIO 客戶端。
導覽至 客戶端 並選擇 MinIO 客戶端。
選擇 客戶端範圍,然後選擇 新增客戶端範圍。
選擇先前建立的範圍,並將 指派類型 設定為
預設
。
3) 將必要的屬性套用至 Keycloak 使用者/群組
您必須將名為 policy
的屬性指派給 Keycloak 使用者或群組。將值設定為 MinIO 部署中的任何 原則。
對於使用者,導覽至 使用者 並選擇或建立使用者
認證 |
如果尚未設定,請將使用者密碼設定為永久值 |
---|---|
屬性 |
使用金鑰 |
對於群組,導覽至 群組 並選擇或建立群組
屬性 |
使用金鑰 |
---|
您可以將使用者指派給群組,以便他們繼承指定的 policy
屬性。如果您將對應器設定設定為啟用 彙總屬性值,Keycloak 會將原則的彙總陣列做為已驗證使用者 JWT 權杖的一部分。MinIO 可以在授權使用者時使用此原則清單。
您可以使用 Keycloak API 測試使用者的已設定原則
curl -d "client_id=minio" \
-d "client_secret=secretvalue" \
-d "grant_type=password" \
-d "username=minio-user-1" \
-d "password=minio-user-1-password" \
http://keycloak-service.keycloak-namespace.svc.cluster-domain.example/realms/REALM/protocol/openid-connect/token
如果成功,access_token
包含使用 MinIO AssumeRoleWithWebIdentity STS API 和產生 S3 認證所需的 JWT。
您可以使用 JWT 解碼器檢閱酬載,並確保它包含 policy
金鑰,其中列出了一個或多個 MinIO 原則。
4) 設定 MinIO 以進行 Keycloak 身份驗證
MinIO 支援多種設定 Keycloak 身份驗證的方法
使用 MinIO 租戶主控台
使用終端機/shell 和
mc idp openid
命令
您可以使用 MinIO 租戶主控台將 Keycloak 設定為 MinIO 租戶的外部身分提供者。
使用 NodePort、Ingress 或負載平衡器端點存取主控台服務。您可以使用下列命令檢閱主控台設定
kubectl describe svc/TENANT_NAME-console -n TENANT_NAMESPACE
將 TENANT_NAME
和 TENANT_NAMESPACE
分別取代為 MinIO 租戶的名稱及其命名空間。
以具有 MinIO 部署管理權限的使用者身分登入,例如具有 consoleAdmin
原則的使用者。
從左側導覽列中選擇 身分,然後選擇 OpenID。選擇 建立設定 以建立新的設定。
在模組中輸入下列資訊
名稱 |
輸入 Keycloak 執行個體的唯一名稱 |
---|---|
組態 URL |
指定 Keycloak OpenID 設定文件的位址 (keycloak-service.keycloak-namespace.svc.cluster-domain.example) 確保 |
客戶端 ID |
指定步驟 1 中建立的 Keycloak 客戶端的名稱 |
客戶端密碼 |
指定步驟 1 中建立的 Keycloak 客戶端的密碼憑證值 |
顯示名稱 |
指定 MinIO 主控台顯示的面向使用者名稱,作為已設定 Keycloak 服務的單一登入 (SSO) 工作流程的一部分 |
範圍 |
指定要包含在 JWT 中的 OpenID 範圍,例如 您可以出於程式化原則的目的使用支援的 OpenID 原則變數參考這些範圍。 |
重新導向 URI 動態 |
切換至 將用戶端使用的 MinIO 主控台位址取代為 Keycloak 重新導向 URI 的一部分。Keycloak 會使用提供的 URI 將已驗證的使用者傳回主控台。 對於反向 Proxy、負載平衡器或類似網路控制平面後方的 MinIO 主控台部署,您可以改用 |
選擇 儲存 以套用設定。
選擇 儲存 以套用設定。
您可以使用 mc idp openid add
命令,為 Keycloak 服務建立新的設定。此命令採用所有支援的 OpenID 設定設定
mc idp openid add ALIAS PRIMARY_IAM \
client_id=MINIO_CLIENT \
client_secret=MINIO_CLIENT_SECRET \
config_url="https://keycloak-service.keycloak-namespace.svc.cluster-domain.example/realms/REALM/.well-known/openid-configuration" \
display_name="SSO_IDENTIFIER"
scopes="openid,email,preferred_username" \
redirect_uri_dynamic="on"
|
設定為 Keycloak 服務的唯一識別碼,例如 |
---|---|
MINIO_CLIENT MINIO_CLIENT_SECRET |
設定為在步驟 1 中設定的 Keycloak 客戶端 ID 和密碼 |
|
設定為 Keycloak OpenID 設定文件的位址 (keycloak-service.keycloak-namespace.svc.cluster-domain.example) |
|
設定為 MinIO 主控台顯示的面向使用者名稱,作為已設定 Keycloak 服務的單一登入 (SSO) 工作流程的一部分 |
|
設定為您要包含在 JWT 中的 OpenID 範圍清單,例如 |
|
設定為 將用戶端使用的 MinIO 主控台位址取代為 Keycloak 重新導向 URI 的一部分。Keycloak 會使用提供的 URI 將已驗證的使用者傳回主控台。 對於反向 Proxy、負載平衡器或類似網路控制平面後方的 MinIO 主控台部署,您可以改用 |
重新啟動 MinIO 部署以套用變更。
檢查 MinIO 記錄,並確認啟動成功,且沒有與 OIDC 設定相關的錯誤。
如果您嘗試使用主控台登入,您現在應該會看到一個 (SSO) 按鈕,其中使用設定的 顯示名稱。
指定已設定的使用者,並嘗試登入。MinIO 應該會自動將您重新導向至 Keycloak 登入項目。成功進行身份驗證後,Keycloak 應使用原始的主控台 URL或設定的 重新導向 URI 將您重新導向回 MinIO 主控台。
5) 使用安全權杖服務 (STS) 產生應用程式憑證
使用 S3 相容 SDK 的應用程式必須以存取金鑰和密碼金鑰的形式指定憑證。MinIO AssumeRoleWithWebIdentity API 會傳回必要的暫時憑證,包括必要的工作階段權杖,並使用 Keycloak 在身份驗證後傳回的 JWT。
您可以使用以下 HTTP 呼叫順序和 curl
工具來測試此工作流程
以 Keycloak 使用者身分驗證並檢索 JWT 權杖
curl -X POST "https://keycloak-service.keycloak-namespace.svc.cluster-domain.example/realms/REALM/protocol/openid-connect/token" \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "username=USER" \ -d "password=PASSWORD" \ -d "grant_type=password" \ -d "client_id=CLIENT" \ -d "client_secret=SECRET"
將
USER
和PASSWORD
替換為REALM
上 Keycloak 使用者的憑證。將
CLIENT
和SECRET
替換為REALM
上 MinIO 特定 Keycloak 用戶端的用戶端 ID 和密碼
您可以使用
jq
或類似的 JSON 格式化工具來處理結果。擷取access_token
欄位以檢索必要的存取權杖。請注意expires_in
欄位,以記錄權杖到期前的秒數。使用
AssumeRoleWithWebIdentity
API 產生 MinIO 憑證curl -X POST "https://minio.minio-tenant.svc.cluster-domain.example" \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "Action=AssumeRoleWithWebIdentity" \ -d "Version=2011-06-15" \ -d "DurationSeconds=86000" \ -d "WebIdentityToken=TOKEN"
將
TOKEN
替換為 Keycloak 傳回的access_token
值。成功時,API 會傳回包含以下金鑰的 XML 文件
Credentials.AccessKeyId
- Keycloak 使用者的存取金鑰Credentials.SecretAccessKey
- Keycloak 使用者的密碼金鑰Credentials.SessionToken
- Keycloak 使用者的工作階段權杖Credentials.Expiration
- 產生憑證的到期日期
測試憑證
使用您偏好的相容 S3 的 SDK,以產生的憑證連線到 MinIO。
例如,以下使用 MinIO Python SDK 的 Python 程式碼會連線到 MinIO 部署並傳回儲存貯體清單
from minio import Minio client = MinIO( "minio.minio-tenant.svc.cluster-domain.example", access_key = "ACCESS_KEY", secret_key = "SECRET_KEY", session_token = "SESSION_TOKEN" secure = True ) client.list_buckets()
後續步驟
應用程式應使用其選擇的 SDK 實作 STS AssumeRoleWithWebIdentity 流程。當 STS 憑證過期時,應用程式應具有適當的邏輯,以便在重試和繼續操作之前重新產生 JWT 權杖、STS 權杖和 MinIO 憑證。
或者,使用者可以透過 MinIO 主控台產生存取金鑰,以便使用其 Keycloak 憑證建立類似 API 金鑰的長期存取。
啟用 Keycloak 管理 REST API
MinIO 支援使用 Keycloak 管理 REST API 來檢查驗證的使用者是否存在且在 Keycloak 領域上是否已啟用。此功能可讓 MinIO 更快速地移除先前經過驗證的 Keycloak 使用者的存取權。如果沒有此功能,MinIO 可以停用已停用或已移除的使用者存取權的最早時間點是當上次檢索的驗證權杖過期時。
此程序假設現有的 MinIO 部署已設定 Keycloak 作為外部身分管理員。
1) 建立必要的用戶端範圍
瀏覽至用戶端範圍檢視並建立新的範圍
名稱 |
設定為範圍的可識別名稱 ( |
---|---|
對應器 |
選取設定新的對應器 |
目標對象 |
將名稱設定為對應的任何可識別名稱 ( |
包含的用戶端目標對象 |
設定為 |
瀏覽至用戶端並選取 MinIO 用戶端
從服務帳戶角色中,選取指派角色並指派
admin
角色從用戶端範圍中,選取新增用戶端範圍並新增先前建立的範圍
瀏覽至設定並確保驗證流程包含服務 帳戶 角色
。
2) 驗證管理 API 存取
您可以使用 MinIO 用戶端憑證,透過管理 REST API 檢索持有人權杖和使用者資料來驗證功能
檢索持有人權杖
curl -d "client_id=minio" \ -d "client_secret=secretvalue" \ -d "grant_type=password" \ http://keycloak-url:port/admin/realms/REALM/protocol/openid-connect/token
使用傳回的值作為
access_token
來存取管理 APIcurl -H "Authentication: Bearer ACCESS_TOKEN_VALUE" \ http://keycloak-url:port/admin/realms/REALM/users/UUID
將
UUID
替換為您想要檢索之使用者的唯一 ID。回應應類似如下所示{ "id": "954de141-781b-4eaf-81bf-bf3751cdc5f2", "createdTimestamp": 1675866684976, "username": "minio-user-1", "enabled": true, "totp": false, "emailVerified": false, "firstName": "", "lastName": "", "attributes": { "policy": [ "readWrite" ] }, "disableableCredentialTypes": [], "requiredActions": [], "notBefore": 0, "access": { "manageGroupMembership": true, "view": true, "mapRoles": true, "impersonate": true, "manage": true } }
如果傳回的值具有
enabled: false
或null
(使用者已從 Keycloak 中移除),MinIO 將會撤銷已驗證使用者的存取權。
3) 在 MinIO 上啟用 Keycloak 管理支援
MinIO 支援多種設定 Keycloak 管理 API 支援的方法
使用終端機/shell 和
mc idp openid
命令在啟動 MinIO 之前使用設定的環境變數
您可以使用 mc idp openid update
命令,以修改現有 Keycloak 服務的設定。或者,您可以在第一次設定 Keycloak 時加入下列設定。此命令會採用所有支援的 OpenID 設定設定
mc idp openid update ALIAS KEYCLOAK_IDENTIFIER \
vendor="keycloak" \
keycloak_admin_url="https://keycloak-url:port/admin"
keycloak_realm="REALM"
將
KEYCLOAK_IDENTIFIER
替換為已設定 Keycloak IDP 的名稱。您可以使用mc idp openid ls
來檢視 MinIO 部署上所有已設定的 IDP 設定在
keycloak_admin_url
設定設定中指定 Keycloak 管理 URL在
keycloak_realm
中指定 Keycloak 領域名稱
在適當的設定位置 (例如 /etc/default/minio
) 中設定下列 環境變數。
以下範例程式碼會設定與為現有 Keycloak 設定啟用 Keycloak 管理 API 相關的最低必要環境變數。將後綴 _PRIMARY_IAM
替換為目標 Keycloak 設定的唯一識別碼。
MINIO_IDENTITY_OPENID_VENDOR_PRIMARY_IAM="keycloak"
MINIO_IDENTITY_OPENID_KEYCLOAK_ADMIN_URL_PRIMARY_IAM="https://keycloak-url:port/admin"
MINIO_IDENTITY_OPENID_KEYCLOAK_REALM_PRIMARY_IAM="REALM"
在
MINIO_IDENTITY_OPENID_KEYCLOAK_ADMIN_URL
中指定 Keycloak 管理 URL在
MINIO_IDENTITY_OPENID_KEYCLOAK_REALM
中指定 Keycloak 領域名稱