文件

使用 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 部署

此程序假設現有的 MinIO 叢集正在執行最新的穩定 MinIO 版本。請參閱安裝和部署 MinIO,以取得有關新 MinIO 部署的更完整文件。

此程序可能適用於較舊版本的 MinIO。

Keycloak 部署和領域設定

此程序假設現有的 Keycloak 部署,您對其具有管理存取權。具體而言,您必須具有在 Keycloak 部署上建立和設定領域、用戶端、用戶端範圍、領域角色、使用者和群組的權限。

此程序假設 Keycloak 和 MinIO 部署之間具有雙向存取。

安裝和設定 mc 以存取 MinIO 叢集

此程序使用 mc 在 MinIO 叢集上執行操作。在具有網路存取叢集的機器上安裝 mc

請參閱 mc 安裝快速入門,以取得下載和安裝 mc 的說明。

此程序假設已為 MinIO 叢集設定 alias

設定 MinIO 以進行 Keycloak 身分管理

1) 設定或建立用於存取 Keycloak 的用戶端

驗證到 Keycloak 管理主控台,並導覽至 用戶端

選取 建立用戶端,並依照指示建立新的 Keycloak 用戶端以用於 MinIO。依照以下方式填寫指定的輸入

用戶端 ID

設定為 MinIO 的唯一識別碼 (minio)

用戶端類型

設定為 OpenID Connect

永遠顯示在主控台中

切換至 開啟

用戶端驗證

切換至 開啟

驗證流程

開啟 標準 流程

(選用) 驗證流程

開啟 直接 存取 授與 (API 測試)

Keycloak 會使用一組預設的設定值部署用戶端。請根據您的 Keycloak 設定和所需行為修改這些值。下表提供要設定的設定和值的基準

根 URL

設定為 ${authBaseUrl}

首頁 URL

設定為您希望 MinIO 使用的 Realm (/realms/master/account/)

有效重新導向 URI

設定為 *

金鑰 -> 使用 JWKS URL

切換至 開啟

進階 -> 進階設定 -> 存取權杖存留期

設定為 1 小時

2) 建立 MinIO 用戶端的用戶端範圍

用戶端範圍允許 Keycloak 將使用者屬性對應為驗證要求中傳回的 JSON Web 權杖 (JWT) 的一部分。這允許 MinIO 在將原則指派給使用者時參考這些屬性。此步驟會建立必要的用戶端範圍,以在 Keycloak 驗證成功後支援 MinIO 授權。

導覽至 用戶端範圍 檢視,並為 MinIO 授權建立新的用戶端範圍

名稱

設定為原則的任何可識別名稱 (minio-authorization)

包含在權杖範圍中

切換至 開啟

建立後,從清單中選取範圍,並導覽至 對應器

選取 設定新的對應器 以建立新的對應

使用者屬性

選取對應器類型

名稱

設定為對應的任何可識別名稱 (minio-policy-mapper)

使用者屬性

設定為 policy

權杖宣告名稱

設定為 policy

新增至 ID 權杖

設定為 開啟

宣告 JSON 類型

設定為 字串

多值

設定為 開啟

這允許在單一宣告中設定多個 policy 值。

彙總屬性值

設定為 開啟

這允許使用者繼承其群組中設定的任何 policy

建立後,將用戶端範圍指派給 MinIO 用戶端。

  1. 導覽至 用戶端,並選取 MinIO 用戶端。

  2. 選取 用戶端範圍,然後選取 新增用戶端範圍

  3. 選取先前建立的範圍,並將 指派類型 設定為 預設

3) 將必要的屬性套用至 Keycloak 使用者/群組

您必須將名為 policy 的屬性指派給 Keycloak 使用者或群組。將值設定為 MinIO 部署上的任何 原則

針對使用者,導覽至 使用者,並選取或建立使用者

認證

如果尚未設定,請將使用者密碼設定為永久值

屬性

建立具有索引鍵 policy 和任何 原則 值的新屬性 (consoleAdmin)

針對群組,導覽至 群組,並選取或建立群組

屬性

建立具有索引鍵 policy 和任何 原則 值的新屬性 (consoleAdmin)

您可以將使用者指派給群組,以便他們繼承指定的 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-url.example.net:8080/realms/REALM/protocol/openid-connect/token

如果成功,access_token 包含使用 MinIO AssumeRoleWithWebIdentity STS API 並產生 S3 認證所需的 JWT。

您可以使用 JWT 解碼器來檢閱酬載,並確保它包含具有一或多個列出的 MinIO 原則的 policy 索引鍵。

4) 設定 MinIO 以進行 Keycloak 驗證

