4.9.4.2. SASL 身份验证
SASL 身份验证使用 Java 身份验证和授权服务(JAAS)进行配置。JAAS 也用于验证 Kafka 和 ZooKeeper 之间的连接。JAAS 使用自己的配置文件。此文件的建议位置是 /opt/kafka/config/jaas.conf
。该文件必须可由 kafka
用户读取。运行 Kafka 时,使用 Java 系统属性 java.security.auth.login.config
指定此文件的位置。启动代理节点时,必须将此属性传递给 Kafka:
KAFKA_OPTS="-Djava.security.auth.login.config=/path/to/my/jaas.config"; bin/kafka-server-start.sh
SASL 身份验证既通过普通的未加密连接,也受 TLS 连接支持。可以为每个侦听器单独启用 SASL。要启用它,listener.security.protocol.map
中的安全协议必须是 SASL_PLAINTEXT
或 SASL_SSL
。
Kafka 中的 SASL 身份验证支持多种不同的机制:
PLAIN
- 基于用户名和密码实施身份验证。用户名和密码存储在 Kafka 配置中。
SCRAM-SHA-256
和SCRAM-SHA-512
- 使用交换挑战响应身份验证机制(SCRAM)实施身份验证。SCRAM 凭据集中存储在 ZooKeeper 中。SCRAM 可用于 ZooKeeper 群集节点在专用网络中隔离运行的情况。
GSSAPI
- 针对 Kerberos 服务器实施身份验证.
PLAIN
机制以未加密格式通过网络发送用户名和密码。因此,它应当仅与 TLS 加密结合使用。
SASL 机制通过 JAAS 配置文件进行配置。Kafka 使用名为 KafkaServer
的 JAAS 上下文。在 JAAS 中配置它们后,必须在 Kafka 配置中启用 SASL 机制。这使用 sasl.enabled.mechanisms
属性完成。此属性包含一个以逗号分隔的启用机制列表:
sasl.enabled.mechanisms=PLAIN,SCRAM-SHA-256,SCRAM-SHA-512
如果用于broker 间通信的监听程序使用 SASL,则必须使用 sasl.mechanism.inter.broker.protocol
属性指定它应使用的 SASL 机制。例如:
sasl.mechanism.inter.broker.protocol=PLAIN
必须在 KafkaServer
JAAS 上下文中使用 username
和 password
字段指定用于内部通信的用户名和密码。
SASL PLAIN
要使用 PLAIN 机制,允许连接的用户名和密码直接在 JAAS 上下文中指定。以下示例显示了为 SASL PLAIN 身份验证配置的上下文。这个示例配置了三个不同的用户:
-
admin
-
user1
-
user2
KafkaServer { org.apache.kafka.common.security.plain.PlainLoginModule required user_admin="123456" user_user1="123456" user_user2="123456"; };
包含用户数据库的 JAAS 配置文件应该在所有 Kafka 代理上保持同步。
当 SASL PLAIN 也用于代理间验证时,username
和 password
属性应包含在 JAAS 上下文中:
KafkaServer { org.apache.kafka.common.security.plain.PlainLoginModule required username="admin" password="123456" user_admin="123456" user_user1="123456" user_user2="123456"; };
SASL SCRAM
Kafka 中的 SCRAM 身份验证由两个机制组成: SCRAM-SHA-256
和 SCRAM-SHA-512
。这些机制仅在所用的哈希算法 - SHA-256 与更强大的 SHA-512 之间有所不同。要启用 SCRAM 身份验证,JAAS 配置文件必须包括以下配置:
KafkaServer { org.apache.kafka.common.security.scram.ScramLoginModule required; };
在 Kafka 配置文件中启用 SASL 身份验证时,可以列出这两个 SCRAM 机制。但是,它们中只能选择其中之一作为代理间通信。例如:
sasl.enabled.mechanisms=SCRAM-SHA-256,SCRAM-SHA-512 sasl.mechanism.inter.broker.protocol=SCRAM-SHA-512
SCRAM 机制的用户凭据存储在 ZooKeeper 中。kafka-configs.sh
工具可用于管理它们。例如,运行以下命令来添加用户 user1,密码为 123456:
bin/kafka-configs.sh --bootstrap-server localhost:9092 --alter --add-config 'SCRAM-SHA-256=[password=123456],SCRAM-SHA-512=[password=123456]' --entity-type users --entity-name user1
要删除用户凭证,请使用:
bin/kafka-configs.sh --bootstrap-server localhost:9092 --alter --delete-config 'SCRAM-SHA-512' --entity-type users --entity-name user1
SASL GSSAPI
使用 Kerberos 进行身份验证的 SASL 机制称为 GSSAPI
。要配置 Kerberos SASL 身份验证,请在 JAAS 配置文件中添加以下配置:
KafkaServer { com.sun.security.auth.module.Krb5LoginModule required useKeyTab=true storeKey=true keyTab="/etc/security/keytabs/kafka_server.keytab" principal="kafka/kafka1.hostname.com@EXAMPLE.COM"; };
Kerberos 主体中的域名必须始终以大写形式。
除了 JAAS 配置外,Kerberos 服务名称还需要在 Kafka 配置的 sasl.kerberos.service.name
属性中指定:
sasl.enabled.mechanisms=GSSAPI sasl.mechanism.inter.broker.protocol=GSSAPI sasl.kerberos.service.name=kafka
多个 SASL 机制
Kafka 可以同时使用多个 SASL 机制。不同的 JAAS 配置都可以添加到同一上下文中:
KafkaServer { org.apache.kafka.common.security.plain.PlainLoginModule required user_admin="123456" user_user1="123456" user_user2="123456"; com.sun.security.auth.module.Krb5LoginModule required useKeyTab=true storeKey=true keyTab="/etc/security/keytabs/kafka_server.keytab" principal="kafka/kafka1.hostname.com@EXAMPLE.COM"; org.apache.kafka.common.security.scram.ScramLoginModule required; };
启用多个机制后,客户端将能够选择要使用的机制。