上两篇文章已经对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.
- 不然kafka启动会报错
- 关于服务端认证,即发起者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列表中
- inter-broker的通信互相登录后会使用很高的权限,因此