作者樂維社區(qū)(forum.lwops.cn)許遠(yuǎn)
在構(gòu)建現(xiàn)代的分布式系統(tǒng)時,確保數(shù)據(jù)傳輸?shù)陌踩灾陵P(guān)重要氓癌。Apache Kafka和 Zookeeper 作為流行的分布式消息隊(duì)列和協(xié)調(diào)服務(wù)坡慌,提供了SSL(Secure Sockets Layer)認(rèn)證機(jī)制粹懒,以增強(qiáng)數(shù)據(jù)傳輸過程中的安全性涨冀。
本文將詳細(xì)介紹從生成SSL證書到配置服務(wù)端和客戶端的全過程迁客,確保數(shù)據(jù)在傳輸過程中得到充分的保護(hù)担敌。
一摔敛、配置Kafka賬號密碼:
1、首先全封,需要修改kafka配置文件:vim /asop/kafka/kafka_2.11-2.1.0/config/server.properties
broker.id=0
listeners=SASL_PLAINTEXT://:9092
advertised.listeners=SASL_PLAINTEXT://10.176.31.137:9092
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
log.dirs=/asop/kafka/logs
num.partitions=1
num.recovery.threads.per.data.dir=1
offsets.topic.replication.factor=1
transaction.state.log.replication.factor=1
transaction.state.log.min.isr=1
log.retention.hours=168
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000
zookeeper.connect=localhost:2181
zookeeper.connection.timeout.ms=6000
group.initial.rebalance.delay.ms=0
#使用的認(rèn)證協(xié)議
security.inter.broker.protocol=SASL_PLAINTEXT
#SASL機(jī)制
sasl.enabled.mechanisms=PLAIN
sasl.mechanism.inter.broker.protocol=PLAIN
#完成身份驗(yàn)證的類
authorizer.class.name=kafka.security.auth.SimpleAclAuthorizer
#如果沒有找到ACL(訪問控制列表)配置马昙,則允許任何操作桃犬。
allow.everyone.if.no.acl.found=false
#需要開啟設(shè)置超級管理員,設(shè)置visitor用戶為超級管理員
super.users=User:visitor
2、其次行楞,為server創(chuàng)建登錄驗(yàn)證文件,可以根據(jù)自己愛好命名文件攒暇,如vim /asop/kafka/kafka_2.11-2.1.0/config/kafka_server_jaas.conf?,文件內(nèi)容如下
KafkaServer {
????org.apache.kafka.common.security.plain.PlainLoginModule required
????????username="visitor"
????????password="qaz@123"
????????user_visitor="qaz@123";
};
3子房、然后修改kafka安裝目錄vim /asop/kafka/kafka_2.11-2.1.0/bin/kafka-server-start.sh形用,在文件最上面添加變量
export KAFKA_OPTS=" -Djava.security.auth.login.config=/asop/kafka/kafka_2.11-2.1.0/config/kafka_server_jaas.conf"
4、接下來為consumer和producer創(chuàng)建登錄驗(yàn)證文件证杭,可以根據(jù)愛好命名文件田度,如kafka_client_jaas.conf,文件內(nèi)容如下(如果是程序訪問解愤,如springboot訪問镇饺,可以不配置)
vim /asop/kafka/kafka_2.11-2.1.0/config/kafka_client_jaas.conf
KafkaClient {
org.apache.kafka.common.security.plain.PlainLoginModule required ?
????username="visitor" ?
????password="qaz@123";
};
5、在consumer.properties和producer.properties里分別加上如下配置:
vim /asop/kafka/kafka_2.11-2.1.0/config/consumer.properties
vim /asop/kafka/kafka_2.11-2.1.0/config/producer.properties
security.protocol=SASL_PLAINTEXT
sasl.mechanism=PLAIN
[if !supportLists]6送讲、[endif]修改kafka安裝目錄bin/kafka-console-producer.sh和bin/kafka-console-consumer.sh奸笤,在文件最上面添加變量
vim /asop/kafka/kafka_2.11-2.1.0/bin/kafka-console-producer.sh
vim /asop/kafka/kafka_2.11-2.1.0/bin/kafka-console-consumer.sh
export KAFKA_OPTS=" -Djava.security.auth.login.config=/asop/kafka/kafka_2.11-2.1.0/config/kafka_client_jaas.conf"
[if !supportLists]4、[endif]分別啟動zookeeper和kafka,至此服務(wù)端kafka用戶登錄驗(yàn)證配置完成(先關(guān)閉kafka后關(guān)閉zookeeper)
關(guān)閉服務(wù)kafka
# /asop/kafka/kafka_2.11-2.1.0/bin/kafka-server-stop.sh -daemon /asop/kafka/kafka_2.11-2.1.0/config/server.properties
啟動服務(wù)kafka
#/asop/kafka/kafka_2.11-2.1.0/bin/kafka-server-start.sh -daemon /asop/kafka/kafka_2.11-2.1.0/config/server.properties
關(guān)閉服務(wù)zookeeper-3.4.13
/asop/zk/zookeeper-3.4.13/bin/zkServer.sh ?stop /asop/zk/zookeeper-3.4.13/conf/zoo.cfg
啟動服務(wù)zookeeper-3.4.13
/asop/zk/zookeeper-3.4.13/bin/zkServer.sh?start ?/asop/zk/zookeeper-3.4.13/conf/zoo.cfg
5哼鬓、創(chuàng)建及查看主題
/asop/kafka/kafka_2.11-2.1.0/bin/kafka-console-producer.sh --broker-list 10.176.31.137:9092 --topic cmdb --producer-property security.protocol=SASL_PLAINTEXT --producer-property sasl.mechanism=PLAIN
接收消息
/asop/kafka/kafka_2.11-2.1.0/bin/kafka-console-consumer.sh --bootstrap-server 10.176.31.137:9092 --topic cmdb --from-beginning --consumer-property security.protocol=SASL_PLAINTEXT --consumer-property sasl.mechanism=PLAIN
二监右、zk和kafka配置ssal賬號密碼:
1. Zookeeper 配置 SASL
1.1 新建 zoo_jaas.conf 文件
zoo_jaas.conf 文件名、文件所在路徑?jīng)]有特殊要求异希,一般放置在${ZOOKEEPER_HOME}/conf目錄下vim /asop/zk/zookeeper-3.4.13/conf/zoo_jaas.conf
Server {
org.apache.kafka.common.security.plain.PlainLoginModule required
username="admin"
password="admin@12"
user_kafka="kafka@123";
};
Server.username健盒、Server.password為 Zookeeper 內(nèi)部通信的用戶名和密碼,因此保證每個 zk 節(jié)點(diǎn)該屬性一致即可
Server.user_xxx 中 xxx 為自定義用戶名宠互,用于 zkClient 連接所使用的用戶名和密碼味榛,即為 kafka 創(chuàng)建的用戶名
1.2 配置 /asop/zk/zookeeper-3.4.13/conf/zoo.cfg 文件
authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
requireClientAuthScheme=sasl
jaasLoginRenew=3600000
zookeeper.sasl.client=true
zookeeper.sasl.client 設(shè)置為 true,開啟客戶端身份驗(yàn)證予跌,否則zoo_jaas.conf中配置的用戶名將不起作用,客戶端仍然可以無 jaas 文件連接善茎,只是帶有 WARNNING 而已
1.3 導(dǎo)入依賴包
因?yàn)槭褂玫臋?quán)限驗(yàn)證類為:org.apache.kafka.common.security.plain.PlainLoginModule券册,所以需要 kafka 相關(guān) jar 包,新建文件夾 zk_sasl_lib垂涯,如下:從kafka/lib目錄下復(fù)制以下幾個jar包到zookeeper的lib和新建的zk_sasl_lib目錄下:
kafka-clients-2.4.1.jar
lz4-java-1.6.0.jar
slf4j-api-1.7.28.jar
slf4j-log4j12-1.7.28.jar
snappy-java-1.1.7.3.jar
mkdir /asop/zk/zookeeper-3.4.13/zk_sasl_lib
cp /asop/kafka/kafka_2.11-2.1.0/libs/kafka-clients-2.1.0.jar /asop/zk/zookeeper-3.4.13/lib/
cp /asop/kafka/kafka_2.11-2.1.0/libs/lz4-java-1.5.0.jar /asop/zk/zookeeper-3.4.13/lib/
cp /asop/kafka/kafka_2.11-2.1.0/libs/slf4j-api-1.7.25.jar /asop/zk/zookeeper-3.4.13/lib/
cp /asop/kafka/kafka_2.11-2.1.0/libs/slf4j-log4j12-1.7.25.jar /asop/zk/zookeeper-3.4.13/lib/
cp /asop/kafka/kafka_2.11-2.1.0/libs/snappy-java-1.1.7.2.jar /asop/zk/zookeeper-3.4.13/lib/
cp /asop/kafka/kafka_2.11-2.1.0/libs/kafka-clients-2.1.0.jar ?/asop/zk/zookeeper-3.4.13/zk_sasl_lib
cp /asop/kafka/kafka_2.11-2.1.0/libs/lz4-java-1.5.0.jar ?/asop/zk/zookeeper-3.4.13/zk_sasl_lib
cp /asop/kafka/kafka_2.11-2.1.0/libs/slf4j-api-1.7.25.jar ?/asop/zk/zookeeper-3.4.13/zk_sasl_lib
cp /asop/kafka/kafka_2.11-2.1.0/libs/slf4j-log4j12-1.7.25.jar ?/asop/zk/zookeeper-3.4.13/zk_sasl_lib
cp /asop/kafka/kafka_2.11-2.1.0/libs/snappy-java-1.1.7.2.jar ?/asop/zk/zookeeper-3.4.13/zk_sasl_lib
chmod 755 -R /asop/zk/zookeeper-3.4.13/zk_sasl_lib/
chmod 755 -R /asop/zk/zookeeper-3.4.13/zk_sasl_lib/
1.4 修改 zkEnv.sh 文件/asop/zk/zookeeper-3.4.13/bin/zkEnv.sh
修改前:如果沒有就直接加
export SERVER_JVMFLAGS="-Xmx${ZK_SERVER_HEAP}m $SERVER_JVMFLAGS"
修改后
for jar in /asop/zk/zookeeper-3.4.13/zk_sasl_lib/*.jar;
do
CLASSPATH="$jar:$CLASSPATH"
done
export SERVER_JVMFLAGS=" -Djava.security.auth.login.config=/asop/zk/zookeeper-3.4.13/conf/zoo_jaas.conf "
重啟Zookeeper 服務(wù)即可
關(guān)閉服務(wù)zookeeper-3.4.13
/asop/zk/zookeeper-3.4.13/bin/zkServer.sh ?stop /asop/zk/zookeeper-3.4.13/conf/zoo.cfg
啟動服務(wù)zookeeper-3.4.13
/asop/zk/zookeeper-3.4.13/bin/zkServer.sh?start ?/asop/zk/zookeeper-3.4.13/conf/zoo.cfg
2. Kakfa 配置 SASL
2.1 新建 kafka_server_jaas.conf 文件
kafka_server_jaas.conf 文件名和存放路徑?jīng)]有要求烁焙,一般放置在${KAFKA_HOME}/config目錄下/asop/kafka/kafka_2.11-2.1.0/config/kafka_server_jaas.conf
KafkaServer {
org.apache.kafka.common.security.plain.PlainLoginModule required
username="visitor"
password="qaz@123"
user_visitor="qaz@123";
};
Client{
org.apache.kafka.common.security.plain.PlainLoginModule required
username="kafka"
password="kafka@123";
};
KafkaServer.username、KafkaServer.password 為 broker 內(nèi)部通信的用戶名密碼耕赘,同上
KafkaServer.user_xxx 其中 xxx 必須和 KafkaServer.username 配置的用戶名一致骄蝇,密碼也一致
KafkaServer.user_producer、KafkaServer.user_consumer 為了之后的 ACL 做準(zhǔn)備操骡,達(dá)到消費(fèi)者生產(chǎn)者使用不同賬號且消費(fèi)者賬號只能消費(fèi)數(shù)據(jù)九火,生產(chǎn)者賬號只能生產(chǎn)數(shù)據(jù)
Client.username赚窃、Client.password 填寫 Zookeeper 中注冊的賬號密碼,用于 broker 與 zk 的通信(若 zk 沒有配置 SASL 可以忽略岔激、若 zookeeper.sasl.client 為 false 也可以忽略只是帶有勒极,日志如下)
[2021-06-29 17:14:30,204] WARN SASL configuration failed: javax.security.auth.login.LoginException: No JAAS configuration section named 'Client' was found in specified JAAS configuration file: '/Users/wjun/env/kafka/config/kafka_server_jaas.conf'. Will continue connection to Zookeeper server without SASL authentication, if Zookeeper server allows it. (org.apache.zookeeper.ClientCnxn)
2.2 修改 server.properties 文件
broker.id=0
listeners=SASL_PLAINTEXT://:9092
advertised.listeners=SASL_PLAINTEXT://192.168.157.198:9092
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
log.dirs=/asop/kafka/logs
num.partitions=1
num.recovery.threads.per.data.dir=1
offsets.topic.replication.factor=1
transaction.state.log.replication.factor=1
transaction.state.log.min.isr=1
log.retention.hours=168
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000
zookeeper.connect=127.0.0.1:2181
zookeeper.connection.timeout.ms=6000
group.initial.rebalance.delay.ms=0
#使用的認(rèn)證協(xié)議
security.inter.broker.protocol=SASL_PLAINTEXT
#SASL機(jī)制
sasl.enabled.mechanisms=PLAIN
sasl.mechanism.inter.broker.protocol=PLAIN
#完成身份驗(yàn)證的類
authorizer.class.name=kafka.security.auth.SimpleAclAuthorizer
#如果沒有找到ACL(訪問控制列表)配置,則允許任何操作虑鼎。
allow.everyone.if.no.acl.found=false
#需要開啟設(shè)置超級管理員,設(shè)置visitor用戶為超級管理員
super.users=User:visitor
其中l(wèi)ocalhost 需要修改成 IP地址
super.users 配置超級用戶辱匿,該用戶不受之后的 ACL 配置影響
2.3 修改啟動腳本
修改kafka-server-start.sh 文件,使之加載到 kafka_server_jaas.conf 文件/asop/kafka/kafka_2.11-2.1.0/bin/kafka-server-start.sh
修改前:
if [ "x$KAFKA_HEAP_OPTS" = "x" ]; then
export KAFKA_HEAP_OPTS="-Xmx1G -Xms1G"
fi
修改后:
(先在首行加這一行,如果有了就不用加了)export KAFKA_OPTS=" -Djava.security.auth.login.config=/asop/kafka/kafka_2.11-2.1.0/config/kafka_server_jaas.conf"
if [ "x$KAFKA_HEAP_OPTS" = "x" ]; then
export KAFKA_HEAP_OPTS="-Xmx1G -Xms1G -Djava.security.auth.login.config=/asop/kafka/kafka_2.11-2.1.0/config/kafka_server_jaas.conf"
fi
設(shè)置zookeeper的ACL規(guī)則
/asop/zk/zookeeper-3.4.13/bin/zkCli.sh ???#進(jìn)入zk的命令行模式
addauth ?digestadmin:admin@12 ????#切換登陸用戶(超級管理員是在zk的配置文件/asop/zk/zookeeper-3.4.13/conf/zoo_jaas.conf里面)
setAcl / ip:127.0.0.1:cdrwa,auth:kafka:kafka@123:cdrwa#(設(shè)置可以登陸的IP和用戶賬號密碼炫彩,admin是上面的zk的配置文件里面定義的管理員匾七,Kafka用戶是/asop/kafka/kafka_2.11-2.1.0/config/kafka_server_jaas.conf文件里面的定義的kafka連接zk的用戶 (Client下面的))
addauth ?digestkafka:kafka@123 ??#再切換為kafka用戶再設(shè)置一次acl
setAcl / ip:127.0.0.1:cdrwa,auth:kafka:kafka@123:cdrwa
注意:如果要加白名單IP或者用戶要在原來的基礎(chǔ)上加,不然會覆蓋
setAcl / ip:127.0.0.1:cdrwa,auth:kafka:kafka@123:cdrwa,auth:admin:admin@12:cdrwa,ip:1.1.1.1
需要恢復(fù)權(quán)限江兢,不設(shè)置acl的話就運(yùn)行
setAcl / world:anyone:cdrwa
重啟kafka 服務(wù)即可
關(guān)閉服務(wù)kafka
# /asop/kafka/kafka_2.11-2.1.0/bin/kafka-server-stop.sh -daemon /asop/kafka/kafka_2.11-2.1.0/config/server.properties
啟動服務(wù)kafka
#/asop/kafka/kafka_2.11-2.1.0/bin/kafka-server-start.sh -daemon /asop/kafka/kafka_2.11-2.1.0/config/server.properties
至此昨忆,完成kafka與zookeeper配置ssl認(rèn)證,更多運(yùn)維技巧歡迎關(guān)注樂維社區(qū)划址,更多運(yùn)維問題也歡迎留言提問扔嵌。