Kafka配置SASL/PLAIN ACL

版本說明

操作系統版本: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將不再可用。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章