Kafka SSL安裝與配置

哥不是小蘿莉發表於2020-05-24

1.概述

最近有同學諮詢說,Kafka的SSL安全認證如何安裝與使用?今天筆者將通過以下幾個方面來介紹Kafka的SSL:

  • Kafka 許可權介紹
  • Kafka SSL的安裝與使用
  • Kafka Eagle中如何配置SSL?

2.內容

2.1 什麼是Kafka許可權認證?

在Kafka 0.9.0.0之後,Kafka社群增加了一系列的功能,其中包含對Kafka叢集進行安全管控。支援的許可權認證方式如下:

  1. Broker與Client之間的許可權認證(例如Producer和Consumer)。可以使用SSL或SASL,而SASL支援如下方案:
    • SASL/GSSAPI(Kerberos),開始於0.9.0.0版本
    • SASL/PLAIN,開始於0.10.0.0版本
    • SASL/SCRAM-SHA-256和SASL/SCRAM-SHA-512,開始於0.10.2.0版本
    • SASL/OAUTHBEARER,開始於2.0版本

   2. Broker和Zookeeper之間建立許可權認證

   3. 在Broker和Client之間、Broker和Broker之間使用SSL建立許可權認證時,效能會有所下降,其程度取決於CPU型別和JVM的實現

   4. 對Client進行讀寫認證

在實際生產環境中,對於許可權認證使用的較多的是SCRAM認證,其原因在《Kafka SCRAM和PLAIN實戰》這篇部落格中詳細解釋。

2.2 Kafka SSL安裝與使用

Kafka允許客戶端使用SSL來連線,預設情況下,SSL是禁止的,但是可以通過手動開啟。安裝Kafka SSL的流程如下所示:

 

 

 執行步驟如下所示:

步驟一:初始化環境變數(在指令碼中宣告變數)

BASE_DIR=/Users/smartloli/workspace/ssl
CERT_OUTPUT_PATH="$BASE_DIR/certificates"
PASSWORD=ke123456
KEY_STORE="$CERT_OUTPUT_PATH/kafka.keystore"
TRUST_STORE="$CERT_OUTPUT_PATH/kafka.truststore"
KEY_PASSWORD=$PASSWORD
STORE_PASSWORD=$PASSWORD
TRUST_KEY_PASSWORD=$PASSWORD
TRUST_STORE_PASSWORD=$PASSWORD
CLUSTER_NAME=ke-cluster-01
CERT_AUTH_FILE="$CERT_OUTPUT_PATH/ca-cert"
CLUSTER_CERT_FILE="$CERT_OUTPUT_PATH/${CLUSTER_NAME}-cert"
DAYS_VALID=365
D_NAME="CN=localhost, OU=YourDept, O=YourCompany, L=China, ST=China, C=localhost"

mkdir -p $CERT_OUTPUT_PATH

步驟二:建立證書到KeyStore

keytool -keystore $KEY_STORE -alias $CLUSTER_NAME -validity $DAYS_VALID -genkey -keyalg RSA -storepass $STORE_PASSWORD -keypass $KEY_PASSWORD -dname "$D_NAME"

步驟三:建立CA

openssl req -new -x509 -keyout $CERT_OUTPUT_PATH/ca-key -out "$CERT_AUTH_FILE" -days "$DAYS_VALID"-passin pass:"$PASSWORD" -passout pass:"$PASSWORD"-subj "/C=CN/ST=XX/L=XX/O=XX/CN=XX"

步驟四:匯入CA到TrustStore中

keytool -keystore "$TRUST_STORE" -alias CARoot -import -file "$CERT_AUTH_FILE" -storepass "$TRUST_STORE_PASSWORD" -keypass "$TRUST_KEY_PASS" -noprompt

步驟五:匯出證書

keytool -keystore "$KEY_STORE" -alias "$CLUSTER_NAME" -certreq -file "$CLUSTER_CERT_FILE" -storepass "$STORE_PASSWORD" -keypass "$KEY_PASSWORD" -noprompt

步驟六:給證書籤名

