首頁

目前文章總數:197 篇

  

最後更新:2025年 09月 13日

0100. 如何用 Docker 實現 Kafka-UI Admin 與 ReadOnly 權限分離管理

日期:2025年 09月 27日

標籤: Docker Docker-Compose Container Ubuntu Kafka Kafka-ui

摘要:C# 學習筆記


範例所需:1. Ubuntu 主機
     2. 已安裝好 docker-compose 、docker
解決問題:1. Kafka-UI 只能單一權限 - 無帳號管理功能,如何新增 admin (最大權限)與 viewer (只可檢視)權限
相關參考:0089. Linux Ubuntu 上使用 Docker Compose 快速部署 Kafka
基本介紹:本篇分為三大部分。
第一部分:Kafka-UI 限制
第二部分:環境參數切換權限
第三部分:多容器區分權限






第一部分:Kafka-UI 限制

Step 1: 介紹 Kafka-ui

關於 Kafka-UI 的介紹,可參考:0089. Linux Ubuntu 上使用 Docker Compose 快速部署 Kafka的一段節錄
如果沒有特別設定,Kafka-ui 預設都是可以不用登入,直接有最高權限操作依賴的 Kafka 服務,如圖訪問網頁即可進入管理頁面:

除了檢視外,還可以進行刪除、新增等等操作


Step 2: Kafka-ui - 問題說明 - 當前架構

如 Step1 : 對應的架構如圖,Kafka-ui 會關注多個 Kafka 容器,並且當用戶(管理者),檢視時具有最高權限可使用


Step 2: Kafka-ui - 問題說明 - 問題

若將此種無驗證模式配置於生產環境,將會帶來以下問題:

完全開放存取 任何能連接到 Kafka-ui 的人都可以無限制地查看和操作所有 Kafka 資源
資料洩露 可以瀏覽所有主題中的訊息內容
操作風險-惡意或意外的破壞性操作 刪除重要的主題或消費者群組
設定變更 同上,有權限訪問即可修改 Kafka Connect 連接器配置


簡言之,即使是架設在公司內部網路下,若開發團隊有不慎操作都可能導致破壞生產,影響公司利益,因此必需添加驗證機制

Step 3: Kafka-ui - 克服目標 - 認證架構限制

Kafka-ui 為輕量級管理工具,並且自身設計抉擇的關係,因此具有以下認證架構限制:

無內建使用者管理 Kafka-ui 本身不提供使用者註冊或帳號管理功能
依賴外部認證提供者 所有的帳號管理都必須透過外部系統完成,並且 Kafka-ui 只負責認證驗證,不負責帳號建立


一個 Kafka-ui 只能有一個帳號認證 ,如下圖,加入驗證模式後只能擇一 全部權限權限唯讀
克服目標:為了解決實務上有需要 2 種帳號模式並存的狀況。(EX: 管理人員可用最高權限 ; 開發人員、維運人員只能用檢視)


Step 4: Kafka-ui - 解法 1 - 修改配置檔案環境參數切換權限

大部分的情況都是檢視,因此只有在需要編輯的時候依照需要調整容器的環境參數改變此容器的權限,具體步驟:

1. 需要編輯操作 EX: 清空 Topic,部署生產後手動測試 Kafka Message
2. 更改 docker-compose.yml 的 MANAGEMENT_READONLY=false
3. 重啟 Kafak-ui
4. 編輯權限的功能操作完畢後
5. 更改 docker-compose.yml 的 MANAGEMENT_READONLY=true
6. 重啟 Kafak-ui


優點: 統一由管理人員管理
缺點: 麻煩


Step 5: Kafka-ui - 解法 2 - 多容器區分權限

讓檢視、管理同時並存的解法是同時啟動 2 種不同權限配置的 Kafka-ui ,如下圖:


優點: 高效率
缺點: 多開一個容器、管理人員要保管好最高權限的 Kafka-ui 的訪問路徑,不可讓他人知道




第二部分:環境參數切換權限

Step 1: 調整 yml 檔案 - 原始設置

我們預設沒有開啟任何權限,因此需要添加驗證權限,如果今天要限制登入者讀取,就需要調整:
原始的 docker-compose.yml 設置可參考 0093. Kafka Kraft 模式部署與高可用性模擬測試(附完整 docker-compose) - 第二部分

Step 2: 調整 yml 檔案 - 添加權限

異動的部分,在 docker-compose.yml 添加相關的配置
定義帳號為 viewer , 密碼為 ViewerPass123
開啟了驗證模式: AUTH_TYPE=LOGIN_FORM
設定上只允許唯讀:MANAGEMENT_READONLY=true

  kafka-ui:
    image: provectuslabs/kafka-ui:latest
    container_name: kafka-ui
    ports:
      - "8380:8080"
    environment:
      - KAFKA_CLUSTERS_0_NAME=kafka-ui
      - KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS=kafka-0:9092,kafka-1:9092,kafka-2:9092
      - KAFKA_CLUSTERS_0_PROPERTIES_SECURITY_PROTOCOL=PLAINTEXT
      # Kafka Cluster Setting
      - KAFKA_CLUSTERS_0_READONLY=true

      # Web UI User
      - AUTH_TYPE=LOGIN_FORM
      - SPRING_SECURITY_USER_NAME=viewer
      - SPRING_SECURITY_USER_PASSWORD=ViewerPass123

      # Manage Setting
      - MANAGEMENT_READONLY=true

      # Security Setting
      - SERVER_SERVLET_CONTEXT_PATH=/
      - SPRING_SECURITY_BASIC_ENABLED=true      