MinIO 支援多種設定 Keycloak 驗證的方法

  • 使用 MinIO 主控台

  • 使用終端機/Shell 和 mc idp openid 命令

  • 使用在啟動 MinIO 之前設定的環境變數

以具有 MinIO 部署管理權限的使用者身分登入,例如具有 consoleAdmin 原則的使用者。

從左側導覽列中選取 身分,然後選取 OpenID。選取 建立設定 以建立新的設定。

在模式視窗中輸入下列資訊

名稱

輸入 Keycloak 執行個體的唯一名稱

設定 URL

指定 Keycloak OpenID 設定文件的位址 (keycloak-url.example.net:8080)

確保 REALM 符合您要用於向 MinIO 驗證使用者的 Keycloak realm。

用戶端 ID

指定在步驟 1 中建立的 Keycloak 用戶端名稱

用戶端密碼

指定在步驟 1 中建立的 Keycloak 用戶端的密碼憑證值

顯示名稱

指定 MinIO 主控台顯示的使用者易懂名稱,作為已設定 Keycloak 服務的單一登入 (SSO) 工作流程的一部分

範圍

指定要包含在 JWT 中的 OpenID 範圍,例如 preferred_usernameemail

您可以出於程式化原則的目的使用支援的 OpenID 原則變數來參考這些範圍。

重新導向 URI 動態

切換至 開啟

替代用戶端所使用的 MinIO 主控台位址,作為 Keycloak 重新導向 URI 的一部分。Keycloak 使用提供的 URI 將已驗證的使用者傳回至主控台。

對於反向 Proxy、負載平衡器或類似網路控制平面後方的 MinIO 主控台部署,您可以改用 MINIO_BROWSER_REDIRECT_URL 變數來設定 Keycloak 要使用的重新導向位址。

選取 儲存 以套用設定。

您可以使用 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-url.example.net:8080/realms/REALM/.well-known/openid-configuration" \
   display_name="SSO_IDENTIFIER"
   scopes="openid,email,preferred_username" \
   redirect_uri_dynamic="on"

PRIMARY_IAM

設定為 Keycloak 服務的唯一識別碼,例如 keycloak_primary

MINIO_CLIENT
MINIO_CLIENT_SECRET

設定為在步驟 1 中設定的 Keycloak 用戶端 ID 和密碼

config_url

設定為 Keycloak OpenID 配置文件的位址 (keycloak-url.example.net:8080)

display_name

設定為 MinIO 控制台在已配置的 Keycloak 服務的單一登入 (SSO) 工作流程中顯示的使用者易讀名稱

scopes

設定為您想要包含在 JWT 中的 OpenID 範圍清單,例如 preferred_usernameemail

redirect_uri_dynamic

設定為 on

替代用戶端所使用的 MinIO 主控台位址,作為 Keycloak 重新導向 URI 的一部分。Keycloak 使用提供的 URI 將已驗證的使用者傳回至主控台。

對於反向 Proxy、負載平衡器或類似網路控制平面後方的 MinIO 主控台部署,您可以改用 MINIO_BROWSER_REDIRECT_URL 變數來設定 Keycloak 要使用的重新導向位址。

在使用 -e ENVVAR=VALUE 旗標啟動容器之前,設定以下環境變數

以下範例程式碼設定了與將 Keycloak 配置為外部身分管理提供者相關的最低限度必要環境變數。

MINIO_IDENTITY_OPENID_CONFIG_URL_PRIMARY_IAM="https://keycloak-url.example.net:8080/.well-known/openid-configuration"
MINIO_IDENTITY_OPENID_CLIENT_ID_PRIMARY_IAM="MINIO_CLIENT"
MINIO_IDENTITY_OPENID_CLIENT_SECRET_PRIMARY_IAM="MINIO_CLIENT_SECRET"
MINIO_IDENTITY_OPENID_DISPLAY_NAME_PRIMARY_IAM="SSO_IDENTIFIER"
MINIO_IDENTITY_OPENID_SCOPES_PRIMARY_IAM="openid,email,preferred_username"
MINIO_IDENTITY_OPENID_REDIRECT_URI_DYNAMIC_PRIMARY_IAM="on"

_PRIMARY_IAM

將後綴 _PRIMARY_IAM 替換為此 Keycloak 配置的唯一識別符。 例如,MINIO_IDENTITY_OPENID_CONFIG_URL_KEYCLOAK_PRIMARY

如果您只打算為部署配置單一 OIDC 提供者,則可以省略後綴。

CONFIG_URL

指定 Keycloak OpenID 設定文件的位址 (keycloak-url.example.net:8080)

確保 REALM 符合您想要用於驗證使用者到 MinIO 的 Keycloak Realm