openssl x509 -req -CA "$CERT_AUTH_FILE" -CAkey $CERT_OUTPUT_PATH/ca-key -in "$CLUSTER_CERT_FILE"-out "${CLUSTER_CERT_FILE}-signed"-days "$DAYS_VALID" -CAcreateserial -passin pass:"$PASSWORD"

步驟七:匯入CA到KeyStore

keytool -keystore "$KEY_STORE" -alias CARoot -import -file "$CERT_AUTH_FILE" -storepass "$STORE_PASSWORD"-keypass "$KEY_PASSWORD" -noprompt

步驟八:匯入證書到KeyStore

keytool -keystore "$KEY_STORE" -alias "${CLUSTER_NAME}" -import -file "${CLUSTER_CERT_FILE}-signed"-storepass "$STORE_PASSWORD" -keypass "$KEY_PASSWORD" -noprompt

整個建立證書的指令碼如下:

#! /bin/bash
echo "Step1: Config env" BASE_DIR
=/Users/smartloli/workspace/ssl CERT_OUTPUT_PATH="$BASE_DIR/certificates" PASSWORD=ke123456 KEY_STORE="$CERT_OUTPUT_PATH/kafka.keystore" TRUST_STORE="$CERT_OUTPUT_PATH/kafka.truststore" KEY_PASSWORD=$PASSWORD STORE_PASSWORD=$PASSWORD TRUST_KEY_PASSWORD=$PASSWORD TRUST_STORE_PASSWORD=$PASSWORD CLUSTER_NAME=test-cluster-01 CERT_AUTH_FILE="$CERT_OUTPUT_PATH/ca-cert" CLUSTER_CERT_FILE="$CERT_OUTPUT_PATH/${CLUSTER_NAME}-cert" DAYS_VALID=365 D_NAME="CN=localhost, OU=YourDept, O=YourCompany, L=China, ST=China, C=localhost" mkdir -p $CERT_OUTPUT_PATH echo "Step2: Create certificate to keystore" keytool -keystore $KEY_STORE -alias $CLUSTER_NAME -validity $DAYS_VALID -genkey -keyalg RSA -storepass $STORE_PASSWORD -keypass $KEY_PASSWORD -dname "$D_NAME" echo "Step3: Create CA" openssl req -new -x509 -keyout $CERT_OUTPUT_PATH/ca-key -out "$CERT_AUTH_FILE" -days "$DAYS_VALID"-passin pass:"$PASSWORD" -passout pass:"$PASSWORD"-subj "/C=CN/ST=XX/L=XX/O=XX/CN=XX" echo "Step4: Import CA into truststore" keytool -keystore "$TRUST_STORE" -alias CARoot -import -file "$CERT_AUTH_FILE" -storepass "$TRUST_STORE_PASSWORD" -keypass "$TRUST_KEY_PASS" -noprompt echo "Step5: Export certificate from keystore" keytool -keystore "$KEY_STORE" -alias "$CLUSTER_NAME" -certreq -file "$CLUSTER_CERT_FILE" -storepass "$STORE_PASSWORD" -keypass "$KEY_PASSWORD" -noprompt echo "Step6: Signing the certificate" openssl x509 -req -CA "$CERT_AUTH_FILE" -CAkey $CERT_OUTPUT_PATH/ca-key -in "$CLUSTER_CERT_FILE"-out "${CLUSTER_CERT_FILE}-signed"-days "$DAYS_VALID" -CAcreateserial -passin pass:"$PASSWORD" echo "Setp7: Import CA into keystore" keytool -keystore "$KEY_STORE" -alias CARoot -import -file "$CERT_AUTH_FILE" -storepass "$STORE_PASSWORD"-keypass "$KEY_PASSWORD" -noprompt echo "Setp8: Import signed certificate into keystore" keytool -keystore "$KEY_STORE" -alias "${CLUSTER_NAME}" -import -file "${CLUSTER_CERT_FILE}-signed"-storepass "$STORE_PASSWORD" -keypass "$KEY_PASSWORD" -noprompt

成功執行指令碼後,會在對應的目錄($BASE_DIR/certificates)生成對應檔案清單:

