配置SASL SCRAM + ACL来实现动态增减用户

以Kafka 2.3.0版本为例,实现通过配置SASL SCRAM + ACL来实现动态增减用户.以下是具体步骤

创建普通用户,用于客户端读写测试

bin/kafka-configs.sh --zookeeper localhost:2181/kafka --alter --add-config 'SCRAM-SHA-256=[iterations=8192,password=user],SCRAM-SHA-512=[password=user]' --entity-type users --entity-name user

创建admin用户,用于Kafka broker间内部通讯

bin/kafka-configs.sh --zookeeper localhost:2181/kafka --alter --add-config 'SCRAM-SHA-256=[password=admin],SCRAM-SHA-512=[password=admin]' --entity-type users --entity-name admin

Kafka只支持强哈希函数SHA-256和SHA-512,如果没有指定迭代,则使用默认的迭代计数4096。创建一个随机salt,并在ZooKeeper中存储由salt、iteration、StoredKey和ServerKey组成的SCRAM标识.如果ZooKeeper安全性受到威胁,强哈希函数结合强密码和高迭代计数可以防止暴力攻击.

使用命令查看一下创建好的用户的信息,以admin为例,里面包含了admin用户加密算法SCRAM-SHA-256以及SCRAM-SHA-512对应的盐值(salt)、ServerKey和StoreKey等

bin/kafka-configs.sh --zookeeper localhost:2181/kafka --describe --entity-type users --entity-name admin
Configs for user-principal 'admin' are SCRAM-SHA-512=salt=MTZqMmh1Y3V5Y3c4ZmF1YzVnajk1NjZoeDc=,stored_key=gk2qTgocH711dwzzC5IK4Bp6eI115S1lFA2nK+0LaYiLzB7dpdppaA09YZVcOo1GMTLOdaJ4uIv+74E4pdvQJQ==,server_key=pUlkM3ESnlKO+TAdntOJCD/lw3vfgcLcRBYmLrKVsE7Z7pAF3R01iIEJgrwJ40Hp6vO/17JfyJsN60SF/jld0Q==,iterations=4096,SCRAM-SHA-256=salt=ZmxtN3Jzcmg4M3p3ZnRvdXR0MHc1ZXN1aw==,stored_key=SM2j1/nCyLYud4iTQ97WHLAkQh82mY3DCCMSFYRcb90=,server_key=J98vkGXa8mZ2k5f5a1W1RB9MSgiJDgLPFAj7EL9h2dY=,iterations=4096

配置broker,为每个broker物理节点创建一个对应的jaas文件(内容相同),命名为kafka_server_jaas.conf.以下是kafka_server_jaas.conf文件的内容

1.注意末尾的两个分号

2.另外不要任何空白键

  1. 这里配置admin用户用于broker间的内部通讯

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

修改broker端的server.properties,增加 SASL 端口 and SASL 机制等相关配置

启用ACL

authorizer.class.name=kafka.security.auth.SimpleAclAuthorizer

设置本例中admin为超级用户

super.users=User:admin

启用SCRAM机制,采用SCRAM-SHA-512算法

sasl.enabled.mechanisms=SCRAM-SHA-512

为broker间通讯开启SCRAM机制,采用SCRAM-SHA-512算法

sasl.mechanism.inter.broker.protocol=SCRAM-SHA-512

broker间通讯使用PLAINTEXT,本例中不演示SSL配置

security.inter.broker.protocol=SASL_PLAINTEXT

配置listeners使用SASL_PLAINTEXT

listeners=SASL_PLAINTEXT://172.0.0.1:9092

配置advertised.listeners

advertised.listeners=SASL_PLAINTEXT://172.0.0.1:9092

除了上面提到的,还有一个重要的参数allow.everyone.if.no.acl.found,故这个参数默认是false.

false:对于Kafka集群而言,如果没有ResourcePatterns匹配特定的资源R,那么R就没有关联的acl,因此除了超级用户之外,没有人可以访问R,相当于白名单

true:如果资源找不到acl配置,默认是可以访问该资源,可以理解为黑名单

每台物理节点的kafka配置完成后。分别启动各节点的broker实例.

注意引入jaas文件的方式,将-Djava.security.auth.login.config作为KAKFA_OPTS环境变量的方式进行设置.参考如下脚本

!/bin/bash

export JMX_PORT=19998
export JAVA_HOME=/usr/java/jdk1.8.0_71/
export KAFKA_HOME=/usr/local/datacenter/kafka_2.11-2.3.0/
export PATH=PATH:JAVA_HOME/bin
export KAFKA_HEAP_OPTS="-Xmx6G -Xms6G -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m -XX:+UseG1GC -XX:MaxGCPauseMillis=20 -XX:InitiatingHeapOccupancyPercent=35 -XX:G1HeapRegionSize=16M -XX:MinMetaspaceFreeRatio=50 -XX:MaxMetaspaceFreeRatio=85"
export KAFKA_OPTS=-Djava.security.auth.login.config=/usr/local/datacenter/kafka_2.11-2.3.0/config/kafka_server_jaas.conf
sh KAFKA_HOME/bin/kafka-server-start.sh -daemonKAFKA_HOME/config/server.properties

