一、概述
官方文檔:
https://kafka.apache.org/documentation/#security
在官方文檔中,kafka有五種加密認證方式,分別如下:
- SSL:用于測試環(huán)境
- SASL/GSSAPI (Kerberos) :使用kerberos認證,密碼是加密的,也是當前企業(yè)中使用最多的,最小支持版本0.9
- SASL/PLAIN :使用簡單用戶名和密碼形式,生產(chǎn)環(huán)境中一般不使用,主要用于測試,最小支持版本0.10
- SASL/SCRAM:主要解決PLAIN動態(tài)更新問題以及安全機制,最小支持版本0.10.2
- SASL/OAUTHBEARER:基于OAuth2認證框架,最小支持版本2.0
幾種認證方式的詳細比較
- SASL/GSSAPI 主要是給 Kerberos 使用的。GSSAPI 適用于本身已經(jīng)做了 Kerberos 認證的場景,這樣的話,SASL/GSSAPI 可以實現(xiàn)無縫集成。
- SASL/PLAIN 是一個簡單的用戶名 / 密碼認證機制,通常與 SSL 加密搭配使用。對于一些小公司而言,搭建公司級的 Kerberos 可能并沒有什么必要,他們的用戶系統(tǒng)也不復雜,特別是訪問 Kafka 集群的用戶可能不是很多。對于 SASL/PLAIN 而言,這就是一個非常合適的應(yīng)用場景??傮w來說,SASL/PLAIN 的配置和運維成本相對較小,適合于小型公司中的 Kafka 集群。SASL/PLAIN 有這樣一個弊端:它不能動態(tài)地增減認證用戶,必須重啟 Kafka 集群才能令變更生效。因為所有認證用戶信息全部保存在靜態(tài)文件中,所以只能重啟 Broker,才能重新加載變更后的靜態(tài)文件。
- SASL/SCRAM 通過將認證用戶信息保存在 ZooKeeper 的方式,避免了動態(tài)修改需要重啟 Broker 的弊端。在實際使用過程中,可以使用 Kafka 提供的命令動態(tài)地創(chuàng)建和刪除用戶,無需重啟整個集群。因此,如果打算使用 SASL/PLAIN,不妨改用 SASL/SCRAM 試試。不過要注意的是,后者是 0.10.2 版本引入的。
- SASL/OAUTHBEARER 是 2.0 版本引入的新認證機制,主要是為了實現(xiàn)與 OAuth 2 框架的集成。 Kafka 不提倡單純使用 OAUTHBEARER,因為它生成的不安全的 JSON Web Token,必須配以 SSL 加密才能用在生產(chǎn)環(huán)境中。
- Delegation Token 是在 1.1 版本引入的,它是一種輕量級的認證機制,主要目的是補充現(xiàn)有的 SASL 或 SSL 認證。 如果要使用 Delegation Token,需要先配置好 SASL 認證,然后再利用 Kafka 提供的 API 去獲取對應(yīng)的 Delegation Token。這樣,Broker 和客戶端在做認證的時候,可以直接使用這個 token,不用每次都去 KDC 獲取對應(yīng)的 ticket(Kerberos 認證)或傳輸 Keystore 文件(SSL 認證)。
二、SASL/PLAIN
SASL/PLAIN是基于用戶名密碼的認證方式,是比較常用的一種認證,通常與TLS一起用于加密以實現(xiàn)安全認證。
增加kafka配置
vim /opt/kafka_2.13-2.6.0/config/server.properties
# 增加以下配置,每臺節(jié)點都要配置
listeners=SASL_PLAINTEXT://host.name:port
security.inter.broker.protocol=SASL_PLAINTEXT
sasl.mechanism.inter.broker.protocol=PLAIN
sasl.enabled.mechanisms=PLAIN
# 分發(fā)配置,需要注意用戶名和路徑
scp /opt/kafka_2.13-2.6.0/config/server.properties root@kafka2-73085:/opt/kafka_2.13-2.6.0/config/
scp /opt/kafka_2.13-2.6.0/config/server.properties root@kafka3-73085:/opt/kafka_2.13-2.6.0/config/
增加kafka的權(quán)限配置信息
# 編輯配置文件
vim /opt/kafka_2.13-2.6.0/config/kafka_server_jaas.conf
# 增加以下配置
# 增加了兩個用戶 admin用戶和tly用戶,配置文件中間不能有注釋
KafkaServer {
org.apache.kafka.common.security.plain.PlainLoginModule required
username="admin"
password="123456"
user_admin="123456"
user_tly="123456";
};
# 分發(fā)配置文件
scp kafka_server_jaas.conf root@kafka2-73085:/opt/kafka_2.13-2.6.0/config/
scp kafka_server_jaas.conf root@kafka3-73085:/opt/kafka_2.13-2.6.0/config/
上面配置是新增了兩個用戶,admin和tly,這兩個用戶都是普通用戶,KafkaServer中的username、password配置的用戶和密碼,是用來broker和broker連接認證。在本例中,admin是代理broker間通信的用戶。user_userName配置為連接到broker的所有用戶定義密碼,broker使用這些驗證所有客戶端連接,包括來自其他broker的連接。
將JAAS位置作為JVM參數(shù)傳遞給broker
# 編輯 kafka-run-class.sh
vim /opt/kafka_2.13-2.6.0/bin/kafka-run-class.sh
# 更改第219行
export KAFKA_OPTS="-Djava.security.auth.login.config=/opt/kafka_2.13-2.6.0/config/kafka_server_jaas.conf"
# 分發(fā)腳本
scp kafka-run-class.sh root@kafka2-73085:/opt/kafka_2.13-2.6.0/bin/kafka-run-class.sh
scp kafka-run-class.sh root@kafka2-73085:/opt/kafka_2.13-2.6.0/bin/kafka-run-class.sh
啟動kafka集群
kafka-server-start.sh -daemon /opt/kafka_2.13-2.6.0/config/server.properties
這個時候集群啟動完畢已經(jīng)帶有權(quán)限
客戶端連接
查看topic列表
kafka-topics.sh --bootstrap-server kafka1-73085:9092 --list
遲遲不出結(jié)果,卡住了,實際上是沒有權(quán)限
查看日志如下:
配置權(quán)限信息
# 編輯權(quán)限文件
vim /root/auth.conf
# 輸入如下內(nèi)容
security.protocol=SASL_PLAINTEXT
sasl.mechanism=PLAIN
sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="tly" password="123456";
username和password必須是kafka_server_jaas.conf中配置的。
使用帶賬號密碼配置文件連接
kafka-topics.sh --bootstrap-server kafka1-73085:9092 --list --command-config /root/auth.conf
已經(jīng)可以正常返回了,說明有權(quán)限認證通過了:
創(chuàng)建topic
kafka-topics.sh --bootstrap-server kafka1-73085:9092 --create --topic topic_1 --partitions 3 --replication-factor 3 --command-config /root/auth.conf
生產(chǎn)消息
kafka-console-producer.sh --bootstrap-server \
kafka1-73085:9092 --topic topic_1 --producer.config /root/auth.conf
消費消息
kafka-console-consumer.sh --bootstrap-server kafka1-73085:9092 \
--topic topic_1 --consumer.config /root/auth.conf
權(quán)限配置
# 修改server.properties 增加如下配置
# 指定通過ACL來控制權(quán)限
authorizer.class.name=kafka.security.authorizer.AclAuthorizer
# 指定超級管理員
super.users=User:admin
使用權(quán)限配置并且超級用戶是admin,這個用戶和我們上面配置的列表中的admin用戶相互映射,每個機器都需要配置然后重啟所有節(jié)點
# 配置用戶認證文件信息
vim /root/admin.conf
# 輸入如下內(nèi)容
security.protocol=SASL_PLAINTEXT
sasl.mechanism=PLAIN
sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="admin" password="123456";
# 重啟所有節(jié)點,每個節(jié)點都要執(zhí)行
# 停止節(jié)點
kafka-server-stop.sh
# 啟動節(jié)點
kafka-server-start.sh -daemon /opt/kafka_2.13-2.6.0/config/server.properties
此時每個節(jié)點都有了權(quán)限認證
# 配置用戶認證文件
vim /root/admin.conf
# 輸入以下內(nèi)容
security.protocol=SASL_PLAINTEXT
sasl.mechanism=PLAIN
sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="admin" password="123456";
創(chuàng)建topic
這個時候使用auth.conf已經(jīng)不能創(chuàng)建topic了,使用admin.conf可以創(chuàng)建,因為admin賬號和配置的超級管理員一致;而auth.conf配置的是tly賬號;
kafka-topics.sh --bootstrap-server kafka1-73085:9092 --create --topic topic_2 --partitions 3 --replication-factor 3 --command-conf /root/auth.conf
不使用認證創(chuàng)建會一直卡主不動,其實也是沒權(quán)限的,時間久了就會報timeout異常
kafka-topics.sh --bootstrap-server kafka1-73085:9092 --create --topic topic_3 --partitions 3 --replication-factor 3
kafka-acls控制權(quán)限
命令為:kafka-acls.sh
參數(shù)如下:
- –add 增加權(quán)限 --remove 刪除權(quán)限
- –allow-host 允許操作的主機 --deny-host 拒絕的主機
- –allow-principal 允許操作的用戶 --deny-principal 拒絕用戶
- –bootstrap-server 集群地址
- –command-config 認證文件信息
- –group 可以消費topic的消費者組
- –list 查詢所有權(quán)限
- –operation 增加操作權(quán)限
- describe
- describeConfigs
- alter
- read
- delete
- create
- all
- write
- alterconfig
- –topic 指定topic
查詢topic所有權(quán)限
kafka-acls.sh --bootstrap-server kafka1-73085:9092 --list --command-config /root/admin.conf
刪除所有權(quán)限
kafka-acls.sh --bootstrap-server kafka1-73085:9092 --topic topic_1 --remove --command-config /root/admin.conf
給用戶增加權(quán)限
給之前的用戶tly授權(quán)文章來源:http://www.zghlxwxcb.cn/news/detail-812747.html
kafka-acls.sh --bootstrap-server kafka1-73085:9092 --add --allow-principal User:tly --topic topic_1 --operation all --command-config /root/admin.conf
使用tly用戶查看當前topic文章來源地址http://www.zghlxwxcb.cn/news/detail-812747.html
kafka-topics.sh --bootstrap-server kafka1-73085:9092 --list --command-config /root/auth.conf
回收權(quán)限
kafka-acls.sh --bootstrap-server kafka1-73085:9092 --remove --allow-principal user:tly --topic topic_1 --operation all --command-config /root/admin.conf
增加權(quán)限并且增加IP限制
kafka-acls.sh --bootstrap-server kafka1-73085:9092 --add --deny-principal User:tly --topic topic_1 --operation all --deny-host 127.0.0.1 --command-config admin.conf
生產(chǎn)者和消費者的權(quán)限設(shè)置
# 刪除所有權(quán)限信息
kafka-acls.sh --bootstrap-server kafka1-73085:9092 --topic topic_1 --remove --command-config /root/admin.conf
# 添加生產(chǎn)者權(quán)限
kafka-acls.sh --bootstrap-server kafka1-73085:9092 --add --allow-principal User:tly --operation Write --topic topic_1 --command-config /root/admin.conf
# 添加消費權(quán)限
kafka-acls.sh --bootstrap-server kafka1-73085:9092 --add --allow-principal User:tly --operation Read --topic topic_1 --command-config /root/admin.conf
# 消費消息
kafka-console-consumer.sh --bootstrap-server kafka1-73085:9092 --topic topic_1 --from-beginning --consumer.config /root/auth.conf
# 發(fā)現(xiàn)消費不到,原因是消費者組沒有權(quán)限
# 增加消費者組權(quán)限
kafka-acls.sh --bootstrap-server kafka1-73085:9092 --add --allow-principal User:tly --operation Read --topic topic_1 --group group_1 --command-config /root/admin.conf
# 再次執(zhí)行消費消息命令并增加分組信息即可以消費到數(shù)據(jù)
kafka-console-consumer.sh --bootstrap-server kafka1-73085:9092 --topic topic_1 --from-beginning --consumer.config /root/auth.conf --group group_1
到了這里,關(guān)于Kafka安全認證機制詳解之SASL_PLAIN的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!