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