Kafka还探3A

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

配置总览

      # 常规配置
      KAFKA_BROKER_ID: 1
      KAFKA_CREATE_TOPICS: "test:1:1"
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_ADVERTISED_LISTENERS: INSIDE://172.26.0.2:9092,OUTSIDE://172.26.0.2:9093
      KAFKA_LISTENERS: INSIDE://:9092,OUTSIDE://:9093
      KAFKA_INTER_BROKER_LISTENER_NAME: INSIDE
       # SSL相关配置
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INSIDE:SASL_SSL,OUTSIDE:SASL_SSL
      KAFKA_SSL_CLIENT_AUTH: required
      KAFKA_SSL_KEYSTORE_LOCATION: /etc/pki/jks/broker2.jks
      KAFKA_SSL_KEYSTORE_PASSWORD: 123456
      KAFKA_SSL_KEY_PASSWORD: 123456
      KAFKA_SSL_TRUSTSTORE_LOCATION: /etc/pki/jks/truststore.jks
      KAFKA_SSL_TRUSTSTORE_PASSWORD: 123456
      KAFKA_SSL_SECURE_RANDOM_IMPLEMENTATION: SHA1PRNG
      # SASL相关配置
      KAFKA_OPTS: "-Djava.security.auth.login.config=/etc/jaas/kafka_server_jaas.conf"
      KAFKA_SASL_ENABLED_MECHANISMS: PLAIN
      KAFKA_SASL_MECHANISM: PLAIN
      KAFKA_SASL_MECHANISM_INTER_BROKER_PROTOCOL: PLAIN
      # ACL相关配置
      KAFKA_SUPER_USERS: "User:admin"
      KAFKA_AUTHORIZER_CLASS_NAME: kafka.security.authorizer.AclAuthorizer
      #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的用户名密码
KafkaServer {
    org.apache.kafka.common.security.plain.PlainLoginModule required
    username="admin"
    password="adminxxx"
    user_admin="adminxxx"
    user_alice="alice-secret";
};

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列表中

你可能感兴趣的:(Kafka还探3A)