版本說明
操作系統版本:CentOS Linux release 7.4.1708 (Core)
Kafak版本:kafka_2.12-2.0.1.tgz
Zookeeper:Kafka內置(3.4.13)echo stat|nc localhost 2181
建議小夥伴們先採用與本文一致的Kafka版本先行測試配置,然後再根據自己的情況進行調整,本人因爲版本問題遇到的坑太多了,o(╥﹏╥)o!!!
Zookeeper配置
首先進如kafka根目錄
說明:本文使用的Zookeeper爲Kafka內置版本。
1、config/zookeeper.properties
修改config/zookeeper.properties,增加配置參數:
#增加SASL授權提供類
authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
#增加客戶端授權scheme,可以使用類似ACL命令:setAcl /test sasl:admin:cdrwa。
requireClientAuthScheme=sasl
#授權登錄時限
jaasLoginRenew=3600000
#支持客戶端sasl操作
zookeeper.sasl.client=true
2、config/zookeeper-jaas.properties
新增文件config/zookeeper-jaas.properties,針對Kfaka、Zookeeper兩種中間件分別增加SASL。你可以只在Zookeeper上使用SASL、而不針對Kafka使用。但是如果你要在Kafka使用,那麼Zookeeper也必須開啓,因爲Kafka的數據就是存儲在Zookeeper上的。當然需求在現場環境下基本不存在的,我們肯定是希望所有的中間件都能得到很好的防護。
JAAS
Java認證和授權服務(Java Authentication Authorization Service,JAAS)提供了靈活和可伸縮的機制來保證客戶端或服務器端認證和授權的Java程序。Java早期的安全框架強調的是通過驗證代碼的來源和作者,保護用戶避免受到下載下來的代碼的攻擊。JAAS強調的是通過驗證誰在運行代碼以及他/她的權限來保護系統免受用戶的攻擊。
那麼此處就可以把SASL理解爲接口、JAAS理解爲實現。
PLAIN
PLAINTEXT,即加密方式純文本,即便是配置了用戶名密碼,但是這些密碼都是明文配置的,在現網環境下,此種方方式也不是足夠安全的。但是在Zookeeper 使用了ACL進行權限配置以後Kafka連接不上了,這個搞了好幾天踩了各種坑。
Zookeeper ACL scheme默認提供4重分別是:world、auth、degest、host和ip,如果使用world、host和ip均能在Kafka不做任何配置修改的情況下進行操作使用,但是使用auth和degest確不行,目前我也沒找到在Zookeeper ACL使用auth和degest這兩種scheme情況下配合Kfaka使用,這時我們採用新的sasl配置方式。
所以,直接使用Zookeeper的默認配置是無法和Kafka配套使用的,請小夥伴們注意。
名詞解釋
SASL
簡單認證和安全層(Simple Authentication and Security Layer,SASL)是網絡協議中使用的認證層。SASL並不是一種協議,只是提供給應用和共享庫的開發者一種認證、數據完整性校驗和加密的機制的框架。儘管說不是一種協議,但是當做協議或者規範可能更好的理解。
Kafka配置SASL,實際上
3、bin/zookeeper-server-start.sh
修改bin/zookeeper-server-start.sh,在文件最後一行之前增加配置文件。
該參數是將配置文件增加到系統變量中,JAAS在認證時會讀取該配置文件獲取認證授權。
export KAFKA_OPTS="-Djava.security.auth.login.config=/slview/ipran-kafka/config/zookeeper-jaas.conf"
exec $base_dir/kafka-run-class.sh $EXTRA_ARGS org.apache.zookeeper.server.quorum.QuorumPeerMain "$@"
4、重啓Zookeeper
bin/zookeeper-server-start.sh config/zookeeper.properties
Kafka配置
首先進如kafka根目錄
1、config/server.properties
listeners=SASL_PLAINTEXT://:9092
security.inter.broker.protocol=SASL_PLAINTEXT
sasl.enabled.mechanisms=PLAIN
sasl.mechanism.inter.broker.protocol=PLAIN
zookeeper.set.acl=true
authorizer.class.name=kafka.security.auth.SimpleAclAuthorizer
allow.everyone.if.no.acl.found=true
2、config/kafka-server-jaas.conf
新增文件config/kafka-server-jaas.conf,使用時請將註釋去掉,該註釋是撰寫本文時讓小夥伴們更好的理解,沒有針對加註釋做過校驗。
#KafkaServer選項主要提供給Kafka服務器端使用,告訴Kafka我要添加一些用戶。
KafkaServer {
org.apache.kafka.common.security.plain.PlainLoginModule required
username="admin"
password="admin@123"
user_admin="admin@123";
};
#Client選項主要提供給連接Zookeeper使用,比如Kafka broker就需要連接Zookeeper,及topic直接連接Zookeeper的命令查看Kafka 主題信息。
Client {
org.apache.kafka.common.security.plain.PlainLoginModule required
username="admin"
password="admin@123";
};
3、/bin/kafka-server-start.sh,
修改bin/kafka-server-start.sh,在文件最後一行之前增加配置文件
該參數是將配置文件增加到系統變量中,JAAS在認證時會讀取該配置文件獲取認證授權。
export KAFKA_OPTS="-Djava.security.auth.login.config=/slview/ipran-kafka/config/kafka-server-jaas.conf"
exec $base_dir/kafka-run-class.sh $EXTRA_ARGS kafka.Kafka "$@"
4、重啓Kafka
bin/kafka-server-start.sh config/server.properties
客戶端配置
在完成上文配置,Kafka、Zookeeper已經支持SASL ACL的認證授權。但是現在他們都增加了認證授權,我們怎麼使用topic、producer、consumer呢?接着看
1、增加Kafka客戶端配置文件
新增文件config/kafka-client-jaas.conf,使用時請將註釋去掉,該註釋是撰寫本文時讓小夥伴們更好的理解,沒有針對加註釋做過校驗。
#KafkaClient選項主要給需要連接Kafka的客戶端認證使用,比如producer/consumer
KafkaClient {
org.apache.kafka.common.security.plain.PlainLoginModule required
username="admin"
password="admin@123";
};
2、修改Kafka客戶端配置文件
config/producer.properties和config/consumer.properties文件尾部增加:
security.protocol: SASL_PLAINTEXT
sasl.mechanism: PLAIN
3、修改Kafka客戶端命令腳本
bin/kafka-console-producer.sh和bin/kafka-console-consumer.sh最後一行之前增加:
export KAFKA_OPTS="-Djava.security.auth.login.config=/slview/ipran-kafka/config/kafka-client-jaas.conf"
4、增加Zookeeper客戶端配置文件
新增文件config/zookeeper-cli ťnt-jaas.conf,使用時請將註釋去掉,該註釋是撰寫本文時讓小夥伴們更好的理解,沒有針對加註釋做過校驗。
此文件和上文中的kafka-server-jaas.conf部分內容一致。此處單獨拿出來專門給只需要連接Zookeeper的命令腳本使用。
#Client選項主要提供給連接Zookeeper使用,比如Kafka broker就需要連接Zookeeper,及topic直接連接Zookeeper的命令查看Kafka 主題信息。
Client {
org.apache.kafka.common.security.plain.PlainLoginModule required
username="admin"
password="admin@123";
};
5、修改Zookeeper客戶端命令腳本
bin/kafka-topics.sh和zookeeper-shell.sh最後一行之前增加:
export KAFKA_OPTS="-Djava.security.auth.login.config=/slview/ipran-kafka/config/zookeeper-client-jaas.conf"
6、客戶端操作演示
增加主題:
bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test
查看一下主題權限:
getAcl /config/topics/test
'world,'anyone
: r
'sasl,'admin
: cdrwa
可以看到現在test已經具有了sasl:admin:cdrwa權限。
再看一下生產者和消費者:
bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test --producer.config config/producer.properties
>aaaaaa
>bbbbbbb
>
bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning --consumer.config config/consumer.properties
aaaaaa
bbbbbbb
Spring Boot 連接Kafka
application.yml配置文件新增
spring:
kafka:
bootstrap-servers: localhost:9092
client-id: zhuyuan
properties:
security.protocol: SASL_PLAINTEXT
sasl.mechanism: PLAIN
Appication啓動文件增加靜態語句,初始化新增參數:
@SpringBootApplication
@ServletComponentScan
@RestController
public class Application {
static {
System.setProperty("java.security.auth.login.config", "E:\\Workspaces\\zhuyuan\\spring-boot-demo\\src\\main\\resources\\kafka-client-sasl.conf");
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
Kafka常見錯誤彙總
java.lang.SecurityException: zookeeper.set.acl is true, but the verification of the JAAS login file failed
- Kafka啓動是沒有配置JAAS登錄文件,即
java.security.auth.login.config
參數沒有設置。 - 配置文件沒有正確配置參數值,沒有找到能夠使用的Client來獲取用戶名密碼信息進行登陸。
org.apache.zookeeper.KeeperException$NoAuthException: KeeperErrorCode = NoAuth for /brokers/ids
- 腳本命令沒有配置JAAS登錄文件,即
java.security.auth.login.config
參數沒有設置。 - 用戶密碼沒有配置或者不正確。
[Producer clientId=console-producer] Bootstrap broker 192.168.130.252:9092 (id: -1 rack: null) disconnected (org.apache.kafka.clients.NetworkClient)
- config/consumer.properties沒有修改或者執行沒有增 ȥŠ 配置文件參數–producer-config,詳見**#客戶端操作演示**
[Producer clientId=console-producer] Error while fetching metadata with correlation id 1 : {test=LEADER_NOT_AVAILABLE} (org.apache.kafka.clients.NetworkClient)
- 沒有正確連接到Kafka,檢查參數是否正確,詳見**#客戶端操作演示**
[Producer clientId=console-producer] Error while fetching metadata with correlation id 1 : {test=TOPIC_AUTHORIZATION_FAILED} (org.apache.kafka.clients.NetworkClient)
- Zookeeper存在非當前用戶ACL授權
- allow.everyone.if.no.acl.found=true參數沒有正確設置
org.apache.kafka.clients.NetworkClient -[Producer clientId=producer-1] Connection to node 0 could not be established. Broker may not be available.
- 沒有正確使用IP,config/server.properties listeners=SASL_PLAINTEXT://:9092 在上文實例中沒有指定完整的IP,那麼默認在單機情況下,可以通過localhost和本機IP都可以連接上Kafka,但是如果遠程連接就不可以了,而是報 ɦœ¬例的錯誤,此刻需要在配置中增加本機IP:listeners=SASL_PLAINTEXT://192.168.1.10:9092
- 如果指定了IP,那麼localhost將不再可用。