在Kafka生产中使用SASL

之前一篇文章中介绍了Kakfa0.10中提供的SASL/PLAIN安全认证机制,这种认证使用起来非常简单,但如果直接应用到生产环境中,就不够严谨了。但好在Kafka提供了接口可以让我们对其进行优化和增强。

  • 为了保证不会在网络中明文传输密码,SASL/PLAIN应该使用SSL(TLS)作为传输层协议

  • 在Kafka client中,默认的SASL/PLAIN登录模式是在JAAS配置文件中指定用户名和密码。如果要避免把密码保存在磁盘上,可以自己实现javax.security.auth.spi.LoginModule来通过其他方式提供用户名和密码。新实现的登录模块必须提供用户名作为public credential,密码作为private credential,设置到subject中

  • 在生产系统中,可以通过添加javax.security.sasl.SaslServer的实现来提供额外的认证server。默认的实现在Kafka的org.apache.kafka.common.security.plain包中。

    • 新的Providers必须安装和注册在JVM中。安装的话,可以直接将Providers的classes加入到CLASSPATH中,或者打成jar包并加入JAVA_HOME/lib/ext

    • 可以将Providers注册到security配置文件JAVA_HOME/lib/security/java.security中:
      security.provider.n=providerClassName
      其中providerClassName是provider的全名(包括包名),n指的是优先权,n越小认证优先权越大

    • 除此之外,你也可以在运行时在应用程序开始时调用Security.addProvider来注册provider,例如Security.addProvider(new PlainSaslServerProvider());