6.3. 身份验证
要验证到 Kafka 集群的客户端连接,可以使用以下选项:
- TLS 客户端身份验证
- 在加密连接中使用 X.509 证书 TLS (传输层安全)
- Kafka SASL
- 使用支持的身份验证机制的 Kafka SASL (简单身份验证和安全层)
- OAuth 2.0
-
基于 OAuth 2.0 令牌的身份验证
SASL 身份验证支持普通未加密的连接和 TLS 连接的各种机制:
PLAIN
- 基于用户名和密码进行身份验证。SCRAM-SHA-256
和SCRAM-SHA-512
- 使用 Salted Challenge Response Authentication Mechanism (SCRAM)进行身份验证。GSSAPI
- 对 Kerberos 服务器进行身份验证。PLAIN
机制通过网络发送用户名和密码,格式为未加密的格式。它应该只与 TLS 加密结合使用。
6.3.1. 启用 TLS 客户端身份验证
在 Kafka 代理中启用 TLS 客户端身份验证,以增强连接到已使用 TLS 加密的 Kafka 节点的安全性。
使用
ssl.client.auth
属性使用以下值之一设置 TLS 身份验证:
none
- TLS 客户端身份验证为 off (默认)
requested
- 可选 TLS 客户端身份验证
必需
- 客户端必须使用 TLS 客户端证书进行身份验证
当客户端使用 TLS 客户端身份验证进行身份验证时,经过身份验证的主体名称会派生自客户端证书中的可分辨名称。例如,具有可分辨名称
CN=someuser
证书的用户将使用主体
CN=someuser,OU=Unknown,O=Unknown,L=Unknown,C=Unknown,C=Unknown,C=Unknown 进行验证
。这个主体名称为经过身份验证的用户或实体提供唯一标识符。如果没有使用 TLS 客户端身份验证,并且禁用 SASL,则主体名称默认为
ANONYMOUS
。
每个主机上安装了
Apache Kafka 的流,且配置文件可用。
启用
TLS 加密。
准备一个 JKS (Java Keystore )信任存储,其中包含用于签署用户证书的 CA (认证机构)的公钥。
编辑所有集群节点上的 Kafka 配置文件,如下所示:
使用
ssl.truststore.location
属性指定 JKS 信任存储的路径。
如果信任存储受密码保护,请使用
ssl.truststore.password
属性设置密码。
将
ssl.client.auth
属性设置为
required
。
TLS 客户端身份验证配置
ssl.truststore.location=/path/to/truststore.jks ssl.truststore.password=123456 ssl.client.auth=required(重新)启动 Kafka 代理。
6.3.2. 启用 SASL PLAIN 客户端身份验证
在 Kafka 中启用 SASL PLAIN 身份验证,以增强连接到 Kafka 节点的安全性。
SASL 身份验证通过使用
KafkaServer
JAAS 上下文的 Java 身份验证和授权服务(JAAS)启用。您可以在专用文件中或直接在 Kafka 配置中定义 JAAS 配置。
专用文件的建议位置为
/opt/kafka/config/jaas.conf
。确保该文件可由
kafka
用户读取。保留 JAAS 配置文件在所有 Kafka 节点上同步。
每个主机上安装了
Apache Kafka 的流,且配置文件可用。
编辑或创建
/opt/kafka/config/jaas.conf
JAAS 配置文件以启用
PlainLoginModule
并指定允许的用户名和密码。
确保该文件在所有 Kafka 代理中都是相同的。
JAAS 配置
KafkaServer { org.apache.kafka.common.security.plain.PlainLoginModule required user_admin="123456" user_user1="123456" user_user2="123456"; 编辑所有集群节点上的 Kafka 配置文件,如下所示: 使用listener.security.protocol.map
属性在特定监听程序上启用 SASL PLAIN 身份验证。指定SASL_PLAINTEXT
或SASL_SSL
。 将sasl.enabled.mechanisms
属性设置为PLAIN
。SASL 普通配置
listeners=INSECURE://:9092,AUTHENTICATED://:9093,REPLICATION://:9094 listener.security.protocol.map=INSECURE:PLAINTEXT,AUTHENTICATED:SASL_PLAINTEXT,REPLICATION:PLAINTEXT sasl.enabled.mechanisms=PLAIN(重新)使用KAFKA_OPTS
环境变量启动 Kafka 代理,将 JAAS 配置传递给 Kafka 代理:su - kafka export KAFKA_OPTS="-Djava.security.auth.login.config=/opt/kafka/config/jaas.conf"; /opt/kafka/bin/kafka-server-start.sh -daemon /opt/kafka/config/kraft/server.properties
6.3.3. 启用 SASL SCRAM 客户端身份验证
在 Kafka 中启用 SASL SCRAM 身份验证,以增强连接到 Kafka 节点的安全性。
SASL 身份验证通过使用
KafkaServer
JAAS 上下文的 Java 身份验证和授权服务(JAAS)启用。您可以在专用文件中或直接在 Kafka 配置中定义 JAAS 配置。
专用文件的建议位置为
/opt/kafka/config/jaas.conf
。确保该文件可由
kafka
用户读取。保留 JAAS 配置文件在所有 Kafka 节点上同步。
每个主机上安装了
Apache Kafka 的流,且配置文件可用。
编辑或创建
/opt/kafka/config/jaas.conf
JAAS 配置文件以启用
ScramLoginModule
。
确保该文件在所有 Kafka 代理中都是相同的。
JAAS 配置
KafkaServer { org.apache.kafka.common.security.scram.ScramLoginModule required; 编辑所有集群节点上的 Kafka 配置文件,如下所示: 使用listener.security.protocol.map
属性在特定监听程序上启用 SASL SCRAM 身份验证。指定SASL_PLAINTEXT
或SASL_SSL
。 将sasl.enabled.mechanisms
选项设置为SCRAM-SHA-256
或SCRAM-SHA-512
。listeners=INSECURE://:9092,AUTHENTICATED://:9093,REPLICATION://:9094 listener.security.protocol.map=INSECURE:PLAINTEXT,AUTHENTICATED:SASL_PLAINTEXT,REPLICATION:PLAINTEXT sasl.enabled.mechanisms=SCRAM-SHA-512
(重新)使用
KAFKA_OPTS
环境变量启动 Kafka 代理,将 JAAS 配置传递给 Kafka 代理。
su - kafka export KAFKA_OPTS="-Djava.security.auth.login.config=/opt/kafka/config/jaas.conf"; /opt/kafka/bin/kafka-server-start.sh -daemon /opt/kafka/config/kraft/server.properties
6.3.4. 启用多个 SASL 机制
使用 SASL 身份验证时,您可以启用多个机制。Kafka 可以同时使用多个 SASL 机制。启用多个机制后,您可以选择特定的客户端使用的机制。
要使用多个机制,您可以设置每个机制所需的配置。您可以将不同的
KafkaServer
JAAS 配置添加到同一上下文中,并使用
sasl.mechanism.inter.broker.protocol
属性在 Kafka 配置中启用多个机制作为用逗号分开的列表。
JAAS 配置多个 SASL 机制
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/[email protected]"; org.apache.kafka.common.security.scram.ScramLoginModule required;
启用 SASL 机制
sasl.enabled.mechanisms=PLAIN,SCRAM-SHA-256,SCRAM-SHA-512
6.3.5. 为 inter-broker 身份验证启用 SASL
在 Kafka 节点间启用 SASL SCRAM 身份验证,以增强代理连接的安全性。除了将 SASL 身份验证用于客户端连接到 Kafka 集群外,您还可以使用 SASL 进行代理身份验证。与 SASL 用于客户端连接不同,您只能为代理通信选择一个机制。
每个主机上安装了
Apache Kafka 的流,且配置文件可用。
如果您使用 SCRAM 机制,请在 Kafka 集群中注册 SCRAM 凭证。
对于 Kafka 集群中的所有节点,请使用
kafka-storage.sh
工具将 inter-broker SASL SCRAM 用户添加到
__cluster_metadata
主题。这样可确保在 Kafka 集群运行前为 bootstrap 更新用于身份验证的凭证。
注册 inter-broker SASL SCRAM 用户
bin/kafka-storage.sh format \ --config /opt/kafka/config/kraft/server.properties \ --cluster-id 1 \ --release-version 3.7 \ --add-scram 'SCRAM-SHA-512=[name=kafka, password=changeit]' \ --ignore formatted使用
sasl.mechanism.inter.broker.protocol
属性在 Kafka 配置中指定 inter-broker SASL 机制。
inter-broker SASL 机制
sasl.mechanism.inter.broker.protocol=SCRAM-SHA-512使用
username
和 password 字段在
KafkaServer
JAAS 上下文中指定用于代理间通信的
用户名和密码
。
inter-broker JAAS 上下文
KafkaServer { org.apache.kafka.common.security.plain.ScramLoginModule required username="kafka" password="changeit" # ...
6.3.6. 添加 SASL SCRAM 用户
此流程概述了在 Kafka 中使用 SASL SCRAM 注册新用户进行身份验证的步骤。SASL SCRAM 身份验证增强了客户端连接的安全性。
每个主机上安装了
Apache Kafka 的流,且配置文件可用。
启用
SASL SCRAM 身份验证。
使用
kafka-configs.sh
工具添加新的 SASL SCRAM 用户。
/opt/kafka/kafka-configs.sh \ --bootstrap-server <broker_host>:<port> \ --alter \ --add-config 'SCRAM-SHA-512=[password=<password>]' \ --entity-type users --entity-name <username>
/opt/kafka/kafka-configs.sh \ --bootstrap-server localhost:9092 \ --alter \ --add-config 'SCRAM-SHA-512=[password=123456]' \ --entity-type users \ --entity-name user1