tags: keycloak Tool

四、Keycloak介紹

我們剛才談到實現SSO(單一登入)的功能,那麼現在問題來了:有沒有一個工具或平台能讓我們更方便地實現這一切呢?答案是有的,那就是Keycloak。Keycloak是一個集成了多種身份驗證和授權機制(包括OIDC和SAML)的開源身份和訪問管理解決方案。

Keycloak的特點如下

  • 多協議支持: Keycloak支持OIDC和SAML,所以你不必為了不同的應用而選擇不同的解決方案。
  • 易於管理: Keycloak有一個使用者友善的管理界面,你可以輕鬆設定用戶、角色和權限。
  • 靈活性: 它是開源的,意味著你可以根據自己的需要對它進行定制。

詳細提供以下功能

  • 身分驗證(Authentication)

    • 單點登入/登出(Single Sign-On/Single Sign-Out): 讓使用者只需登入一次,就能訪問多個不同的應用和服務。
    • 多因素認證(Multi-Factor Authentication, MFA): 除了密碼外,還可以透過SMS、郵件或其他方法進行身份驗證。
    • 支持外部身分源: AD,LDAP,Social Login(Google, FB)。
  • 使用者管理(User Management)

    • 使用者身分 CRUD(Create, Read, Update, Delete): 簡單地管理使用者資訊,包括建立、查詢、更新和刪除。
    • 屬性管理(Attribute Management): 可以給使用者賬戶添加多種屬性和標籤。
    • 使用者分組(User Grouping): 組織使用者到不同的群組以方便管理。
  • 授權(Authorization)

    • Role-Based Access Control(RBA): 基於角色給予使用者不同的訪問權限。
    • Attribute-Based Access Control(ABAC): 根據使用者的特定屬性(如年齡、部門等)來給予權限。
    • User-based Access Control (UBAC) : 直接對個別用戶賦予權限,而不是通過角色或屬性。這在只有少數用戶需要訪問特定資源的情況下特別有用。
    • Context-based Access Control (CBAC) : 更動態的授權方式,考慮到目前的情境或環境狀況(如目前正在執行的操作,或者資源的當前狀態)來做出授權決策。
    • Rule-based Access Control (Using JavaScript) : 使用 JavaScript 程式碼來定義特定的授權規則。這是一個非常靈活的方式,可以根據極其特定的需求來制定授權策略。
    • Time-based Access Control : 依據時間來決定是否允許訪問,例如只有工作時間允許訪問某個資源。
    • Support for custom Access Control Mechanism (ACMs) through a Service Provider Interface (SPI) : 高度定制的選項,允許你通過 Service Provider Interface (SPI) 來實現自己的授權機制。這對於需要非常特殊授權邏輯的場景來說是一個非常強大的工具。
  • 安全性(Security)

    • 密碼政策(Password Policies): 可以設定密碼的複雜度、有效期等。
    • 會話管理(Session Management): 查看和管理當前活躍的使用者會話。
    • 應用安全(Client Security): 對接入的客戶端進行安全設定和驗證。
  • 其他

    • 事件監控(Events Monitoring): 監控和記錄關於認證、授權等的事件。
    • 擴展性(Extensibility): 支持自定義插件和腳本,以擴展基礎功能。

1. Keycloak 細部解析

a. Kyecloak Core

為了充分利用Keycloak,並根據我們的需求進行客製化,我們必須了解其核心組件以及它們是如何互動的。以下為Keycloak Core Block圖

  • Realm:master:可想像成一個隔離的命名空間,裡面有你的使用者、角色、客戶端等資料。你可以有多個Realm,每個Realm都有其獨立的設定。
    • Client:代表需要與Keycloak進行互動的應用程式或服務。像是網頁應用或API。這些客戶端會使用Keycloak進行身份驗證。
    • Roles:確定使用者在Client中可以執行哪些操作。
    • Security Defense:確保Realm的安全性,例如對抗暴力攻擊或強化密碼政策。
  • User Federation:允許你把外部的使用者來源(如LDAP)連接到Keycloak。
  • Roles:通常用於定義訪問權限。例如,管理員角色可能允許使用者更改系統設定。
  • Groups:一組使用者的集合,有助於管理與分配角色。
  • Events:記錄Keycloak的所有活動,如誰何時登錄或更改設定
  • Users:這是指註冊到Realm的使用者。他們可以有不同的角色或屬於不同的群組。
  • Identity Provider (IdP):確認使用者身份的部分,允許使用者用像是Google或Facebook這類的外部服務進行登錄。

