Apache Kafka支持客户端使用SASL完成身份认证,而且SASL身份验证可以与TLS/SSL加密同时启用

当期支持的SASL机制有以下几种:

  • GSSAPI (Kerberos authentication)
  • OAUTHBEARER
  • SCRAM
  • PLAIN
  • Delegation Tokens
  • LDAP

在这次示例中,先使用最简单的方式,PLAIN方式,类似登录用的账号密码

JAAS服务端配置

Kafka的SASL配置使用的是Java Authentication and Authorization Service(JAAS)。所以需要提供一个jaas的配置文件。这里提供了两种方式:

  • 比较推荐的方式,是在配置文件server.properties里设置sasl.jaas.config属性
  • 另外一种是把配置文件加载到JVM的方式,需要在启动的时候,追加java.security.auth.login.config配置,声明JAAS配置文件的路径

在配置文件里配置属性

需要在Kafka的配置文件里配置sasl.jaas.config。这里要声明好listenerNamesaslMechanism

listener.name.<listenerName>.<saslMechanism>.sasl.jaas.config 

你可以配置一个或多个,注意每个后边都有;结尾

listener.name.sasl_ssl.scram-sha-256.sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required \
    username="admin" \
    password="admin-secret";

listener.name.sasl_ssl.plain.sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required \
    username="admin" \
    password="admin-secret" \
    user_admin="admin-secret" \
    user_alice="alice-secret"; 

在实际使用中,你可能用到很多种的listener,例如用于客户端连接的、节点之间通信的、或者其他用于类似RBAC模型的,所以需要设置好每个listener的标识。

如果没有在配置文件中定义listener.name.internal.sasl.enabled.mechanisms,Kafka将会使用全局定义的sasl.enabled.mechanisms。所以,你也可以使用这种方式替换为自己统一的鉴权机制。

如果你没有声明任何一个JAAS 配置,节点将会加载java.security.auth.login.config的配置作为默认的

外部JAAS配置文件加载到JVM

可以修改kafka-server-start.sh,追加JVM参数java.security.auth.login.config

export KAFKA_OPTS="-Djava.security.auth.login.config=/data/k8s-volume/kafka/config/kafka_server_jaas.conf"

kafka_server_jaas.conf文件内容如下

KafkaServer {
   org.apache.kafka.common.security.plain.PlainLoginModule required
   serviceName="kafka"
   username="admin"
   password="admin-secret"
   user_admin="admin-secret"
   user_alice="alice-secret";
};

优先级

需要说明的是,如果在多个位置配置了相同的Mechanism,则会按照优先级的高低来决定哪个生效,由高到低按以下顺序发挥作用

  • server.properties中配置的listener.name...sasl.jaas.config
  • jaas.conf中有声明listenerName的配置.KafkaServer
  • 最后是配置的默认的KafkaServer

JAAS客户端配置

客户端也提供了两种配置方式,和服务端的配置类似

  • server.properties中配置sasl.jaas.config
  • 通过java.security.auth.login.config追加到JVM里
sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required \
    username="admin" \
    password="admin-secret";

如果你同时在sasl.jaas.configjava.security.auth.login.config都配置了,则客户端会使用sasl.jaas.config的配置


感谢大家的阅读, 如有疑问可以加我微信