什么是认证机制
验证 鉴权 authentication是指通过一定的手段,完成对用户身份的确认,认证的主要目的是确认当前声称为某种身份的用户确实是所声称的用户
授权一般是指对信息安全或者计算机安全相关的资源定义与授予相应的访问权限
认证要解决的是你要证明你是谁的问题,授权要解决的是则是你能做什么的问题
认证机制
0.9.0引入认证机制,实现基础安全用户认证,将kafka上云或进行多租户管理的必要步骤
基于SSL的认证主要是指Broker和客户端的双路认证
Broker和客户端 互相认对方的证书
SASL客户端认证 SASL是提供认证和数据安全服务的框架
GSSAPI: kerberos使用的安全接口 在0.9版本引入
PLAIN 使用简单的用户名密码认证机制 0.10版本引入
SCRAM 基于PLAIN机制安全问题的新机制 在0.10.2版本引入
OAUTHBEARER 基于OAuth 2机制 在2.0版本引入
Delegation Token 补充SASL机制的轻量级 1.1.0引入
建议 使用SSL来做通信加密,使用SASL来做Kafka的认证实现
SASL/GSSAPI主要是给Kerberos使用的
小公司而言,用户系统不复杂,集群用户不多
SASL/PALIN而言, 运维成本相对较小,适合小公司中的Kafka集群,弊端是不能动态增减用户
SASL/SCRAM 将用户认证信息保存在zk方式,避免动态修改Broker重启的弊端
如果要是用Delegation Token Broker和客户端在做认证的时候,可以直接使用这个token,不是每次都去KDC获取对应的ticket或传输Keystore文件
SASL/SCRAM-SHA-256配置实例
1.创建用户
admin 用户用于通信 reader用户用于读取 writer用户用于写
cd kafka_2.12-2.3.0/
$ bin/kafka-configs.sh --zookeeper localhost:2181 --alter --add-config 'SCRAM-SHA-256=[password=admin],SCRAM-SHA-512=[password=admin]' --entity-type users --entity-name admin
Completed Updating config for entity: user-principal 'admin'.
bin/kafka-configs.sh --zookeeper localhost:2181 --alter --add-config 'SCRAM-SHA-256=[password=writer],SCRAM-SHA-512=[password=writer]' --entity-type users --entity-name writer
Completed Updating config for entity: user-principal 'writer'.
bin/kafka-configs.sh --zookeeper localhost:2181 --alter --add-config 'SCRAM-SHA-256=[password=reader],SCRAM-SHA-512=[password=reader]' --entity-type users --entity-name reader
查看刚才创建的用户信息
bin/kafka-configs.sh --zookeeper localhost:2181 --describe --entity-type users --entity-name writer
Configs for user-principal 'writer' are SCRAM-SHA-512=salt=MWt6OGplZHF6YnF5bmEyam9jamRwdWlqZWQ=,stored_key=hR7+vgeCEz61OmnMezsqKQkJwMCAoTTxw2jftYiXCHxDfaaQU7+9/dYBq8bFuTio832mTHk89B4Yh9frj/ampw==,server_key=C0k6J+9/InYRohogXb3HOlG7s84EXAs/iw0jGOnnQAt4jxQODRzeGxNm+18HZFyPn7qF9JmAqgtcU7hgA74zfA==,iterations=4096,SCRAM-SHA-256=salt=MWV0cDFtbXY5Nm5icWloajdnbjljZ3JqeGs=,stored_key=sKjmeZe4sXTAnUTL1CQC7DkMtC+mqKtRY0heEHvRyPk=,server_key=kW7CC3PBj+JRGtCOtIbAMefL8aiL8ZrUgF5tfomsWVA=,iterations=4096
2 创建JAAS文件
单独为每个Broker机器创建一份JAAS 文件
文件内容如下
KafkaServer {
org.apache.kafka.common.security.scram.ScramLoginModule required
username="admin"
password="admin";
};
配置Broker 的server.properties文件
sasl.enabled.mechanisms=SCRAM-SHA-256 表名开启SCRAM认证机制 启用SHA-257算法
sasl.mechanism.inter.broker.protocol=SCRAM-SHA-256 Broker之间通信开启SCRAM认证
security.inter.broker.protocol=SASL_PLAINTEXT
listeners=SASL_PLAINTEXT://localhost:9092
3启动Broker
指定JAAS文件的位置
$KAFKA_OPTS=-Djava.security.auth.login.config=
......
[2019-07-02 13:30:34,822] INFO Kafka commitId: fc1aaa116b661c8a (org.apache.kafka.common.utils.AppInfoParser)
[2019-07-02 13:30:34,822] INFO Kafka startTimeMs: 1562045434820 (org.apache.kafka.common.utils.AppInfoParser)
[2019-07-02 13:30:34,823] INFO [KafkaServer id=0] started (kafka.server.KafkaServer)
4 发送消息
创建一个名为producer.conf的配置文件
security.protocol=SASL_PLAINTEXT
sasl.mechanism=SCRAM-SHA-256
sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required username="writer" password="writer";
之后运行
bin/kafka-console-producer.sh --broker-list localhost:9092,localhost:9093 --topic test --producer.config
>hello, world
>
5消费消息
创建consumer.conf文件
security.protocol=SASL_PLAINTEXT
sasl.mechanism=SCRAM-SHA-256
sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required username="reader" password="reader";
正常消费消息
bin/kafka-console-consumer.sh --bootstrap-server localhost:9092,localhost:9093 --topic test --from-beginning --consumer.config
hello, world
6动态增减用户
bin/kafka-configs.sh --zookeeper localhost:2181 --alter --delete-config 'SCRAM-SHA-256' --entity-type users --entity-name writer
Completed Updating config for entity: user-principal 'writer'.
$ bin/kafka-configs.sh --zookeeper localhost:2181 --alter --delete-config 'SCRAM-SHA-512' --entity-type users --entity-name writer
Completed Updating config for entity: user-principal 'writer'.
$ bin/kafka-configs.sh --zookeeper localhost:2181 --alter --add-config 'SCRAM-SHA-256=[iterations=8192,password=new_writer]' --entity-type users --entity-name new_writer
Completed Updating config for entity: user-principal 'new_writer'.
确认Console Producer程序不能发送消息
bin/kafka-console-producer.sh --broker-list localhost:9092,localhost:9093 --topic test --producer.config /Users/huxi/testenv/producer.conf
>[2019-07-02 13:54:29,695] ERROR [Producer clientId=console-producer] Connection to node -1 (localhost/127.0.0.1:9092) failed authentication due to: Authentication failed during authentication due to invalid credentials with SASL mechanism SCRAM-SHA-256 (org.apache.kafka.clients.NetworkClient)
......
指定新的用户 可以重新消费消息
bin/kafka-console-producer.sh --broker-list localhost:9092,localhost:9093 --topic test --producer.config
>Good!
不重启Broker情况下增减用户