Image Not Showing Possible Reasons
  • The image was uploaded to a note which you don't have access to
  • The note which the image was originally uploaded to has been deleted
Learn More →

核心和外部區塊的互動部分。例如,當一個使用者使用Twitter賬號登錄時,Twitter會和Keycloak中的Identity Provider互動,然後IdP再與Realm互動,確認使用者的身份並賦予他適當的角色和權限。

另外這邊稍微提一下Realm裡面的Roles跟外部的Roles有什麼不同

  • Realm裡面的Roles (Realm-level Roles):這些角色是直接相對於Realm本身的。一旦你在Realm中定義了一個角色,你就可以將它指派給任何Realm內的使用者。它們通常是更通用的,例如“管理員”或“使用者”,並且可以跨多個客戶端使用。

  • 外部的Roles (Client-level Roles):這些角色是相對於特定的客戶端(應用程式或服務)的。所以它們是在特定客戶端的上下文中定義和使用的。允許你為每個應用程式定制更具體的角色。例如,你可能有一個"編輯"角色在你的CMS系統中,而有一個"購物者"角色在你的電商網站中。

簡單來說,Realm內的角色是全域性的,可以在整個Realm中使用,而Client-level角色是特定於某個應用程式的。

b. Kyecloak 角色

使用Keycloak服務時,裡面有幾種角色必須釐清他們的關係

  • Realm : 每一個Realm在Keycloak中都代表了一個獨特的命名空間或領域。在同一個Keycloak實例中,不同的Realm之間的資料和設定是完全隔離的。例如,行銷部門和研發部門可能有不同的應用程式和使用者,因此他們可以在不同的Realm中被管理。某種程度有點像Project概念。

    • 設定 : 每個Realm都有自己獨特的設定,包括但不限於認證策略、令牌生命週期、SMTP設定等。這意味著你可以為不同的組織或專案客製化其身份和訪問管理策略。
    • 使用者和客戶端 : 每個Realm內都有其專屬的Users和Clients。例如,兩個不同的Realm之間的Users是不可以交互認證的。
    • 事件和審計 : 可以為每個Realm單獨配置事件和審計策略,以追踪和記錄Realm內的活動。
  • Clients : 通常代表你想要與Keycloak整合的應用程式或服務。定義了如何與那些應用程式或服務進行交互,包括認證方法、回調URL等。例如有一個Web應用程式和一個手機應用程式,兩者都需要身份驗證。在這種情況下,你可以為每個應用程式設定一個Client,並為它們設定不同的認證流程或訪問限制。

    • 設定 : Clients的設定包括如何與其進行認證的具體細節,例如回調URL、認證方法、封裝方法等。包含協議,可能是OpenID Connect、SAML 2.0。
    • 角色 : 你可以在每個Client裡設置特定的角色,這些角色可以賦予給使用者,以決定他們在該Client中可以進行哪些操作。
  • Users : Users基本上是真實的個體,如員工或客戶。

    • 設定 : 在Keycloak中,User的憑證(如密碼)是存儲在User的設定中。但是,具體的認證流程(例如,如何驗證這些憑證)是由Client來定義的。
    • 與Client的關係 : Users在Clients中獲得訪問令牌,這些令牌決定了他們在該Client中可以進行哪些操作。例如,一個User可能在一個Client中具有"讀者"的角色,在另一個Client中具有"管理員"的角色。
  • Groups : Groups代表了一種組織層次結構,可以將Users組合在一起。這允許管理者更容易地管理大量使用者和其訪問權限。

    • 設定 : 跟Users一樣,Groups也可以有其自己的屬性和設定。例如,你可以為某個Group設定一個特定的屬性,然後所有屬於該Group的Users都可以看到或使用這個屬性。
    • 角色賦予 : 可以將角色賦予給一個Group,然後所有屬於那個Group的Users都會繼承這些角色。
    • 靈活性 : 一個User可以同時屬於多個Group。例如,一個User可能同時是"研發團隊"和"高級工程師"這兩個Groups的成員。
  • Role : 角色是一種用於表示使用者或群組所擁有的權限的方式。換句話說,角色定義了使用者或群組可以執行哪些操作或訪問哪些資源。例如,您可能有一個"管理員"角色,該角色允許使用者訪問和修改所有資源,而"編輯者"角色則可能只允許使用者修改,但不能刪除資源。

    • 設定 : 在Keycloak中,角色可以分配給單個使用者或群組。當使用者試圖訪問某個資源或執行某個操作時,系統會檢查他們所分配的角色是否具有所需的權限。
    • 角色的類型:Realm比較偏向Keycloak設定管理權限,客戶端角色比較偏向客戶端API使用權限。
      • Realm角色:可分配給Realm中的任何使用者或群組。例如,Realm範疇的"管理員"角色允許使用者管理整個Realm的設定。

      • 客戶端角色:只能分配給特定客戶端的使用者或群組。例如,一個"編輯器"角色在"新聞應用程式"客戶端可能意味著使用者可以發布新的新聞文章,但在另一個"帳單系統"客戶端,相同的"編輯器"角色可能有完全不同的權限。

