前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Kafka SCRAM和PLAIN实战

Kafka SCRAM和PLAIN实战

作者头像
Spark学习技巧
发布2020-12-28 10:02:02
2K0
发布2020-12-28 10:02:02
举报
文章被收录于专栏:Spark学习技巧

目前Kafka ACL支持多种权限认证,今天笔者给大家介绍一下SCRAM和PLAIN的权限认证。验证环境如下:

  • JDK: 1.8
  • Kafka: 2.3.0
  • Kafka Eagle: 1.3.8

2.1 PLAIN认证

首先,在$KAFAK_HOME/config目录新建一个文本文件,名为kafka_server_plain_jaas.conf,配置内容如下:

代码语言:javascript
复制
KafkaServer {
   org.apache.kafka.common.security.plain.PlainLoginModule required
   username="admin"
   password="admin-secret"
   user_admin="admin-secret"
   user_ke="ke";
};

接着,将脚本文件kafka-server-start.sh重命名为kafka-server-plain-start.sh,并修改最后一行的内容为:

代码语言:javascript
复制
# 添加鉴权文件
代码语言:javascript
复制
exec $base_dir/kafka-run-class.sh $EXTRA_ARGS -Djava.security.auth.login.config=$base_dir/../config/kafka_server_plain_jaas.conf  kafka.Kafka "$@"

然后,复制server.properties文件并重命名为plain.properties,接着修改服务端配置文件plain.properties,内容如下:

代码语言:javascript
复制
# Protocol
listeners=SASL_PLAINTEXT://127.0.0.1:9092
security.inter.broker.protocol=SASL_PLAINTEXT
sasl.mechanism.inter.broker.protocol=PLAIN
sasl.enabled.mechanisms=PLAIN

# ACL
allow.everyone.if.no.acl.found=false
super.users=User:admin
authorizer.class.name=kafka.security.auth.SimpleAclAuthorizer

最后,创建客户端用户认证文件,kafka_client_plain_jaas.conf内容如下:

代码语言:javascript
复制
KafkaClient {
  org.apache.kafka.common.security.plain.PlainLoginModule required
  username="ke"
  password="ke";
};

2.2 启动PLAIN认证集群

2.2.1 启动Zookeeper

代码语言:javascript
复制
# Zookeeper的配置比较简单,这里不多做介绍
代码语言:javascript
复制
zkServer.sh start

2.2.2 启动Kafka集群

代码语言:javascript
复制
# 进入到Kafka安装bin目录
代码语言:javascript
复制
./kafka-server-plain-start.sh ../config/plain.properties &

2.2.3 创建Topic

代码语言:javascript
复制
./kafka-topics.sh --create --zookeeper 127.0.0.1:2181/plain --replication-factor 1 --partitions 3 --topic test_plain

2.2.4 添加读写权限

代码语言:javascript
复制
# 添加读权限
./kafka-acls.sh --authorizer kafka.security.auth.SimpleAclAuthorizer --authorizer-properties zookeeper.connect=127.0.0.1:2181/plain --add --allow-principal User:ke --operation Read --topic test_plain 
# 添加写权限
./kafka-acls.sh --authorizer kafka.security.auth.SimpleAclAuthorizer --authorizer-properties zookeeper.connect=127.0.0.1:2181/plain --add --allow-principal User:ke --operation Write --topic test_plain
# 添加消费者组权限
./kafka-acls.sh --authorizer kafka.security.auth.SimpleAclAuthorizer --authorizer-properties zookeeper.connect=127.0.0.1:2181/plain --add --allow-principal User:ke --operation Read --group g_plain_test
# 查看权限列表
./kafka-acls.sh --authorizer kafka.security.auth.SimpleAclAuthorizer --authorizer-properties zookeeper.connect=127.0.0.1:2181/plain --list

2.2.5 执行结果

2.3 SCRAM认证

PLAIN认证有个问题,就是不能动态新增用户,每次添加用户后,需要重启正在运行的Kafka集群才能生效。为此,在生产环境,这种认证方式不符合实际业务场景。而SCRAM不一样,使用SCRAM认证,可以动态新增用户,添加用户后,可以不用重启正在运行的Kafka集群即可进行鉴权。

新增kafka_server_scram_jaas.conf,配置内容如下:

代码语言:javascript
复制

KafkaServer {
  org.apache.kafka.common.security.scram.ScramLoginModule required
  username="admin"
  password="admin-secret";
};

接着,将脚本文件kafka-server-start.sh重命名为kafka-server-scram-start.sh,并修改最后一行的内容为:

代码语言:javascript
复制
# 添加鉴权文件
代码语言:javascript
复制
exec $base_dir/kafka-run-class.sh $EXTRA_ARGS -Djava.security.auth.login.config=$base_dir/../config/kafka_server_scram_jaas.conf  kafka.Kafka "$@"

然后在$KAFKA_HOME/config目录中,复制server.properties文件并重命名为scram.properties,接着修改服务端配置文件scram.properties,内容如下:

代码语言:javascript
复制
# Protocol
listeners=SASL_PLAINTEXT://dn1:9092
security.inter.broker.protocol=SASL_PLAINTEXT
sasl.mechanism.inter.broker.protocol=SCRAM-SHA-256
sasl.enabled.mechanisms=SCRAM-SHA-256