指定步驟 1 中設定的 Keycloak 用戶端 ID 和密碼

DISPLAY_NAME

指定 MinIO 主控台顯示的使用者易懂名稱,作為已設定 Keycloak 服務的單一登入 (SSO) 工作流程的一部分

OPENID_SCOPES

指定您想要包含在 JWT 中的 OpenID 範圍,例如 preferred_usernameemail

REDIRECT_URI_DYNAMIC

設定為 on

替代用戶端所使用的 MinIO 主控台位址,作為 Keycloak 重新導向 URI 的一部分。Keycloak 使用提供的 URI 將已驗證的使用者傳回至主控台。

對於反向 Proxy、負載平衡器或類似網路控制平面後方的 MinIO 主控台部署,您可以改用 MINIO_BROWSER_REDIRECT_URL 變數來設定 Keycloak 要使用的重新導向位址。

如需這些變數的完整文件,請參閱OpenID 身分管理設定

重新啟動 MinIO 部署以套用變更。

檢查 MinIO 記錄並驗證啟動成功,且沒有與 OIDC 配置相關的錯誤。

如果您嘗試使用控制台登入,您現在應該會看到一個 (SSO) 按鈕,使用設定的 顯示名稱

指定已設定的使用者並嘗試登入。MinIO 應自動將您重新導向至 Keycloak 登入入口。成功驗證後,Keycloak 應使用原始控制台 URL *或* 如果已配置,則使用 重新導向 URI 將您重新導向回 MinIO 控制台。

5) 使用安全令牌服務 (STS) 產生應用程式憑證

使用相容 S3 的 SDK 的應用程式必須以存取金鑰和秘密金鑰的形式指定憑證。MinIO AssumeRoleWithWebIdentity API 會返回必要的臨時憑證,包括必要的會話令牌,使用 Keycloak 在驗證後返回的 JWT。

您可以使用以下 HTTP 呼叫序列和 curl 公用程式來測試此工作流程

  1. 以 Keycloak 使用者身分驗證並檢索 JWT 令牌

    curl -X POST "https://keycloak-url.example.net:8080/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"
    
    • USERPASSWORD 替換為 REALM 上 Keycloak 使用者的憑證。

    • CLIENTSECRET 替換為 REALM 上 MinIO 特定 Keycloak 用戶端的用戶端 ID 和密碼

    您可以使用 jq 或類似的 JSON 格式化公用程式來處理結果。 提取 access_token 欄位以檢索必要的存取令牌。 請注意 expires_in 欄位,以了解令牌過期前的秒數。

  2. 使用 AssumeRoleWithWebIdentity API 產生 MinIO 憑證

    curl -X POST "https://minio-url.example.net:9000" \
         -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 - 產生的憑證的到期日

  3. 測試憑證

    使用您慣用的相容 S3 的 SDK,使用產生的憑證連線到 MinIO。

    例如,以下使用 MinIO Python SDK 的 Python 程式碼連線到 MinIO 部署並返回儲存貯體的清單

    from minio import Minio
    
    client = MinIO(
       "minio-url.example.net:9000",
       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 Realm 中是否已啟用。此功能允許 MinIO 更快地移除先前經過驗證的 Keycloak 使用者的存取權。如果沒有此功能,MinIO 可以停用已停用或移除的使用者存取權的最早時間點,是在上次檢索的驗證令牌過期時。

此程序假設現有的 MinIO 部署已配置 Keycloak 作為外部身分管理員。

1) 建立必要的用戶端範圍

導覽至用戶端範圍視圖並建立新範圍

名稱

設定為範圍的可識別名稱 (minio-admin-API-access)

映射器

選取配置新的映射器

對象

名稱 設定為映射的任何可識別名稱 (minio-admin-api-access-mapper)

包含的用戶端對象

設定為 security-admin-console

導覽至 用戶端 並選取 MinIO 用戶端

  1. 服務帳戶角色 選取 指派角色 並指派 admin 角色

  2. 用戶端範圍 選取 新增用戶端範圍 並新增先前建立的範圍

導覽至 設定 並確保 驗證流程 包括 服務 帳戶 角色

2) 驗證管理 API 存取

您可以使用管理 REST API 和 MinIO 用戶端憑證來檢索持有者令牌和使用者資料,以驗證此功能

  1. 檢索持有者令牌

    curl -d "client_id=minio" \
         -d "client_secret=secretvalue" \
         -d "grant_type=password" \
         http://keycloak-url:port/admin/realms/REALM/protocol/openid-connect/token
    
  2. 使用傳回的值作為 access_token 來存取管理 API

    curl -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: falsenull (使用者已從 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 Realm 名稱

在適當的配置位置中設定以下環境變數,例如 /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"