Kafka Kerberos 安全认证
本主要介绍在 Kafka 中如何配置 Kerberos 认证,文中所使用到的软件版本:Java 1.8.0_261
、Kafka_2.12-2.6.0
、Kerberos 1.15.1
。
1. Kerberos 安装
要使用 Kerberos 服务,需先安装 Kerberos,安装方法可参考:Kerberos 安装及使用。
2. Kafka 开启 Kerberos 认证
节点信息如下:
IP | 主机名 | 描述 |
---|---|---|
10.0.16.14 | centos-01 | zookeeper、kafka |
2.1 创建 keytab
在安装 Kerberos 的机器上进入 kadmin(Kerberos 服务端上使用 kadmin.local
,安装了 Kerberos Client 的机器上可以使用 kadmin
),然后执行如下命令分别创建服务端和客户端的 keytab:
kadmin.local: add_principal -randkey kafka-server/centos-01@ABC.COM
kadmin.local: add_principal -randkey kafka-client@ABC.COM
kadmin.local: xst -k /root/kafka-server.keytab kafka-server/centos-01@ABC.COM
kadmin.local: xst -k /root/kafka-client.keytab kafka-client@ABC.COM
2.2 配置
2.2.1 配置 hosts 文件
10.0.16.14 centos-01
2.2.2 Kerberos 相关配置
拷贝 krb5.conf 及 keytab 文件到所有安装 Kafka 的机器,把文件都放到 Kafka 的 config/kerveros
目录下(kerberos 目录需新建)。
2.2.3 Kafka 服务端配置
复制 config/server.properties(复制动作能帮助我们在 认证/非认证 模式自由切换)重命名为 config/server-sasl.properties
,增加如下配置:
listeners=SASL_PLAINTEXT://centos-01:9092
security.inter.broker.protocol=SASL_PLAINTEXT
sasl.mechanism.inter.broker.protocol=GSSAPI
sasl.enabled.mechanisms=GSSAPI
sasl.kerberos.service.name=kafka-server
新建 kafka-server-jaas.conf
文件,该文件也放到 Kafka 的 config/kerveros
目录下:
KafkaServer {
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=true
keyTab="/data/kafka_2.12-2.6.0/config/kerberos/kafka-server.keytab"
storeKey=true
useTicketCache=false
principal="kafka-server/centos-01@ABC.COM";
};
复制 bin/kafka-server-start.sh 脚本重命名为 bin/kafka-server-start-sasl.sh
,倒数第二行增加如下配置:
export KAFKA_OPTS="-Dzookeeper.sasl.client=false -Dzookeeper.sasl.client.username=zk-server -Djava.security.krb5.conf=/data/kafka_2.12-2.6.0/config/kerberos/krb5.conf -Djava.security.auth.login.config=/data/kafka_2.12-2.6.0/config/kerberos/kafka-server-jaas.conf"
2.2.4 Kafka 客户端配置
该配置主要为了使用 bin/kafka-topics.sh、bin/kafka-console-consumer.sh、kafka-console-producer.sh 等命令。
新建 client.properties
文件,该文件也放到 Kafka 的 config/kerveros
目录下:
security.protocol=SASL_PLAINTEXT
sasl.mechanism=GSSAPI
sasl.kerberos.service.name=kafka-server
新建 kafka-client-jaas.conf
文件,该文件也放到 Kafka 的 config/kerveros
目录下:
KafkaClient {
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=true
keyTab="/data/kafka_2.12-2.6.0/config/kerberos/kafka-client.keytab"
storeKey=true
useTicketCache=false
principal="kafka-client@ABC.COM";
};
复制 bin/kafka-topics.sh、kafka-console-producer.sh、bin/kafka-console-consumer.sh 脚本,分别重命名为 bin/kafka-topics-sasl.sh
、kafka-console-producer-sasl.sh
、bin/kafka-console-consumer-sasl.sh
,倒数第二行增加如下配置:
export KAFKA_OPTS="-Djava.security.krb5.conf=/data/kafka_2.12-2.6.0/config/kerberos/krb5.conf -Djava.security.auth.login.config=/data/kafka_2.12-2.6.0/config/kerberos/kafka-client-jaas.conf"
2.3 启动测试
运行 bin/kafka-server-start-sasl.s
启动 Kafka 集群:
cd /data/kafka_2.12-2.6.0
./bin/kafka-server-start-sasl.sh -daemon config/server-sasl.properties
运行 bin/kafka-topics-sasl.sh
查看 topic 列表信息:
./bin/kafka-topics-sasl.sh --list --bootstrap-server 10.0.16.14:9092 --command-config config/kerberos/client.properties
运行 kafka-console-producer-sasl.sh
生产消息:
./bin/kafka-console-producer-sasl.sh --broker-list 10.0.16.14:9092 --topic test --producer.config config/kerberos/client.properties
运行 bin/kafka-console-consumer-sasl.sh
消费消息:
./bin/kafka-console-consumer-sasl.sh --bootstrap-server 10.0.16.14:9092 --topic test --from-beginning --consumer.config config/kerberos/client.properties
2.4 java 程序连接 Kafka
java 可以使用 JAAS 来进行 Kerberos 认证,需要 JAAS 配置文件、keytab 文件及 Kerberos 配置文件。
2.4.1 配置文件
JAAS 配置文件(kafka-client-jaas.conf):
KafkaClient {
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=true
keyTab="F:\\JavaWorkspace\\kafka\\src\\main\\resources\\kafka-client.keytab"
storeKey=true
useTicketCache=false
principal="kafka-client@ABC.COM";
};
keytab 文件:
从 Kerberos 服务器上拷贝到目标机器,拷贝路径即为 JAAS 配置文件中配置的路径:F:\\JavaWorkspace\\kafka\\src\\main\\resources\\kafka-client.keytab
Kerberos 配置文件(krb5.conf):
从 Kerberos 服务器上拷贝/etc/krb5.conf
到目标机器即可。
2.4.2 配置 hosts 文件
在 C:\Windows\System32\drivers\etc\hosts
文件中添加:
10.0.16.14 centos-01
2.4.3 引入依赖
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka_2.12</artifactId>
<version>2.6.0</version>
</dependency>
2.4.4 样例程序
package kafka;
import java.time.Duration;
import java.util.Arrays;
import java.util.Properties;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer;
public class TestKafkaKerberos {
public static void main(String[] args) {
System.setProperty("java.security.auth.login.config",
"F:\\JavaWorkspace\\kafka\\src\\main\\resources\\kafka-client-jaas.conf");
System.setProperty("java.security.krb5.conf", "F:\\JavaWorkspace\\kafka\\src\\main\\resources\\krb5.conf");
Properties props = new Properties();
props.put("bootstrap.servers", "10.0.16.14:9092");
props.put("group.id", "test_group");
props.put("enable.auto.commit", "true");
props.put("auto.commit.interval.ms", "1000");
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
// sasl
props.put("sasl.mechanism", "GSSAPI");
props.put("security.protocol", "SASL_PLAINTEXT");
props.put("sasl.kerberos.service.name", "kafka-server");
@SuppressWarnings("resource")
KafkaConsumer<String, String> consumer = new KafkaConsumer<String, String>(props);
String topic = "test";
consumer.subscribe(Arrays.asList(topic));
while (true) {
try {
ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(1000));
for (ConsumerRecord<String, String> record : records) {
System.out.printf("offset = %d, partition = %d, key = %s, value = %s%n",
record.offset(), record.partition(), record.key(), record.value());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
实际上,样例程序中的种种设置就是为了还原我们在上一步中改动 bin/kafka-console-consumer-sasl.sh + config/kerberos/client.properties 的过程,二者是对应的:
3. 常见问题
Caused by: javax.security.auth.login.LoginException: Could not login: the client is being asked for a password...
Caused by: javax.security.auth.login.LoginException: Could not login: the client is being asked for a password, but the Kafka client code does not currently support obtaining a password from the user. not available to garner authentication information from the user
at com.sun.security.auth.module.Krb5LoginModule.promptForPass(Krb5LoginModule.java:944)
at com.sun.security.auth.module.Krb5LoginModule.attemptAuthentication(Krb5LoginModule.java:764)
at com.sun.security.auth.module.Krb5LoginModule.login(Krb5LoginModule.java:617)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at javax.security.auth.login.LoginContext.invoke(LoginContext.java:755)
at javax.security.auth.login.LoginContext.access$000(LoginContext.java:195)
at javax.security.auth.login.LoginContext$4.run(LoginContext.java:682)
at javax.security.auth.login.LoginContext$4.run(LoginContext.java:680)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.login.LoginContext.invokePriv(LoginContext.java:680)
at javax.security.auth.login.LoginContext.login(LoginContext.java:587)
at org.apache.kafka.common.security.authenticator.AbstractLogin.login(AbstractLogin.java:60)
at org.apache.kafka.common.security.kerberos.KerberosLogin.login(KerberosLogin.java:103)
at org.apache.kafka.common.security.authenticator.LoginManager.<init>(LoginManager.java:62)
at org.apache.kafka.common.security.authenticator.LoginManager.acquireLoginManager(LoginManager.java:112)
at org.apache.kafka.common.network.SaslChannelBuilder.configure(SaslChannelBuilder.java:158)
... 7 more
报错原因是 keytab 文件不正确,可能是 principle 不匹配或其它配置文件错误。本文中所犯错误是,Windows 的路径要写双斜线,否则配置文件无法正确读取。
KrbException: Server not found in Kerberos database
报错的可能原因之一是未配置 hosts 文件。认证策略中肯能会使用缓存,配置了 hosts 文件后要重启 IDE。
Caused by: GSSException: No valid credentials provided (Mechanism level: Server not found in Kerberos database (7) - LOOKING_UP_SERVER)
at sun.security.jgss.krb5.Krb5Context.initSecContext(Krb5Context.java:772)
at sun.security.jgss.GSSContextImpl.initSecContext(GSSContextImpl.java:248)
at sun.security.jgss.GSSContextImpl.initSecContext(GSSContextImpl.java:179)
at com.sun.security.sasl.gsskerb.GssKrb5Client.evaluateChallenge(GssKrb5Client.java:192)
... 20 more
Caused by: KrbException: Server not found in Kerberos database (7) - LOOKING_UP_SERVER
at sun.security.krb5.KrbTgsRep.<init>(KrbTgsRep.java:73)
at sun.security.krb5.KrbTgsReq.getReply(KrbTgsReq.java:251)
at sun.security.krb5.KrbTgsReq.sendAndGetCreds(KrbTgsReq.java:262)
at sun.security.krb5.internal.CredentialsUtil.serviceCreds(CredentialsUtil.java:308)
at sun.security.krb5.internal.CredentialsUtil.acquireServiceCreds(CredentialsUtil.java:126)
at sun.security.krb5.Credentials.acquireServiceCreds(Credentials.java:466)
at sun.security.jgss.krb5.Krb5Context.initSecContext(Krb5Context.java:695)
... 23 more
Caused by: KrbException: Identifier doesn't match expected value (906)
at sun.security.krb5.internal.KDCRep.init(KDCRep.java:140)
at sun.security.krb5.internal.TGSRep.init(TGSRep.java:65)
at sun.security.krb5.internal.TGSRep.<init>(TGSRep.java:60)
at sun.security.krb5.KrbTgsRep.<init>(KrbTgsRep.java:55)
... 29 more
Kafka Kerberos 安全认证的更多相关文章
- 使用kafka-python客户端进行kafka kerberos认证
之前说过python confluent kafka客户端做kerberos认证的过程,如果使用kafka python客户端的话同样也可以进行kerberos的认证,具体的认证机制这里不再描述,主要 ...
- Spark SQL Thrift Server 配置 Kerberos身份认证和权限管理
转载请注明出处:http://www.cnblogs.com/xiaodf/ 之前的博客介绍了通过Kerberos + Sentry的方式实现了hive server2的身份认证和权限管理功能,本文主 ...
- DBeaver链接kerberos安全认证的Phoenix集群
DBeaver链接kerberos安全认证的Phoenix集群 最近公司的CDH集群,启动了kerberos安全认证,所有的用户验证全部需要依赖kerberos来进行.之前的裸奔集群,总算有了一些安全 ...
- Kylin开启Kerberos安全认证
Kylin开启Kerberos安全认证, 由于Kylin是依赖Hbase启动的, Kylin启动脚本kylin.sh中就是调用的Hbase的启动脚本, 所以当Hbase开启了Keberos之后就等于K ...
- Kafka的安全认证机制SASL/PLAINTEXT
一.背景 kafka提供了多种安全认证机制,主要分为SSL和SASL2大类.其中SASL/PLAIN是基于账号密码的认证方式,比较常用.最近做了个kafka的鉴权,发现官网上讲的不是很清楚,网上各种博 ...
- Kafka开启SASL认证 【windowe详细版】
一.JAAS配置 Zookeeper配置JAAS zookeeper环境下新增一个配置文件,如zk_server_jass.conf,内容如下: Server { org.apache.kafka.c ...
- zookeeper acl认证机制及dubbo、kafka集成、zooviewer/idea zk插件配置
ZooKeeper的ACL机制 zookeeper通过ACL机制控制znode节点的访问权限. 首先介绍下znode的5种操作权限:CREATE.READ.WRITE.DELETE.ADMIN 也就是 ...
- kafka SASL认证介绍及自定义SASL PLAIN认证功能
目录 kafka 2.x用户认证方式小结 SASL/PLAIN实例(配置及客户端) broker配置 客户端配置 自定义SASL/PLAIN认证(二次开发) kafka2新的callback接口介绍 ...
- Kerberos认证流程详解
Kerberos是诞生于上个世纪90年代的计算机认证协议,被广泛应用于各大操作系统和Hadoop生态系统中.了解Kerberos认证的流程将有助于解决Hadoop集群中的安全配置过程中的问题.为此,本 ...
随机推荐
- 利用 ps 怎么显示所有的进程? 怎么利用 ps 查看指定进程的信息?
ps -ef (system v 输出)ps -aux bsd 格式输出ps -ef | grep pid
- jpg, jpeg和png区别?
jpg是jpeg的缩写, 二者一致 PNG就是为取代GIF而生的, 无损压缩, 占用内存多 jpg牺牲图片质量, 有损, 占用内存小 PNG格式可编辑.如图片中有字体等,可利用PS再 ...
- SpringBoot与SpringCloud的关系与区别?
一.SpringBoot和SpringCloud简介 1.SpringBoot:是一个快速开发框架,通过用MAVEN依赖的继承方式,帮助我们快速整合第三方常用框架,完全采用注解化(使用注解方式启动Sp ...
- IOC——Spring的bean的管理(注解方式)
注解(简单解释) 1.代码里面特殊标记,使用注解可以完成一定的功能 2.注解写法 @注解名称(属性名称=属性值) 3.注解使用在类上面,方法上面和属性上面 注意:注解方式不能完全替代配置文件方式 Sp ...
- 理解feof与EOF
feof(feof msdn) feof用于判断文件结尾.头文件<cstdio>.使用方法是feof(fp),fp为指向需要判断的文件的指针.如果不到文件结尾,返回0值:如果是文件结尾,返 ...
- WePY为了兼容支付宝小程序,改了好几十行代码
早在16年底,就有流出支付宝在做小程序的事情,见<如何看待支付宝推出「小程序」?>,今年8月18号支付宝版本小程序的终于公测,十月怀胎实属不易啊. 紧接着就有人给我提ISSUE了: 此时我 ...
- 聊聊 DisplayObject 的x/y/regX/regY/rotation/scale/skew 属性
首先要指出的是:DisplayObject 实例的属性<x, y> 与 graphics.draw*(x, y, ...) 的参数<x, y>没有关系. 在原生的 Canvas ...
- Java/C++实现模板方法模式---数据库操作
对数据库的操作一般包括连接.打开.使用.关闭等步骤,在数据库操作模板类中我们定义了connDB().openDB().useDB().closeDB()四个方法分别对应这四个步骤.对于不同类型的数据库 ...
- 一个抽取百度定位的教程(下载百度地图Demo+配置+抽取)
效果展示 已经下载Demo的可以直接到第五步,已经配置好的并可以运行的可以直接到第七步. 1.在浏览器搜索 " 百度定位API ",点击下面这个链接 2.翻到最下面找到并点击 &q ...
- SourceMonitor的安装
SourceMonitor 本词条缺少名片图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧! 中文名 SourceMonitor 软件大小 1743KB 软件语言 英文 软件类别 国外软件 ...