kafka-producer kerberos 原理和配置
kerberos简单介绍
kerberos这一名词来源于希腊神话“三个头的狗---地狱之门守护者”后来沿用作为安全认证的概念,该系统设计上
采用客户端/服务器结构与DES(Data Encryption Standard标准加密技术),AES(Advanced Encryption Standerd
高级加密技术)等加密技术,并且能够进行相互认证,即客户端和服务端均可对对方进行身份认证。可以防止窃听、
防止replay攻击、保护数据完整性等场合,是一种应对对称密钥体制进行密钥管理的系统。
基本概念
票据授权票(TGT Ticket Granting):
用于应用程序与KDC(Key Distribution Center 密钥分发中心)服务器建立安全会话的票据,票据授权票存在有效期,
当票据授权票失效后,应用侧需要重新建立与KDC服务器的安全会话。会话有效期为24小时,不可配置。
服务票据(ST Service Ticket):
用于应用程序与服务端建立安全会话的票据,服务票据存在有效期,当服务票据失效后,应用侧需要重新建立于
服务端的安全会话。默认有效期5分钟,不可配置。
kafka kerberos 配置
详见网络说明在这里不再赘述:http://orchome.com/500
kafka kerberos producer客户端配置
1)使用配置文件kafka-console-producer.sh生产数据
cat kafka_client_jaas.conf 文件配置
KafkaClient { com.sun.security.auth.module.Krb5LoginModule required useTicketCache=false useKeyTab=true keyTab="/hbase/test.keytab" principal="test@KERBEROS.TEST" serviceName="kafka" Client=true; };
配置环境变量KAFKA_OPTS 举例说明
export KAFKA_OPTS="-Djava.security.krb5.conf=/etc/krb5.conf -Djava.security.auth.login.config=/kafka_client_jaas_acl.conf"
cat producer.properties
security.protocol=SASL_PLAINTEXT sasl.mechanism=GSSAPI sasl.kerberos.service.name=kafka
生产脚本kafka-console-producer.sh
./kafka-console-producer.sh --broker-list hostname:9092 --topic TEST_ACL1 --producer.config producer.properties
kafka kerberos producer客户端JAVA代码设置
import org.apache.kafka.clients.producer.*; import java.util.Properties; /** * Created by Administrator on 2018-05-24. */ public class mykafkaprocucerwithkerberos { private static final String BROKER_LIST = "127.0.0.1:9093"; public static void main(String[] args) throws InterruptedException { String rootPath = System.getProperty("user.dir"); System.setProperty("java.security.krb5.conf", rootPath + "/src/main/resources/krb5.conf"); System.setProperty("java.security.auth.login.config",rootPath + "/src/main/resources/kafka_client_jaas.conf"); Properties props1 = new Properties(); Producer<String, Object> producer1=null; props1.put("bootstrap.servers", BROKER_LIST); props1.put("security.protocol","SASL_PLAINTEXT"); props1.put("sasl.mechanism","GSSAPI"); props1.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer"); props1.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer"); producer1= new KafkaProducer<String,Object>(props1); int line = 1; while (line <=4) { ProducerRecord<String, Object> message1= new ProducerRecord<String, Object>("TEST_ACL1","TEST_TOPIC_DATA"); producer1.send(message1, new Callback() { public void onCompletion(RecordMetadata recordMetadata, Exception e) { if( e!=null){ e.printStackTrace(); System.out.println("failed"); }else { System.out.println(recordMetadata.topic()); } } }); line++; } producer1.close(); } }