我想编写一个使用客户端Ticket缓存的Java应用程序,而不是使用Keytab文件。我发现的示例都使用了JAAS配置,该配置定义了Keytab和主体(useTicketCache=false(。
我尝试使用以下JAAS内容(kafka_client.JAAS(:
KafkaClient {
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=false
useTicketCache=true
serviceName=kafka;
};
在我的Java应用程序中,我用以下命令设置了这个JAAS:
System.setProperty("java.security.auth.login.config", "kafka_client.jaas");
Properties props = new Properties();
props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "my-server.de:6667");
props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
props.put("security.protocol", "SASL_PLAINTEXT");
props.put("sasl.kerberos.service.name", "kafka");
KafkaProducer<String, String> kafkaProducer = new KafkaProducer<String, String>(props);
kafkaProducer.send(new ProducerRecord<String, String>("test_topic", "key", "value")).get();
这不起作用,并在以下异常情况下中止:
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(Unknown Source) ~[na:1.8.0_191]
at com.sun.security.auth.module.Krb5LoginModule.attemptAuthentication(Unknown Source) ~[na:1.8.0_191]
at com.sun.security.auth.module.Krb5LoginModule.login(Unknown Source) ~[na:1.8.0_191]
[...]
如上所述,我只找到了使用主体+keytab方式而不使用票证缓存的示例。这种方式也适用于我,但这不是我需要/想走的路。。。
是否可以在我的Kafka客户端Java应用程序中使用票证缓存?还是键选项卡方式是唯一的可能性?非常感谢。
看起来Kafka客户端bug或Kafka开发人员不知道什么是kerberos洪水。如果要使用keytab参数,则KDC(Active Directory或Redhat FreeIPA(基础结构将受到冗余请求的攻击。
keytab JAAS属性不适用于Linux和Windows,因为JAAS不支持凭据缓存直接支持,并且无法存储TGS票证。这是Java的热门问题。
JGSS可以帮助您获得所有Kerberos功能,并提高5x的身份验证速度:https://docs.oracle.com/en/java/javase/11/security/accessing-native-gss-api.html它避免了使用可疑的oracle模块来对抗Sun,因为它是多年来经过验证的RFC兼容模块。不要忘记导出KRB5CCNAME作为唯一用户名ccache,导出KRB5_KTNAME作为keytab。