简介
kafka从0.9版本开始引入安全体系
(1)支持brokers和client之间的连接认证。使用SSL或者SASL
SASL/GSSAPI (Kerberos) - starting at version 0.9.0.0
SASL/PLAIN - starting at version 0.10.0.0
SASL/SCRAM-SHA-256 and SASL/SCRAM-SHA-512 - starting at version 0.10.2.0
(2)broker和zookeeper之间的连接认证
(3)数据传输加密,使用SSL
(4)客户端的读写权限授权
(5)授权是可插拔的,并且支持和外部授权服务集成
本文主要关注SASL/PLAIN的认证。其余的有兴趣可以详见kafka官网。
kafka authentication (认证)
ps:需要注意,启用认证后,kafka旧的生产者和消费者api将无法使用,必须用新的api
一.broker 配置
1.kafka_server_jaas.conf
KafkaServer {
org.apache.kafka.common.security.plain.PlainLoginModule required
username="admin"
password="admin-secret"
user_admin="admin-secret"
user_alice="alice-secret";
};
说明:username和password是broker之间建立连接使用。user_用户=”密码”,定义了clinet和broker通信的用户名和密码。
假设我把这个文件放置到/etc/kafka目录下。
2.修改kafka-server-start.sh,将-Djava.security.auth.login.config=/etc/kafka/kafka_server_jaas.conf添加到启动命令。
exec $base_dir/kafka-run-class.sh $EXTRA_ARGS -Djava.security.auth.login.config=/etc/kafka/kafka_server_jaas.conf kafka.Kafka "$@"
3.修改server.properties,设置参数
listeners=SASL_PLAINTEXT://hostname:9092
security.inter.broker.protocol=SASL_PLAINTEXT
sasl.mechanism.inter.broker.protocol=PLAIN
sasl.enabled.mechanisms=PLAIN
二.客户端配置
1.kafka_client_jaas.conf
KafkaClient {
org.apache.kafka.common.security.plain.PlainLoginModule required
username="alice"
password="alice-secret";
};
假定我将将文件放置到/etc/kafka目录下
2.生产者和消费者配置添加参数,可以在自定义的程序中配置properties
security.protocol=SASL_PLAINTEXT
sasl.mechanism=PLAIN
3.生产者和消费者启动的时候,需要在启动命令中指定 -Djava.security.auth.login.config=/etc/kafka/kafka_client_jaas.conf
部署:
直接以官方示例代码为例说明java生产者如何指定:
kafka.examples.Producer
public Producer(String topic, Boolean isAsync) {
//可以通过system.setProperty来指定验证文件,可以作为调试将环境使用,正式环境可以使用-Djava.security.auth.login.config来指定
System.setProperty("java.security.auth.login.config","D:\\Mtimeworkstation\\Intellij\\kafkatest\\src\\main\\resources\\kafka_client_jaas.conf");
Properties props = new Properties();
props.put("bootstrap.servers", "mtime-bigdata03:9092");
props.put("client.id", "DemoProducer");
props.put("key.serializer", "org.apache.kafka.common.serialization.IntegerSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
//配置文件设置sasl_plaintext认证
props.put("security.protocol","SASL_PLAINTEXT");
props.put("sasl.mechanism","PLAIN");
producer = new KafkaProducer<>(props);
this.topic = topic;
this.isAsync = isAsync;
}