Kafka开启SASL安全认证以及配置ACL权限控制

  • 2022-10-27
  • 浏览 (2523)

本篇介绍kafka配置安全认证SASL以及ACL权限控制,并使用控制台和python访问开启了SASL认证的kafka集群。

开启SASL

在 wyk01 & wyk02 & wyk03 机器上执行下面的步骤:

(1)、配置kafka软连接和环境变量 :

# 创建软连接
ln -s -f /opt/app/kafka_2.12-2.6.0 /opt/app/kafka

# 配置环境变量
vim /etc/profile
# 添加下面的内容
export KAFKA_HOME=/opt/app/kafka

# 刷新环境变量
source /etc/profile

(2)、将kafka集群服务关闭:

$KAFKA_HOME/bin/kafka-server-stop.sh

(3)、修改kafka的server.properties 配置文件添加SASL认证,修改listeners中的ip为对应机器的:

cd $KAFKA_HOME/config
vim server.properties
# 添加下面的内容
#--------------------------------------------------
# 配置ACL入口类
authorizer.class.name=kafka.security.auth.SimpleAclAuthorizer

# SASL_PLAINTEXT
#这里的listener中的wyk01 在三台机器上换成每台机器对应的hostname/ip
listeners=SASL_PLAINTEXT://wyk01:9092
security.inter.broker.protocol= SASL_PLAINTEXT
sasl.mechanism.inter.broker.protocol=PLAIN
sasl.enabled.mechanisms=PLAIN

# 设置admin超级用户
super.users=User:admin

#设置为true,ACL机制为黑名单机制,只有黑名单中的用户无法访问
#默认为false,ACL机制为白名单机制,只有白名单中的用户可以访问
allow.everyone.if.no.acl.found=false
#--------------------------------------------------

(4)、新增 kafka_server_jaas.conf 配置文件添加用户,注意最后的两个分号。

前三行是配置管理员账户(该账户与上面server.properties中配置的super.users一样),后面的user_wyk_reader=“wyk_reader_pwd”表示添加一个用户名为wyk_reader对应的密码为wyk_reader_pwd。即 _user_用户名=“该用户的密码”_。之后配置ACL的时候需要用到这里配置的用户。

vim kafka_server_jaas.conf
#添加下面的内容
#--------------------------------------------------
KafkaServer { org.apache.kafka.common.security.plain.PlainLoginModule required
     username="admin"
     password="admin"
     user_admin="admin"
     user_wyk_reader="wyk_reader_pwd"
     user_wyk_writer="wyk_writer_pwd"
     user_no_acl="no_acl_pwd";
     };

(5)、修改kafka-server-start.sh文件,将刚刚配置的用户列表添加到kafka启动脚本内:

vim ../bin/kafka-server-start.sh
#修改最后一行,改成下面的内容
#-------------------------------------------
#exec $base_dir/kafka-run-class.sh $EXTRA_ARGS kafka.Kafka "$@"
source /etc/profile
exec $base_dir/kafka-run-class.sh $EXTRA_ARGS -Djava.security.auth.login.config=$KAFKA_HOME/config/kafka_server_jaas.conf  kafka.Kafka "$@"

至此,kafka集群已完成了开启SASL安全认证并添加了四个用户admin、wyk_writer、wyk_reader 、no_acl。

(6)、重启kafka集群

$KAFKA_HOME/bin/kafka-server-start.sh -daemon $KAFKA_HOME/config/server.properties

控制台客户端配置认证文件

集群虽然开启了SASL认证,接下来我们可以在控制台使用consumer和producer命令行测试是否有权限,这个是客户端级别的测试,因此只需要随便找个kafka客户端就可以用,不需要在每台kafka broker机器上修改。如果不想要在控制台测试可以跳过直接看后面的对比以及python客户端访问。

要在控制台使用命令行需要先配置sasl用户,步骤如下:

生产者:

(1)、新增配置文件wyk_writer_jaas.conf,这里的用户名密码必须和服务器端配置的一样,我们的客户端是拿着这个认证信息去和kafka 的服务端做校验,如果不匹配就等同于登录失败。