在這裡稍微整理一下這些項目常見的設置

Image Not Showing Possible Reasons
  • The image was uploaded to a note which you don't have access to
  • The note which the image was originally uploaded to has been deleted
Learn More →

最後稍微用圖舉個他們關係的例子

  • Client:在此領域中的應用程式或服務,用戶會透過它進行認證。
  • Role 1, 2, 3, 4:這些是在該Realm中定義的角色。角色通常代表某些權限或能力。
  • Users:代表該Realm中的所有用戶。
  • Group 1, 2, 3 n:代表不同的用戶群組。每個群組可能有不同的權限和角色。

User 1:當此用戶登入時,被賦予了Role 1角色,並且是Group 1, Group 2, 和 Group 3的成員。 而 User 2 用戶登入時,被賦予了Role 2角色,並且是Group 2, Group 3, 和 Group 5的成員。最後User 3 用戶登入時,會被賦予了Role 4角色,並且是Group 2, Group 3, Group 4, 和 Group 5的成員。

可以看到Keycloak如何將角色和群組賦予用戶。這有助於管理哪些用戶可以訪問哪些資源,以及他們可以執行哪些操作。此外,通過將用戶分組,可以輕鬆地管理大量用戶的權限,而不必逐一配置。

Image Not Showing Possible Reasons
  • The image was uploaded to a note which you don't have access to
  • The note which the image was originally uploaded to has been deleted
Learn More →

2. 簡易使用

a. 安裝

安裝部分基本上照官網的說明,沒有太大問題。安裝連結請點我。稍微要注意的是版本,較久的版本會與新版版本Dashboard UI不太相同。所以你在看一些網路教學時,我發現文章都是舊版的介面,很難直接對應到新版介面操作。

b. 登入 && Create Realm

進入到Keycloak介面時,請點選Administration Console進入管理頁面。一開始登入帳密就是admin/admin,登入後左側欄的功能設置如下表解釋。左上角Realm設置預設會在master, 因為master realm在Keycloak中具有特殊意義,主要用於管理整個Keycloak伺服器。所以使用上都會在新增一個Realm在做後續設定。

Image Not Showing Possible Reasons
  • The image was uploaded to a note which you don't have access to
  • The note which the image was originally uploaded to has been deleted
Learn More →