测试生产者

使用console-producer脚本来发送消息, 消息发送失败了,原因是没有指定合法的认证用户,

./kafka-console-producer.sh --topic test --broker-list localhost:9092

[2019-07-31 23:04:47,568] WARN [Producer clientId=console-producer] Bootstrap broker localhost:9092 (id: -1 rack: null) disconnected (org.apache.kafka.clients.NetworkClient)
[2019-07-31 23:04:47,746] WARN [Producer clientId=console-producer] Bootstrap broker localhost:9092 (id: -1 rack: null) disconnected (org.apache.kafka.clients.NetworkClient)

现在指定用户user发送生产消息——为此我需要创建一个名为producer.conf的配置文件给生产值程序使用,如下

vi producer.conf
security.protocol=SASL_PLAINTEXT
sasl.mechanism=SCRAM-SHA-512
sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required username="user" password="user";

./kafka-console-producer.sh --topic test --broker-list localhost:9092 --producer.config producer.conf

异常发生变化了,这是因为用户user没有对test topic的写权限

[2019-07-31 23:02:56,516] WARN [Producer clientId=console-producer] Error while fetching metadata with correlation id 3 : {test=TOPIC_AUTHORIZATION_FAILED} (org.apache.kafka.clients.NetworkClient)
[2019-07-31 23:02:56,517] ERROR [Producer clientId=console-producer] Topic authorization failed for topics [test] (org.apache.kafka.clients.Metadata)
[2019-07-31 23:02:56,518] ERROR Error when sending message to topic test with key: null, value: 0 bytes with error: (org.apache.kafka.clients.producer.internals.ErrorLoggingCallback)
org.apache.kafka.common.errors.TopicAuthorizationException: Not authorized to access topics: [test]

给用户user增加该topic的写权限后,生产消息执行成功:

./kafka-acls.sh --authorizer kafka.security.auth.SimpleAclAuthorizer --authorizer-properties zookeeper.connect=localhost:2181/kafka --add --allow-principal User:user --operation Write --topic test

./kafka-console-producer.sh --topic test --broker-list localhost:9092 --producer.config producer.conf

测试消费者

下面是配置consumer程序,和上面测试producer一样,需要先为user用户增加对topic的读权限,然后在消费者程序指定配置,因为使用同一用户直接指定

producer.conf即可

./kafka-acls.sh --authorizer kafka.security.auth.SimpleAclAuthorizer --authorizer-properties zookeeper.connect=localhost:2181/kafka --add --allow-principal User:user --operation Read --topic test

./kafka-console-consumer.sh --topic test --bootstrap-server localhost:9092 --group test --consumer.config producer.conf

意想不到的是,没有执行成功,报错提示用户user没有访问消费组test的权限,

[2019-07-31 23:23:27,315] ERROR Error processing message, terminating consumer process: (kafka.tools.ConsoleConsumer$)
org.apache.kafka.common.errors.GroupAuthorizationException: Not authorized to access group: test

增加用户user访问消费组test的权限,重新执行后成功

./kafka-acls.sh --authorizer kafka.security.auth.SimpleAclAuthorizer --authorizer-properties zookeeper.connect=localhost:2181/kafka --add --allow-principal User:user --operation Read --topic test --group test

测试使用kafka-topics.sh

提示:使用 kafka-topics.sh管理topic等操作是也是要指定任务用户的.

./kafka-topics.sh --list --bootstrap-server localhost:9092 --command-config producer.conf

动态增删用户

删除用户的SCRAM证书

bin/kafka-configs.sh --zookeeper localhost:2181/kafka --alter --delete-config 'SCRAM-SHA-512' --entity-type users --entity-name user

bin/kafka-configs.sh --zookeeper localhost:2181/kafka --alter --delete-config 'SCRAM-SHA-256' --entity-type users --entity-name user

查看user的用户的信息

bin/kafka-configs.sh --zookeeper localhost:2181/kafka --describe --entity-type users --entity-name user

查看zookeeper中的元数据,关于user的用户的信息也同时被清空

[zk: localhost:2181/kafka(CONNECTED) 0] get /kafka/config/users/user
{"version":1,"config":{}}

通过创建user用户,指定认证用户的配置后,相关生产消费的程序又可正常使用

bin/kafka-configs.sh --zookeeper localhost:2181/kafka --alter --add-config 'SCRAM-SHA-256=[iterations=8192,password=user],SCRAM-SHA-512=[password=user]' --entity-type users --entity-name user

至此可以动态增加用户的权限认证方式就大功告成了

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,002评论 6 509
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,777评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,341评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,085评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,110评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,868评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,528评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,422评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,938评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,067评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,199评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,877评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,540评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,079评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,192评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,514评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,190评论 2 357

推荐阅读更多精彩内容