vim wyk_writer_jaas.conf
#添加下面的内容
#-------------------------------
KafkaClient { org.apache.kafka.common.security.plain.PlainLoginModule required
     username="wyk_writer"
     password="wyk_writer_pwd";
     };

(2)、修改生产者启动脚本,在启动生产者客户端时会去加载该认证文件。

vim ../bin/kafka-console-producer.sh
#修改最后一行,改成下面的内容
#-------------------------------------------
#exec $(dirname $0)/kafka-run-class.sh  kafka.tools.ConsoleProducer "$@"
source /etc/profile
exec $(dirname $0)/kafka-run-class.sh -Djava.security.auth.login.config=$KAFKA_HOME/config/wyk_writer_jaas.conf  kafka.tools.ConsoleProducer "$@"

(3)、修改 producer.properties 添加SASL认证。

vim producer.properties
#添加下面的内容
#-------------------------------------------
security.protocol=SASL_PLAINTEXT
sasl.mechanism=PLAIN

消费者:

(1)、新增配置文件wyk_reader_jaas.conf,这里的用户名密码必须和服务器端配置的一样,我们的客户端是拿着这个认证信息去和kafka 的服务端做校验,如果不匹配就等同于登录失败。

vim wyk_reader_jaas.conf
#添加下面的内容
#-------------------------------
KafkaClient {
        org.apache.kafka.common.security.plain.PlainLoginModule required
        username="wyk_reader"
        password="wyk_reader_pwd";
};

(2)、修改消费者启动脚本,在启动消费者客户端时会去加载该认证文件。

vim ../bin/kafka-console-consumer.sh
#修改最后一行,改成下面的内容
#-------------------------------------------
#exec $(dirname $0)/kafka-run-class.sh kafka.tools.ConsoleConsumer "$@"
source /etc/profile
exec $(dirname $0)/kafka-run-class.sh -Djava.security.auth.login.config=$KAFKA_HOME/config/wyk_reader_jaas.conf   kafka.tools.ConsoleConsumer "$@"

(3)、修改 consumer.properties 添加SASL认证。需注意,这个配置文件中有一个消费者组 group.id=test-consumer-group, 待会在给控制台客户端授权消费者权限时还需要指定这个消费者组。

vim consumer.properties
#添加下面的内容
#-------------------------------------------
security.protocol=SASL_PLAINTEXT
sasl.mechanism=PLAIN

ACL授权及验证

我们已经开启了SASL,并给控制台客户端配置了生产者和消费者的认证文件,下面我们来测试授权之后和未授权用户的区别。

为了起到对比效果,我们先新增一个认证文件用户为no_acl:

(1)、新增配置文件no_acl_jaas.conf

vim no_acl_jaas.conf
#添加下面的内容
#-------------------------------
KafkaClient {
        org.apache.kafka.common.security.plain.PlainLoginModule required
        username="no_acl"
        password="no_acl_pwd";
};

(2)、使用下面的命令行授权用户 wyk_reader 对主题csdn01 的读权限,授权用户 wyk_writer 对主题csdn01 的写权限,no_acl用户不设置任何权限用做对比。

# 给用户wyk_writer 添加csdn01主题的 生产者权限
bin/kafka-acls.sh --authorizer kafka.security.auth.SimpleAclAuthorizer --authorizer-properties zookeeper.connect=wyk01:2181,wyk02:2181,wyk03:2181 --add --allow-principal User:wyk_writer --operation Write --topic csdn01

# 给用户wyk_reader 添加csdn01主题的 消费者权限
#需要注意这里消费者还需要给消费者组配置权限,消费者组名称要和consumer.properties中配置的group.id一致
bin/kafka-acls.sh --authorizer kafka.security.auth.SimpleAclAuthorizer --authorizer-properties zookeeper.connect=wyk01:2181,wyk02:2181,wyk03:2181 --add --allow-principal User:wyk_reader --operation Read --topic csdn01 --group test-consumer-group

(3)、验证ACL权限:

(3.1)、当使用no_acl用户作为生产者时可以看到启动时会报错:Not authorized to access topics:[csdn01]。而使用拥有csdn01主题的生产者权限的用户wyk_writer启动时可以正常的使用:

