1. 準備 docker
-
下載鏡像
docker pull centos/systemd
,該鏡像是基于 centos7 增加了 systemd 的功能,可以更方便啟動后臺服務 -
啟動鏡像
-
使用 systemd 功能需要權限,如果是模擬 gitlab services 就不要使用 systemd 的方式啟動
-
如果不使用 systemd 功能
docker run -itd --name kafka_kerberos -p 9092:9092 centos/systemd
-
如果使用 systemd 功能
docker run -itd --name kafka_kerberos -p 9092:9092 --privileged=true centos/systemd /usr/sbin/init
-
-
根據需求清空 /etc/resolv.conf,內網環境中自動添加的 8.8.8.8 會影響網絡
-
啟動 sshd
/usr/sbin/sshd -D &
2. 配置 kerberos
服務端
-
安裝服務端
yum install krb5-server
-
配置 /etc/hosts
- 根據需要配置,配置下面 /etc/krb5.conf 文件中 TEST.COM 里的域名對應的 IP
-
配置 /etc/krb5.conf
-
對下面的行進行修改,其它行不變
default_realm = TEST.COM default_ccache_name = /tmp/krb5cc_%{uid} dns_lookup_realm = false dns_lookup_kdc = false rdns = false # 這行注釋掉 # renew_lifetime=...[realms] TEST.COM = {kdc = kafka_kerberosadmin_server = kafka_kerberos }[domain_realm] .test.com = TEST.COM test.com = TEST.COM
-
-
配置 /var/kerberos/krb5kdc/kdc.conf,將
EXAMPLE.COM
修改為TEST.COM
-
配置 /var/kerberos/krb5kdc/kadm5.acl,配置對 Kerberos 數據庫的訪問權限的,我只將
EXAMPLE.COM
改為了TEST.COM
,有權限需要可以找資料學習配置 -
初始化 Kerberos 數據庫
-
kdb5_util create -s -r TEST.COM
-
鍵入密碼,個人輸入 kerberos,記錄在此,以免忘記
-
-
啟動 kerberos 服務
-
不使用 systemd 啟動 (不帶 systemd 的 docker 鏡像需要用這種方式啟動)
/usr/sbin/krb5kdc -P /var/run/krb5kdc.pid -r TEST.COM /usr/sbin/kadmind -P /var/run/kadmind.pid -r TEST.COM
-
使用 systemd 啟動
systemctl start krb5kdc systemctl start kadmin
-
-
kerberos 服務端使用 kadmin.local 進行管理,創建 root 的 principal (默認是 {當前用戶}/admin@TEST.COM)
kadmin.local -q "add_principal root/admin@TEST.COM"
- 輸入密碼,個人輸入密碼 root,記錄在此,以免忘記
客戶端
-
安裝客戶端
yum install krb5-workstation
-
配置 /etc/krb5,將服務端的文件拷貝覆蓋
-
在客戶端使用 kadmin 管理
-
認證用戶
kinit root/admin@TEST.COM
-
查看當前認證的用戶
klist
-
清空當前認證緩存
kdestroy
3. 配置 kafka 環境
在 kafka 官網下載一個可用版本
在服務端生成認證所需的密鑰
# 創建 principal
kadmin.local -q "add_principal -randkey zookeeper/kafka_kerberos@TEST.COM"
kadmin.local -q "add_principal -randkey kafka/kafka_kerberos@TEST.COM"
kadmin.local -q "add_principal -randkey kafka-client@TEST.COM"# 生成密鑰前必須要建立密鑰放置的目錄
mkdir /root/keytabs# 生成密鑰文件
kadmin.local -q "xst -k /root/keytabs/zookeeper-server.keytab zookeeper/kafka_kerberos@TEST.COM"
kadmin.local -q "xst -k /root/keytabs/kafka-server.keytab kafka/kafka_kerberos@TEST.COM"
kadmin.local -q "xst -k /root/keytabs/kafka-client.keytab kafka-client@TEST.COM"# 測試是否能夠認證成功
kinit -kt /root/keytabs/zookeeper-server.keytab zookeeper/kafka_kerberos@TEST.COM
klist
配置 java 環境
# 安裝JDK安裝包(先查,再下載development環境的)
yum install openjdk-devel# 配置JAVA的真實位置
which java # 找到java位置
ls -lr /usr/bin/java # 找到java鏈接的文件(上面執行的結果)
ls -lrt /etc/alternatives/java # 找到鏈接文件的真實地址(上面執行的結果)# 配置JAVA_HOME (上面執行的結果,截取到系統版本號)
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.232.b09-0.el7_7.x86_64
export CLASSPATH=$JAVA_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$PATH
開始配置 kafka 環境
-
配置 zookeeper 相關文件
-
創建 config/kerberos/zookeeper-server-jaas.conf 文件,注意下面內容有兩個分號
Server {com.sun.security.auth.module.Krb5LoginModule requireduseKeyTab=truestoreKey=trueuseTicketCache=falsekeyTab="/root/keytabs/zookeeper-server.keytab"principal="zookeeper/kafka_kerberos@TEST.COM"; };
-
拷貝 config/zookeeper.properties 到 config/zookeeper-kerberos.properties,在末尾添加以下內容
# 根據需要配置 dataDir dataDir=/root/kafka_data/zookeeperauthProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider jaasLoginRenew=3600000 sessionRequireClientSASLAuth=true
-
創建啟動腳本 zookeeper_start.sh
export KAFKA_OPTS='-Djava.security.krb5.conf=/etc/krb5.conf -Djava.security.auth.login.config=/root/kafka_2.13-2.7.1/config/kerberos/zookeeper-server-jaas.conf' ./bin/zookeeper-server-start.sh -daemon config/zookeeper-kerberos.properties
-
創建停止腳本 zookeeper_stop.sh
./bin/zookeeper-server-stop.sh config/zookeeper.properties
-
-
配置 kafka 相關文件
-
創建 config/kerberos/kafka-server.jaas.conf 文件,注意下面內容有兩個分號
KafkaServer {com.sun.security.auth.module.Krb5LoginModule requireduseKeyTab=truestoreKey=trueuseTicketCache=falsekeyTab="/root/keytabs/kafka-server.keytab"principal="kafka/kafka_kerberos@TEST.COM"; };Client {com.sun.security.auth.module.Krb5LoginModule requireduseKeyTab=truestoreKey=trueuseTicketCache=falsekeyTab="/root/keytabs/kafka-server.keytab"principal="kafka/kafka_kerberos@TEST.COM"; };
-
拷貝 config/server.properties 到 config/server-kerberos.properties,在末尾添加以下內容
# 根據需要配置 log.dirs log.dirs=/root/kafka_data/kafka-logs# 這里要將 localhost 改為 principal 中的值,與 zookeeper/kafka_kerberos 對應 zookeeper.connect=kafka_kerberos:2181 listeners=SASL_PLAINTEXT://0.0.0.0:9092 advertised.listeners=SASL_PLAINTEXT://kafka_kerberos:9092 security.inter.broker.protocol=SASL_PLAINTEXT sasl.mechanism.inter.broker.protocol=GSSAPI sasl.enabled.mechanisms=GSSAPI# 需要和 principal 相同 sasl.kerberos.service.name=kafka
-
創建啟動腳本 kafka_start.sh
export KAFKA_OPTS='-Djava.security.krb5.conf=/etc/krb5.conf -Djava.security.auth.login.config=/root/kafka_2.13-2.7.1/config/kerberos/kafka-server-jaas.conf' ./bin/kafka-server-start.sh -daemon config/server-kerberos.properties
-
創建停止腳本 kafka_stop.sh
./bin/kafka-server-stop.sh config/server-kerberos.properties
-
創建 topic_list.sh 腳本
export KAFKA_OPTS='-Djava.security.krb5.conf=/etc/krb5.conf -Djava.security.auth.login.config=/root/kafka_2.13-2.7.1/config/kerberos/kafka-server-jaas.conf' ./bin/kafka-topics.sh --zookeeper kafka_kerberos:2181 --list
-
創建 create_topic.sh 腳本
export KAFKA_OPTS='-Djava.security.krb5.conf=/etc/krb5.conf -Djava.security.auth.login.config=/root/kafka_2.13-2.7.1/config/kerberos/kafka-server-jaas.conf' ./bin/kafka-topics.sh --create --zookeeper kafka_kerberos:2181 --replication-factor 1 --partitions 1 --topic $1
-
創建 delete_topic.sh 腳本
export KAFKA_OPTS='-Djava.security.krb5.conf=/etc/krb5.conf -Djava.security.auth.login.config=/root/kafka_2.13-2.7.1/config/kerberos/kafka-server-jaas.conf' ./bin/kafka-topics.sh --delete --zookeeper kafka_kerberos:2181 --topic $1
-
-
配置 kafka 客戶端相關文件
-
創建 config/kerberos/kafka-client-jaas.conf 文件,注意下面內容有兩個分號
KafkaClient {com.sun.security.auth.module.Krb5LoginModule requireduseKeyTab=truestoreKey=trueuseTicketCache=falsekeyTab="/root/keytabs/kafka-client.keytab"principal="kafka-client@TEST.COM"; };
-
創建 config/client-kerberos.properties 文件
security.protocol=SASL_PLAINTEXT sasl.mechanism=GSSAPI sasl.kerberos.service.name=kafka
-
創建 producer.sh 腳本
export KAFKA_OPTS='-Djava.security.krb5.conf=/etc/krb5.conf -Djava.security.auth.login.config=/root/kafka_2.13-2.7.1/config/kerberos/kafka-client-jaas.conf' ./bin/kafka-console-producer.sh --broker-list kafka_kerberos:9092 --topic $1 --producer.config config/client-kerberos.properties
-
創建 consumer.sh 腳本
export KAFKA_OPTS='-Djava.security.krb5.conf=/etc/krb5.conf -Djava.security.auth.login.config=/root/kafka_2.13-2.7.1/config/kerberos/kafka-client-jaas.conf' ./bin/kafka-console-consumer.sh --bootstrap-server kafka_kerberos:9092 --topic $1 --from-beginning --consumer.config config/client-kerberos.properties
-
過程中報錯處理
-
報錯 Server not found in Kerberos database
-
查看 /var/log/krb5kdc.log 中報錯,找不到 zookeeper/localhost@TEST.COM
-
原因:配置 server-kerberos.properties 文件時,需要更改連接 zookeeper 的 host
-