# ACL
allow.everyone.if.no.acl.found=false
super.users=User:admin
authorizer.class.name=kafka.security.auth.SimpleAclAuthorizer

2.3.1 启动Zookeeper

代码语言:javascript
复制
# Zookeeper的配置比较简单,这里不多做介绍
代码语言:javascript
复制
zkServer.sh start

2.3.2 添加管理员权限和普通用户

代码语言:javascript
复制
# 添加管理员
代码语言:javascript
复制
./kafka-configs.sh --zookeeper 127.0.0.1:2181/scram --alter --add-config 'SCRAM-SHA-256=[password=admin-secret],SCRAM-SHA-512=[password=admin-secret]' --entity-type users --entity-name admin
代码语言:javascript
复制
# 添加普通用户(ke)
代码语言:javascript
复制
./kafka-configs.sh --zookeeper 127.0.0.1:2181/scram --alter --add-config 'SCRAM-SHA-256=[iterations=8192,password=ke],SCRAM-SHA-512=[password=ke]' --entity-type users --entity-name ke

2.3.3 启动SCRAM认证集群

代码语言:javascript
复制
./kafka-server-scram-start.sh ../config/scram.properties &

2.3.4 创建Topic

代码语言:javascript
复制
./kafka-topics.sh --create --zookeeper 127.0.0.1:2181/scram --replication-factor 1 --partitions 3 --topic test_scram

2.3.5 添加权限

代码语言:javascript
复制
# 添加读权限
代码语言:javascript
复制
./kafka-acls.sh --authorizer kafka.security.auth.SimpleAclAuthorizer --authorizer-properties zookeeper.connect=127.0.0.1:2181/scram --add --allow-principal User:ke --operation Read --topic test_scram
代码语言:javascript
复制
# 添加写权限
代码语言:javascript
复制
./kafka-acls.sh --authorizer kafka.security.auth.SimpleAclAuthorizer --authorizer-properties zookeeper.connect=127.0.0.1:2181/scram --add --allow-principal User:ke --operation Write --topic test_scram
代码语言:javascript
复制
# 添加消费者组权限
代码语言:javascript
复制
./kafka-acls.sh --authorizer kafka.security.auth.SimpleAclAuthorizer --authorizer-properties zookeeper.connect=127.0.0.1:2181/scram --add --allow-principal User:ke --operation Read --group g_scram_test
代码语言:javascript
复制
# 查看权限列表
代码语言:javascript
复制
./kafka-acls.sh --authorizer kafka.security.auth.SimpleAclAuthorizer --authorizer-properties zookeeper.connect=127.0.0.1:2181/scram --list

2.3.6 执行结果

Kafka权限级别包含Topic、Group、Cluster、TransactionalId,每个维度涉及的权限内容如下:

Resource

Operations

Topic

Read,Write,Describe,Delete,DescribeConfigs,AlterConfigs,All

Group

Read,Describe,All

Cluster

Create,ClusterAction,DescribeConfigs,AlterConfigs,IdempotentWrite,Alter,Describe,All

TransactionalId

Describe,Write,All

例如,统计Topic的Capacity大小时,如果抛出异常“Cluster authorization failed”,这是由于没有开启Cluster级别的Describe权限,执行如下命令即可:

代码语言:javascript
复制
./kafka-acls.sh --authorizer kafka.security.auth.SimpleAclAuthorizer --authorizer-properties zookeeper.connect=127.0.0.1:2181/scram --add --allow-principal User:ke --operation Describe --cluster

那么如何使用Kafka Eagle来集成有SCRAM认证的Kafka集群,进行监控呢?访问http://www.kafka-eagle.org/,下载安装包,解压并配置如下内容:

代码语言:javascript
复制
# 这里对启动一个拥有SCRAM认证的Kafka集群(别名为cluster1)进行配置
cluster1.kafka.eagle.sasl.enable=true
cluster1.kafka.eagle.sasl.protocol=SASL_PLAINTEXT
cluster1.kafka.eagle.sasl.mechanism=SCRAM-SHA-256
cluster1.kafka.eagle.sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required username="ke" password="ke";
# 这里ClientId如果不需要,可以不用配置
cluster1.kafka.eagle.sasl.client.id=

然后,执行ke.sh start进行启动Kafka Eagle监控系统。

4.1 Topic预览

4.2 使用KSQL查询Topic

执行如下SQL语句,代码如下:

代码语言:javascript
复制
select * from "test_scram" where "partition" in (0) limit 1

执行结果如下:

生产环境中,用户可能随着业务需要,增加或者删除,此时动态控制用户时很有必要的。而且,生产环境Kafka集群不可能随随便便重启,因此采用SCRAM来进行Kafka鉴权非常适合。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-12-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 浪尖聊大数据 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 2.1 PLAIN认证
  • 2.2 启动PLAIN认证集群
    • 2.2.1 启动Zookeeper
      • 2.2.2 启动Kafka集群
        • 2.2.3 创建Topic
          • 2.2.4 添加读写权限
            • 2.2.5 执行结果
            • 2.3 SCRAM认证
              • 2.3.1 启动Zookeeper
                • 2.3.2 添加管理员权限和普通用户
                  • 2.3.3 启动SCRAM认证集群
                    • 2.3.4 创建Topic
                      • 2.3.5 添加权限
                        • 2.3.6 执行结果
                        • 4.1 Topic预览
                        • 4.2 使用KSQL查询Topic
                        领券
                        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档