(3.2)、 当使用no_acl用户作为消费者时可以看到启动时会报错:Not authorized to access topics:[csdn01]。而使用拥有csdn01主题的消费者权限的用户wyk_reader启动时可以正常的消费数据:

(3.3)、将生产者的sasl认证文件里的密码 改为错误密码后,启动时会报错invalid username or password:

Python客户端访问

接下来我们用python客户端访问开启了sasl认证的kafka,首先我们在kafka_server_jaas.conf 配置文件中添加一个用户python_wyk (需要重启kafka集群),并授权对主题csdn01的读写权限用作python客户端的测试:

生产者脚本

from kafka import KafkaProducer
import json
producer = KafkaProducer(bootstrap_servers=['wyk01:9092','wyk02:9092','wyk03:9092'],
                         security_protocol="SASL_PLAINTEXT",
                         sasl_mechanism="PLAIN",
                         sasl_plain_username="python_wyk",
                         sasl_plain_password="python_wyk_pwd"
)

producer.send('csdn01', json.dumps({"id":"1","name":"wyk1","company":"csdn1"}).encode('utf-8'))
producer.send('csdn01', json.dumps({"id":"2","name":"wyk2","company":"csdn2"}).encode('utf-8'))
producer.send('csdn01', json.dumps({"id":"3","name":"wyk3","company":"csdn3"}).encode('utf-8'))
producer.flush()

消费者脚本:

from kafka import KafkaConsumer
from kafka.structs import TopicPartition
import json

consumer = KafkaConsumer('csdn01',
                         bootstrap_servers=['wyk01:9092','wyk02:9092','wyk03:9092']
                         ,group_id='test-consumer-group'
                         ,auto_offset_reset='latest'
                         ,enable_auto_commit=False
                         ,security_protocol="SASL_PLAINTEXT"
                         ,sasl_mechanism="PLAIN"
                         ,sasl_plain_username="python_wyk"
                         ,sasl_plain_password="python_wyk_pwd"
)
for msg in consumer:
     print(msg)

ACL常用命令

查看权限列表:

#查看所有权限列表
bin/kafka-acls.sh --authorizer-properties zookeeper.connect=wyk01:2181 --list

#查看指定topic的权限列表
bin/kafka-acls.sh --authorizer-properties zookeeper.connect=wyk01:2181 --list --topic csdn01

添加读写权限:

# 给用户wyk_writer 添加csdn01主题的 生产者权限
bin/kafka-acls.sh --authorizer kafka.security.auth.SimpleAclAuthorizer --authorizer-properties zookeeper.connect=wyk01:2181,wyk02:2181,wyk03:2181 --add --allow-principal User:wyk_writer --operation Write --topic csdn01

# 给用户wyk_reader 添加csdn01主题的 消费者权限
#需要注意这里消费者还需要给消费者组配置权限,消费者组名称要和consumer.properties中配置的group.id一致
bin/kafka-acls.sh --authorizer kafka.security.auth.SimpleAclAuthorizer --authorizer-properties zookeeper.connect=wyk01:2181,wyk02:2181,wyk03:2181 --add --allow-principal User:wyk_reader --operation Read --topic csdn01 --group test-consumer-group

移除权限:

#移除用户wyk_all 对csdn01的读写权限
bin/kafka-acls.sh --authorizer-properties zookeeper.connect=wyk01:2181 --remove --allow-principal User:wyk_all --operation Read --operation Write --topic csdn01

添加黑名单:

# 禁止来自ip:192.168.145.100的用户 wyk_no对csdn01的消费权限,允许其他所有用户的消费权限
bin/kafka-acls.sh --authorizer-properties zookeeper.connect=wyk01:2181 --add --allow-principal User:* --allow-host * --deny-principal User:wyk_no --deny-host 192.168.145.100 --operation Read --topic csdn01

添加白名单:

#添加用户wyk_yes在ip192.168.145.100 对csdn01的读写权限
bin/kafka-acls.sh --authorizer-properties zookeeper.connect=wyk01:2181 --add --allow-principal User:wyk_yes --allow-host 192.168.145.100 --operation Read --operation Write --topic csdn01

转自:https://blog.csdn.net/wsdc0521/article/details/108618997

0  赞