用 WinMerge 做差異比對,可以輕鬆地知道原始代碼將上述代碼做替換的地方:


Step 3: 重新運行 docker-compose.yml

到 Ubuntu 安裝 kafka-ui 的 docker-compose.yml 的路徑下,輸入以下

docker-compose.yml down -v
docker-compose.yml up -d


重新進行安裝


Step 4: 嘗試登入驗證

以下是我們內部域名訪問的位置

http://192.168.51.28:8380 


已出現要求登入驗證


Step 5: 驗證成果 - 只可唯讀

使用 viewer 帳號登入後可以正常檢視 DashBoard


並且可以發現此帳號只能檢視,無法進行任何刪除、新增、修改的功能,符合預期
未來管理人員需要操作,則將 docker-compose.yml 相關環境參數移除即可




第三部分:多容器區分權限

Step 1: 調整 yml 檔案 - 原始設置

我們預設沒有開啟任何權限,現在要建立 2 個容器,分別是 具操作權限唯讀 2 種
原始的 docker-compose.yml 設置可參考 0093. Kafka Kraft 模式部署與高可用性模擬測試(附完整 docker-compose) - 第二部分

Step 2: 調整 yml 檔案 - 添加權限

異動的部分,在原 docker-compose.yml 添加以下配置,未來一勞永逸

  具操作權限 唯讀權限
帳號 admin viewer
密碼 StrongPass123 ViewerPass123
驗證模式 AUTH_TYPE=LOGIN_FORM AUTH_TYPE=LOGIN_FORM
權限 MANAGEMENT_READONLY false true
訪問 Port 號 8380 8381
  kafka-ui:
    image: provectuslabs/kafka-ui:latest
    container_name: kafka-ui
    ports:
      - "8380:8080"
    environment:
      - KAFKA_CLUSTERS_0_NAME=kafka-ui
      - KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS=kafka-0:9092,kafka-1:9092,kafka-2:9092
      - KAFKA_CLUSTERS_0_PROPERTIES_SECURITY_PROTOCOL=PLAINTEXT
      # Kafka Cluster Setting
      - KAFKA_CLUSTERS_0_READONLY=false
      
      # Web UI User
      - AUTH_TYPE=LOGIN_FORM
      - SPRING_SECURITY_USER_NAME=admin
      - SPRING_SECURITY_USER_PASSWORD=StrongPass123
      
      # Manage Setting
      - MANAGEMENT_READONLY=false
      - DYNAMIC_CONFIG_ENABLED=true
      
      # Security Setting
      - SERVER_SERVLET_CONTEXT_PATH=/
      - SPRING_SECURITY_BASIC_ENABLED=true
    depends_on:
      - kafka-0
      - kafka-1
      - kafka-2
    restart: unless-stopped

  kafka-ui-viewer:
    image: provectuslabs/kafka-ui:latest
    container_name: kafka-ui-viewer
    ports:
      - "8381:8080"
    environment:
      - KAFKA_CLUSTERS_0_NAME=local-kraft-readonly
      - KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS=kafka-0:9092,kafka-1:9092,kafka-2:9092
      - KAFKA_CLUSTERS_0_PROPERTIES_SECURITY_PROTOCOL=PLAINTEXT
      # Kafka Cluster Setting
      - KAFKA_CLUSTERS_0_READONLY=true

      # Web UI User
      - AUTH_TYPE=LOGIN_FORM
      - SPRING_SECURITY_USER_NAME=viewer
      - SPRING_SECURITY_USER_PASSWORD=ViewerPass123

      # Manage Setting
      - MANAGEMENT_READONLY=true

      # Security Setting
      - SERVER_SERVLET_CONTEXT_PATH=/
      - SPRING_SECURITY_BASIC_ENABLED=true
    depends_on:
      - kafka-0
      - kafka-1
      - kafka-2
    restart: unless-stopped



Step 3: 重新運行 docker-compose.yml

到 Ubuntu 安裝 kafka-ui 的 docker-compose.yml 的路徑下,輸入以下

docker-compose.yml down -v
docker-compose.yml up -d


重新進行安裝


Step 4: 嘗試登入驗證 - 操作權限

操作權限使用 admin 登入以下

http://192.168.51.28:8380 




Step 5: 驗證成果 - 操作權限 - 成功

使用 admin 帳號登入後 -> 到 Topic 頁面驗證,確實有所有權限可以進行操作


Step 6: 嘗試登入驗證 - 唯讀權限

操作權限使用 viewer 登入以下

http://192.168.51.28:8381




Step 7: 驗證成果 - 唯讀權限 - 成功

使用 viewer 帳號登入後 -> 到 Topic 頁面驗證,確實該帳號只能進行檢視
此方案採用多容器區分權限,解決 Kafka-ui 可同時存在 操作權限、唯讀權限 共存的問題
要注意的事情是:操作權限 不能隨意洩漏,即使有帳號密碼第一層防護。