上两篇文章已经对outside方向的加密、认证、鉴权有了一些认识
本篇文章主要补齐inter-broker,即inside方向的配置上的一些注意的点
实验环境同前两篇kafka*探3A文章

配置总览

  1. # 常规配置
  2. KAFKA_BROKER_ID: 1
  3. KAFKA_CREATE_TOPICS: "test:1:1"
  4. KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
  5. KAFKA_ADVERTISED_LISTENERS: INSIDE://172.26.0.2:9092,OUTSIDE://172.26.0.2:9093
  6. KAFKA_LISTENERS: INSIDE://:9092,OUTSIDE://:9093
  7. KAFKA_INTER_BROKER_LISTENER_NAME: INSIDE
  8. # SSL相关配置
  9. KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INSIDE:SASL_SSL,OUTSIDE:SASL_SSL
  10. KAFKA_SSL_CLIENT_AUTH: required
  11. KAFKA_SSL_KEYSTORE_LOCATION: /etc/pki/jks/broker2.jks
  12. KAFKA_SSL_KEYSTORE_PASSWORD: 123456
  13. KAFKA_SSL_KEY_PASSWORD: 123456
  14. KAFKA_SSL_TRUSTSTORE_LOCATION: /etc/pki/jks/truststore.jks
  15. KAFKA_SSL_TRUSTSTORE_PASSWORD: 123456
  16. KAFKA_SSL_SECURE_RANDOM_IMPLEMENTATION: SHA1PRNG
  17. # SASL相关配置
  18. KAFKA_OPTS: "-Djava.security.auth.login.config=/etc/jaas/kafka_server_jaas.conf"
  19. KAFKA_SASL_ENABLED_MECHANISMS: PLAIN
  20. KAFKA_SASL_MECHANISM: PLAIN
  21. KAFKA_SASL_MECHANISM_INTER_BROKER_PROTOCOL: PLAIN
  22. # ACL相关配置
  23. KAFKA_SUPER_USERS: "User:admin"
  24. KAFKA_AUTHORIZER_CLASS_NAME: kafka.security.authorizer.AclAuthorizer
  25. #KAFKA_ALLOW_EVERYONE_IF_NO_ACL_FOUND: "true"

INSIDE的SSL认证

  • 当inter-broker,即broker之间以SSL互相连接时,需要把SECURITY_PROTOCOL_MAP中INSIDE的值改为SSL
  • 关于客户端认证,即被连接broker对主动发起连接的broker来源进行认证
    • 开启的话设置ssl.client.auth为required
    • 无需开启的话设置ssl.client.auth为none
  • 开启客户端验证,有一个要关注的点是broker拥有的证书需要是client+server类型的
    • 不然kafka启动会报错 Invalid value javax.net.ssl.SSLHandshakeException: General SSLEngine problem for configuration A client SSLEngine created with the provided settings can't connect to a server SSLEngine created with those settings.
  • 关于服务端认证,即发起者broker对被连接的broker进行认证,与ssl证书中的SAN字段相关,存在即验证

INSIDE的SASL认证

  • 当inside方向使用SASL_PLAINTEXT或者SASL_SSL时,先确认SASL相关配置取消注释
  • 此时发起连接broker会以server_jass.conf配置文件中的username、password登录被连接的broker
  • 因此需要注意修改server的jaas配置文件username、password为user_username=”password”对应项,不然会报认证失败,如
    • username、password是本broker用来登录其他broker的用户名密码
  1. KafkaServer {
  2. org.apache.kafka.common.security.plain.PlainLoginModule required
  3. username="admin"
  4. password="adminxxx"
  5. user_admin="adminxxx"
  6. user_alice="alice-secret";
  7. };

SSL与SASL配合的注意事项

  • ssl.client.auth=required 与 SASL_SSL
    • 经过required & (SASL_SSL | SSL)两次认证实验,可以得出
    • 当client.auth为required时,SASL认证的优先级是高于SSL认证的,此时服务端不会要求客户端提供证书,不过SSL传输层加密会正常进行
  • outside、inside协调
    • OUTSIDE与INSIDE方向若均开启SSL,他们是共用一个SSL证书的
    • 所以签发证书 的时候SAN域需要加入kafka集群的外部IP或者域名
    • 此外若 outside、inside有一者需要SSL认证,即required另一者需要进行SSL加密,即传输层为SSL
    • 那么此时另一者必须要么进行SSL认证,要么进行SASL认证
  • superuser
    • inter-broker的通信互相登录后会使用很高的权限,因此
      • 要么不开启ACL鉴权
      • 要么给SSL证书中的CN或者SASL的username加到superuser列表中