引言
Apache Kafka 支援多種安全協定和認證工作流程,以確保只有授權的人員和應用程式可以連接到集群。在其預設配置中,Kafka允許所有人訪問,但沒有啟用安全檢查。雖然這對於探索和開發很有用,但生產部署在暴露給外界之前必須正確地進行安全設置。此外,這些環境必須被監控,以確保平穩運作並防止可能的故障。
在這個教程中,您將通過配置TLS流量加密和SASL認證來加強您的Kafka安裝,以提供標準的使用者名稱和密碼登錄流程。您將了解如何配置提供的生產者和消費者腳本以連接到安全的集群。然後,您將學習如何導出Kafka指標並在Grafana中視覺化它們。您還將學習如何通過由AKHQ提供的易於使用的網頁介面訪問您的集群節點和主題。
先決條件
要完成這個教程,您需要:
- 至少具有 4GB RAM 和 2 個 CPU 的 Droplet。在 Ubuntu 伺服器的情况下,請遵循初始伺服器設置以獲取設置說明。
- Apache Kafka 已在您的 droplet 上安裝並配置。要獲取設置說明,請遵循Kafka 導論教程。您只需完成第 1 步和第 2 步。
- 了解 Java 如何處理密鑰和證書。欲了解更多信息,請訪問Java Keytool 實用指南:使用 Java 密鑰庫教程。
- Grafana 安裝在您的伺服器或本地機器上。請訪問如何在 Ubuntu 上安裝和保護 Grafana教程以獲取說明。您只需完成前四步。
- 已將完全註冊的域名指向您的 droplet。本教程將在整個過程中使用
your_domain
,並將其參考為 Grafana 的先決條件。您可以在Namecheap上購買域名,在Freenom上免費獲取一個,或使用您選擇的域名註冊商。
步驟 1 – 設定 Kafka 安全協定
在原始設定中,Kafka允許任何人不進行來源檢查即可連接到它。這意味著您的集群在默認情況下對所有人都是可訪問的。雖然這對於測試來說是沒問題的,因為它在本地機器和私有安裝中減少了維護負擔,但生產和面向公眾的 Kafka 安裝必須啟用安全功能以防止未經授權的訪問。
在這一步驟中,您將設定 Kafka 網絡代理以使用 TLS 加密來傳輸代理和消費者之間的流量。您還將設置 SASL 作為在連接到集群時驗證憑證的身份驗證框架。
生成 TLS 證書和存儲
為了生成設置 TLS 所需的證書和密鑰,您將使用 Confluent 平台安全工具 存儲庫中的腳本。首先,通過運行以下命令將其克隆到您的家目錄中:
導航到它:
您將使用的腳本稱為kafka-generate-ssl-automatic.sh
,它要求您提供國家、州、組織和城市作為環境變量。這些參數用於創建憑證,但其內容並不重要。您還需要提供一个密碼,用來保護將創建的Java信任和密钥庫。
執行以下命令來設定所需的環境變量,將your_tls_password
替換為您希望的值:
請注意PASSWORD
必須至少有六個字元長。
通過執行:
然後,執行它來生成所需的文件:
將有很多輸出。當完成時,列出锅面目錄中的文件:
輸出應該看起来很像這樣:
您會看到憑證、信任和密钥庫已成功創建。
為Kafka配置TLS和SASL
現在您已經有了使TLS加密成為可能的必要文件,您將配置Kafka以使用它們並使用SASL驗證用戶。
您將修改安裝目錄下的 config/kraft
裡的 server.properties
檔案。
您已經將其作為前提條件的一部分安裝在您主目錄下的 kafka
中。通過運行以下命令導航到該目錄:
nano config/kraft/server.properties
打開主配置檔案以進行編輯:
將它們修改為如下所示,將 PLAINTEXT
替換為 BROKER
:
然後,找到 listener.security.protocol.map
行:
將 BROKER
映射到 SASL_SSL
,通過將定義添加到值的開頭:
在此,您為BROKER
別名添加了定義,該別名用於侦聽器中並映射到SASL_SSL
,這意味著將同時使用SSL(早期TLS的名稱)和SASL。
接下來,將光標移至文件末尾,並添加以下行:
您首先定義生成的信任和金鑰庫的位置和密碼。您將ssl.client.auth
參數設定為required
,指示Kafka不接受任何未出示有效TLS憑證的連接。然後,您將SASL機制設定為PLAIN
,以启用它。PLAIN
與PLAINTEXT
不同,它要求使用加密的連接,並且都依賴於用戶名和密碼憑證的組合。
最後,您將StandardAuthorizer
設定為授权類,該類將根據您即將創建的配置文件檢查憑據。然後,您將allow.everyone.if.no.acl.found
參數設定為false
,限制具有不適當憑据的連接的訪問。您還將admin
用戶標記為超用戶,因為 cluster中至少需要一個用於執行管理任務。
請牢記將your_tls_password
替換為前一小節中傳遞給腳本的密碼,然後保存並關閉文件。
既然您已經設定好 Kafka,您將需要創建一個文件來定義用於連接的允許凭证。Kafka 支援 Java 驗證和授權服務(JAAS),一個用於實現驗證工作流程的框架,並接受以 JAAS 格式定義的憑据。
您將將它們存儲在 `config/kraft` 目錄下的 `kafka-server-jaas.conf` 文件中。通過運行以下命令來創建並打開它進行編輯:
添加以下行:
`username
` 和 `password
` 定義主要凭证,當存在多個節點時,用於群集中間 broker 之間的通信。`user_admin
` 行定義一個用戶名為 `admin`、密碼為 `admin` 的用戶,它可以從外部連接到 broker。完成後保存並關閉文件。
Kafka 需要知道 `kafka-server-jaas.conf` 文件,因為它补充了主配置。您需要修改 `kafka` systemd 服務配置並傳入對它的引用。運行以下命令以打開服務進行編輯:
通過傳入 `–full`,您可以獲得服務的完整內容。找到 `ExecStart` 行:
在它上面添加以下行,使其看起來像這樣:
thus,你需要在配置文件中設定java.security.auth.login.config
參數,將其指向JAAS配置文件的路徑,以此將其從主要Kafka配置中解耦。完成後,保存並關閉文件。通過運行以下命令重新載入服務定義:
然後,重新啟動Kafka:
你现在已经為你的Kafka安裝配置了TLS加密和SASL驗證,接下來將學習如何使用提供的控制台脚本連接到它。
步驟2 – 連接到安全的簇
在這一步,你將學習如何使用提供的控制台脚本,通過JAAS配置文件連接到安全的Kafka簇。
用於操作主题的生产和消费消息的提供的脚本内部也是使用Java,因此接受一個JAAS配置,該配置 detailed the trust and key store locations, as well as SASL credentials.
你將將此配置儲存在家目錄下命名為client-jaas.conf
的文件中。創建並打開它進行編輯:
添加以下行:
與之前類似,您將協定設定為 SASL_SSL
並提供您已建立的密鑰和信任儲存庫的路徑和密碼。然後,您將SASL機制設定為 PLAIN
並提供用戶 admin
的憑證。您明確清除 ssl.endpoint.identification.algorithm
參數,以防止連接問題,因為初始腳本將運行它的機器的主機名設定為證書端點,這可能不正確。
將 your_tls_password
替換為正確的值,然後保存並關閉文件。
要將此文件傳遞給腳本,您可以使用 --command-config
參數。嘗試使用以下命令在集群中創建一個新主題:
命令應該能夠成功執行:
要驗證它是否已創建,通過運行以下命令列出集群中的所有主題:
輸出將顯示 new_topic
存在:
在這一部分,您已經配置了您的Kafka安裝以使用TLS加密傳輸流量和SASL進行身份驗證,結合用戶名和密碼。接下來,您將學習如何通過JMX使用Prometheus導出各種Kafka指標。
步驟3 – 使用Prometheus監控Kafka JMX指標
在這一節中,您將使用Prometheus來收集Kafka指標,並將它們在Grafana中變得可查詢。這包括設置Kafka的JMX導出器和將其連接到Prometheus。
[Java管理擴展(JMX)是一個用於Java應用程序的框架,允許開發人員以標準化格式收集關於應用運行時的常規和自定義指標。由於Kafka是用Java編寫的,因此它支持JMX協議,並通過它公開其自定義指標,例如主題和代理的狀態。
配置Kafka和Prometheus
在繼續之前,您需要安裝Prometheus。在Ubuntu機器上,您可以使用apt
。通過運行以下命令來更新其存儲庫:
然後,安裝Prometheus:
對於其他平台,請遵循官方網站上的安裝說明。
code>
安裝完成後,您需要將JMX導出器庫為Prometheus添加到您的Kafka安裝中。導航到發行版頁面並選擇名稱中包含javaagent
的最新發行版。在撰寫本文時,最新的可用版本是0.20.0
。使用以下命令將其下載到Kafka安裝的libs/
目錄中:
JMX導出器庫現在將被Kafka採用。
在啟用導出器之前,您需要定義它將向Prometheus報告哪些指標,並將該配置存儲在Kafka安裝的config/
目錄下的名為jmx-exporter.yml
的文件中。JMX導出器項目提供了適用的默認配置,因此運行以下命令將其存儲為Kafka安裝的config/
目錄下的jmx-exporter.yml
:
接下來,要啟用導出器,您需要修改Kafka systemd服務。您需要修改KAFKA_OPTS
環境變量以包括導出器及其配置。運行以下命令以編輯服務:
修改Environment
行以顯示如下:
在這裡,您使用-javaagent
參數來使用其配置初始化JMX導出器。
完成後保存並關閉文件,然後運行以下命令重新啟動Kafka:
一分鐘後,通過檢查端口7075
是否被使用來驗證JMX導出器是否正在運行:
這一行顯示端口 7075
正被一個Java進程使用,該進程是由Kafka服務啟動的,這指的是JMX出口商。
現在您將配置Prometheus以監控導出的JMX指標。其主配置文件位於 /etc/prometheus/prometheus.yml
,因此請打開它進行編輯:
找到以下行:
在 scrape_configs
下,指定Prometheus應該監視哪些端點,為抓取Kafka指標添加一個新的部分:
kafka
工作有一個目標,指向 JMX 出口端點。
請記住將 your_domain
替換為您的域名,然後保存並關閉文件。然後,通過運行以下命令重新啟動 Prometheus:
在您的瀏覽器中,前往您域名的端口 9090
。您將訪問 Prometheus 用戶介面。在 Status 下,點擊 Targets 來列出工作:
請注意 Prometheus 已經接受 kafka
工作並開始抓取其度量。現在您將學習如何在地圖中訪問它們。
在Grafana中查询度量
作為前提條件之一,您已經在您的Droplet上安裝了Grafana,並將其暴露在your_domain
上。在您的瀏覽器中導航至該網站,在侧邊欄中的連接部分,點擊新增連接,然後在搜索欄位中輸入Prometheus。
點擊Prometheus,然後在右上角點擊新增數據源按鈕。系統將要求您填寫Prometheus實例的地址:
輸入http://your_domain_name:9090
,將your_domain_name替換為您的實際 domain name,然後向下捲動並點擊保存與測試。您應該會收到成功消息:
已將Prometheus連接添加至Grafana。在側邊欄中點擊探索,然後您將被提示選擇一個度量。您可以輸入kafka_
以列出與叢擎相關的的所有度量,如下所示:
例如,選擇kafka_log_log_size
度量,該度量顯示每個分区上磁盤上的內部日誌有多大,然後在右上角點擊運行查詢。您將看到每個可用主題随时间的结果大小:
在這個步驟中,您已經設定 export JMX 指標,這些指標是 Kafka 所提供的,並已配置 Prometheus 以收集這些指標。接著,您從 Grafana 內連接到它,並對 Kafka 指標執行了一条查詢。現在,您將學習如何使用網頁界面管理 Kafka 叢簇。
步驟 4 – 使用 AKHQ 管理 Kafka 叢簇
在這個步驟中,您將學習如何設定並使用 AKHQ,一個用於管理 Kafka 叢簇的網頁應用程式。它讓您能夠列印和操作主題、分区、消費者組和設定參數,以及從一個地方 produce 和 consume 消息。
您將將可执行文件及其配置存儲在一個命名為 akhq
的目錄中。您可以在主目錄中通過運行:
转到它:
在您的瀏覽器中,訪問 官方發布 頁面,並複制最新版本的 JAR 文件鏈接。在寫作本文時,最新版本是 0.24.0
。運行以下命令將其下載到您的家目錄中:
您現在已經下載了 AKHQ,並已經準備好為其定義用於連接到您的叢簇的配置。您將將該配置存儲在一個名為 akhq-config.yml
的文件中。通過運行以下命令創建並打開它以進行編輯:
添加以下行:
這是一個基本的AKHQ配置,指定了一個位於localhost:9092
的群集,並指定了相應的SASL和TLS參數。同時支持多個群集,因為您可以定義您想要的任意多個連接。這使得AKHQ能夠靈活地管理Kafka。完成後,請保存並關閉文件。
接下來,您需要定義一個systemd
服務以在後台運行AKHQ。systemd
服務可以一致地啟動、停止和重新啟動。
您將服務配置存儲在一個名為code-server.service
的文件中,該文件位於/lib/systemd/system
目錄下,systemd就在這裡存儲其服務。請使用文本編輯器創建它:
添加以下行:
您首先指定服務的描述。然後,在[Service]
部分,您定義服務的類型(simple
意味著命令應簡單地執行)並提供將要運行的命令。您還指定了運行該服務的用户是kafka
,並且如果服務退出,則應自動重新啟動服務。
[Install]
部分讓systemd在您可以登錄到服務器的時候啟動此服務。完成後,請保存並關閉文件。
通過運行以下命令加載服務配置:
通過運行以下命令啟動AKHQ服務:
然後,通過觀察其狀態來檢查它是否正確啟動:
輸出應該如下所示:
AKHQ 現在正在背景中運行。預設情況下,它被暴露在 8080
號端口上。在您的瀏覽器中,導航到您的域名並附加該端口以訪問它。您將看到默認視圖,顯示主題列表:
您可以雙擊表格中主題對應的行,以訪問並獲得詳細視圖:
AKHQ 讓您能夠查看主題中的消息,以及分區、消費者群組及其配置。您還可以使用右下角的按鈕清空或複製主題。
由於 new_topic
主題是空的,按下 生產至主題 �按鈕,這將打開新消息參數選擇的界面:
AKHQ 將自動為您填充主題名稱。在 值 欄位中,輸入 Hello World!
,然後按 生產。消息將被發送到 Kafka,您將在 數據 標籤中看到它:
由於消息的內容可能非常大,AKHQ 只顯示第一行。要查看完整的消息,請按擊行後的暗區域以顯示它。
在左側邊欄中,您還可以通過按擊 節點 來列出集群中的代理。目前,集群只包含一個節點:
雙擊節點將打開其配置,允許您遠程更改任何設置:
一旦您做出了更改,您可以通過按下手邊的更新設定按鈕來套用這些更改。同樣地,您可以通過存取並切換到設定標籤來查看和修改任何主題的配置。
在這一節中,您已經設定好了AKHQ,一個提供易於使用的介面來遠端管理與觀察Kafka節點和主題的網頁應用程式。它允許您在主題中生产和消費消息,並即刻更新節點和主題的配置參數。
結論
在這個教學中,您通過為加密配置TLS和為用戶驗證設定SASL來保護您的Kafka安裝。您還設定 Prometheus 來匯出度量並將其可在Grafana中可视化。然後,您學習了如何使用AKHQ,一個用於管理Kafka簇集的網頁應用程式。
作者選擇Apache Software Foundation作為 Write for DOnations 计划的捐贈對象。
Source:
https://www.digitalocean.com/community/developer-center/how-to-secure-and-monitor-kafka