ca-cert
ca-cert.srl
ca-key
kafka.keystore
kafka.truststore
test-cluster-01-cert
test-cluster-01-cert-signed

2.3 Kafka Broker配置SSL

Kafka Broker是支援監聽多個Port上的連線,通過在Kafka服務端的配置檔案中(預設是server.properties)中進行配置,至少監聽一個Port,用逗號進行分割。配置內容如下:

### SSL Start

listeners=SSL://localhost:9095
advertised.listeners=SSL://localhost:9095
ssl.keystore.location=/Users/smartloli/workspace/ssl/certificates/kafka.keystore
ssl.keystore.password=ke123456
ssl.key.password=ke123456
ssl.truststore.location=/Users/dengjie/workspace/ssl/certificates/kafka.truststore
ssl.truststore.password=ke123456

ssl.client.auth=required
ssl.enabled.protocols=TLSv1.2,TLSv1.1,TLSv1
ssl.keystore.type=JKS 
ssl.truststore.type=JKS 
ssl.endpoint.identification.algorithm=HTTPS
security.inter.broker.protocol=SSL


### SSL End

然後,啟動Kafka服務,執行指令碼如下:

$KAFKA_HOME/bin/kafka-server-start.sh $KAFKA_HOME/config/server.properties &

2.4 Kafka Eagle如何整合SSL?

目前Kafka Eagle支援SASL和SSL多種安全認證協議,這裡我們來說說如何配置SSL協議(Kafka Eagle V1.4.7以後的版本支援SSL)。想要了解配置SASL協議的,可以閱讀Kafka Eagle官方文件來進行配置。

下載最新版本,然後解壓,接著配置環境變數,最後配置system-config.properties檔案。配置內容如下所示:

######################################
# kafka ssl authenticate
######################################
cluster3.kafka.eagle.ssl.enable=true
cluster3.kafka.eagle.ssl.protocol=SSL
# kafka server.properties "ssl.truststore.location" value
cluster3.kafka.eagle.ssl.truststore.location=/data/kafka/ssl/certificates/kafka.truststore
# kafka server.properties "ssl.truststore.password" value
cluster3.kafka.eagle.ssl.truststore.password=ke123456
# kafka server.properties "ssl.keystore.location" value
cluster3.kafka.eagle.ssl.keystore.location=/data/kafka/ssl/certificates/kafka.keystore
# kafka server.properties "ssl.keystore.password" value
cluster3.kafka.eagle.ssl.keystore.password=ke123456
# kafka server.properties "ssl.key.password" value
cluster3.kafka.eagle.ssl.key.password=ke123456

這裡需要注意的是,Kafka Eagle支援CGroups。例如,你的當前SSL認證資訊,只能訪問一部分的Topics,而Kafka叢集除了這些你能訪問的Topics,還有寫Topics你是沒有許可權訪問。這樣當你開啟了Kafka Eagle的CGroup特性後,Kafka Eagle會將你的SSL認證許可權範圍縮小你當前能訪問的Topics集合裡面,配置內容如下所示:

# SASL
cluster3.kafka.eagle.sasl.cgroup.enable=true
cluster3.kafka.eagle.sasl.cgroup.topics=topic1,topic2,topic3

2.5 Kafka  Eagle SSL協議預覽

訪問Kafka Eagle的頁面,預覽截圖如下所示:

 

3.總結

在安裝SSL時,需要使用keytool和openssl命令,如果提供命令不存在,需要提前安裝好這個命令。而在使用Kafka Eagle整合SSL協議時,各個屬性的值需要設定正確,比如密碼、證書路徑等。

4.結束語

這篇部落格就和大家分享到這裡,如果大家在研究學習的過程當中有什麼問題,可以加群進行討論或傳送郵件給我,我會盡我所能為您解答,與君共勉!

另外,博主出書了《Kafka並不難學》和《Hadoop大資料探勘從入門到進階實戰》,喜歡的朋友或同學, 可以在公告欄那裡點選購買連結購買博主的書進行學習,在此感謝大家的支援。關注下面公眾號,根據提示,可免費獲取書籍的教學視訊。

相關文章