4.9. 加密和身份验证
AMQ Streams 支持加密和身份验证,它们被配置为监听程序配置的一部分。
4.9.1. 侦听器配置 复制链接链接已复制到粘贴板!
Kafka 代理中的加密和验证会针对每个监听程序进行配置。有关 Kafka 侦听器配置的更多信息,请参阅 第 4.2 节 “监听器”。
Kafka 代理中的每个监听程序都使用自己的安全协议配置。配置属性 listener.security.protocol.map
定义哪个监听程序使用哪个安全协议。它将每个侦听器名称映射到其安全协议。支持的安全协议有:
PLAINTEXT
- 无加密或身份验证的监听程序。
SSL
- 使用 TLS 加密(可选)使用 TLS 客户端证书进行身份验证的监听程序。
SASL_PLAINTEXT
- 没有加密的监听程序,但使用基于 SASL 的身份验证。
SASL_SSL
- 带有基于 TLS 的加密和基于 SASL 的验证的监听程序。
根据以下 监听程序配置
:
listeners=INT1://:9092,INT2://:9093,REPLICATION://:9094
listeners=INT1://:9092,INT2://:9093,REPLICATION://:9094
listener.security.protocol.map
可能如下所示:
listener.security.protocol.map=INT1:SASL_PLAINTEXT,INT2:SASL_SSL,REPLICATION:SSL
listener.security.protocol.map=INT1:SASL_PLAINTEXT,INT2:SASL_SSL,REPLICATION:SSL
这会将侦听器 INT1
配置为使用带有 SASL 身份验证的未加密的连接,侦听器 INT2
使用 SASL 身份验证的加密连接,以及 REPLICATION
接口以使用 TLS 加密(可能与 TLS 客户端身份验证一起使用)。相同的安全协议可以多次使用。以下示例也是有效的配置:
listener.security.protocol.map=INT1:SSL,INT2:SSL,REPLICATION:SSL
listener.security.protocol.map=INT1:SSL,INT2:SSL,REPLICATION:SSL
这样的配置会将 TLS 加密和 TLS 身份验证用于所有接口。以下章节将更详细地说明如何配置 TLS 和 SASL。
4.9.2. TLS 加密 复制链接链接已复制到粘贴板!
Kafka 支持 TLS 来加密与 Kafka 客户端的通信。
要使用 TLS 加密和服务器身份验证,必须提供包含私钥和公钥的密钥存储。这通常使用 Java Keystore (JKS)格式的文件来完成。此文件的路径在 ssl.keystore.location
属性中设置。ssl.keystore.password
属性应该用于设置保护密钥存储的密码。例如:
ssl.keystore.location=/path/to/keystore/server-1.jks ssl.keystore.password=123456
ssl.keystore.location=/path/to/keystore/server-1.jks
ssl.keystore.password=123456
在某些情况下,使用额外的密码来保护私钥。可以使用 ssl.key.password
属性设置此类密码。
Kafka 可以使用由证书颁发机构和自签名密钥签名的密钥。使用由证书颁发机构签名的密钥应始终是首选的方法。为了允许客户端验证其正在连接的 Kafka 代理的身份,证书应始终包含公告的主机名 (CN) 或 Subject Alternative Name(SAN)。
可以将不同的 SSL 配置用于不同的监听程序。所有以 ssl
开头的选项都可以加一个 listener.name.<NameOfTheListener>.
前缀,其中的监听程序的名称必须始终为小写。这将覆盖该特定监听器的默认 SSL 配置。以下示例演示了如何为不同的监听程序使用不同的 SSL 配置:
其他 TLS 配置选项
除了上面描述的主要 TLS 配置选项外,Kafka 还支持很多选项来微调 TLS 配置。例如,启用或禁用 TLS / SSL 协议或密码套件:
ssl.cipher.suites
- 启用的密码套件列表。每个密码套件都是用于 TLS 连接的身份验证、加密、MAC 和密钥交换算法的组合。默认情况下启用所有可用的密码套件。
ssl.enabled.protocols
-
已启用的 TLS/SSL 协议列表。默认为
TLSv1.2,TLSv1.1,TLSv1
。
有关支持的 Kafka 代理配置选项的完整列表,请参阅 附录 A, 代理配置参数。
4.9.3. 启用 TLS 加密 复制链接链接已复制到粘贴板!
这个步骤描述了如何在 Kafka 代理中启用加密。
先决条件
- AMQ Streams 安装在 将用作 Kafka 代理的所有主机上。
流程
- 为集群中的所有 Kafka 代理生成 TLS 证书。证书应该在其 Common Name 或 Subject Alternative Name 中有其公告和 bootstrap 地址。
编辑所有集群节点上的
/opt/kafka/config/server.properties
Kafka 配置文件:-
更改
listener.security.protocol.map
字段,为您要使用 TLS 加密的监听程序指定SSL
协议。 -
使用代理证书将
ssl.keystore.location
选项设置为 JKS 密钥存储的路径。 将
ssl.keystore.password
选项设置为用来保护密钥存储的密码。例如:
listeners=UNENCRYPTED://:9092,ENCRYPTED://:9093,REPLICATION://:9094 listener.security.protocol.map=UNENCRYPTED:PLAINTEXT,ENCRYPTED:SSL,REPLICATION:PLAINTEXT ssl.keystore.location=/path/to/keystore/server-1.jks ssl.keystore.password=123456
listeners=UNENCRYPTED://:9092,ENCRYPTED://:9093,REPLICATION://:9094 listener.security.protocol.map=UNENCRYPTED:PLAINTEXT,ENCRYPTED:SSL,REPLICATION:PLAINTEXT ssl.keystore.location=/path/to/keystore/server-1.jks ssl.keystore.password=123456
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
-
更改
- (重新)启动 Kafka 代理
其他资源
- 有关配置 AMQ Streams 的详情,请参考 第 2.8 节 “配置 AMQ Streams”。
- 有关运行 Kafka 集群的更多信息,请参阅 第 4.5 节 “运行多节点 Kafka 集群”。
有关在客户端中配置 TLS 加密的更多信息,请参阅:
4.9.4. 身份验证 复制链接链接已复制到粘贴板!
要进行身份验证,您可以使用:
- 基于加密连接上的 X.509 证书进行 TLS 客户端身份验证
- 支持的 Kafka SASL(Simple Authentication and Security Layer)机制
- 基于 OAuth 2.0 令牌的身份验证
4.9.4.1. TLS 客户端身份验证 复制链接链接已复制到粘贴板!
TLS 客户端身份验证只能用于已经使用 TLS 加密的连接。要使用 TLS 客户端身份验证,可以为代理提供带有公钥的信任存储。这些密钥可用于验证连接到代理的客户端。truststore 应以 Java Keystore (JKS)格式提供,且应包含证书颁发机构的公钥。所有由信任存储中包含的证书颁发机构签名的公钥和私钥的客户端都将进行身份验证。信任存储的位置使用字段 ssl.truststore.location
设置。如果信任存储受密码保护,则密码应在 ssl.truststore.password
属性中设置。例如:
ssl.truststore.location=/path/to/keystore/server-1.jks ssl.truststore.password=123456
ssl.truststore.location=/path/to/keystore/server-1.jks
ssl.truststore.password=123456
配置信任存储后,必须使用 ssl.client.auth
属性启用 TLS 客户端身份验证。此属性可以设置为三个不同的值之一:
none
- TLS 客户端身份验证已关闭。(默认值)
requested
- TLS 客户端身份验证是可选的。系统将要求客户端使用 TLS 客户端证书进行身份验证,但不能选择。
required
- 客户端需要使用 TLS 客户端证书进行身份验证。
当客户端使用 TLS 客户端身份验证进行身份验证时,经过身份验证的主体名称是与经过身份验证的客户端证书区分名称。例如,具有可分辨名称 CN=someuser
的证书的用户将使用以下主体 CN=someuser,OU=Unknown,O=Unknown,L=Unknown,ST=Unknown,C=Unknown
,C=Unknown 进行验证。如果没有使用 TLS 客户端身份验证,并且禁用 SASL,则主体名称为 ANONYMOUS
。
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
KAFKA_OPTS="-Djava.security.auth.login.config=/path/to/my/jaas.config"; bin/kafka-server-start.sh
通过普通未加密的连接以及 TLS 连接支持 SASL 身份验证。可以为每个监听程序单独启用 SASL。要启用它,listener.security.protocol.map
中的安全协议必须是 SASL_PLAINTEXT
或 SASL_SSL
。
Kafka 中的 SASL 身份验证支持多个不同的机制:
PLAIN
- 根据用户名和密码实施身份验证。用户名和密码存储在 Kafka 配置中。
SCRAM-SHA-256
和SCRAM-SHA-512
- 使用 Salted Challenge Response Authentication Mechanism (SCRAM) 实现验证。SCRAM 凭证集中存储在 ZooKeeper 中。当 ZooKeeper 集群节点在私有网络中隔离时,可以使用 SCRAM。
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
sasl.enabled.mechanisms=PLAIN,SCRAM-SHA-256,SCRAM-SHA-512
如果用于 Inter-broker 通信的监听程序使用 SASL,则必须使用属性 sasl.mechanism.inter.broker.protocol
来指定它应使用的 SASL 机制。例如:
sasl.mechanism.inter.broker.protocol=PLAIN
sasl.mechanism.inter.broker.protocol=PLAIN
将用于 openshift-broker 通信的用户名和密码,该通信必须使用字段 username
和 password
在 KafkaServer
JAAS 上下文中指定。
SASL PLAIN
要使用 PLAIN 机制,允许在 JAAS 上下文中指定允许连接的用户名和密码。以下示例显示了为 SASL PLAIN 身份验证配置的上下文。这个示例配置三个不同的用户:
-
admin
-
user1
-
user2
与用户数据库的 JAAS 配置文件应保持在所有 Kafka 代理上同步。
当 SASL PLAIN 也用于内部代理身份验证时,username
和 password
属性应包含在 JAAS 上下文中:
SASL SCRAM
Kafka 中的 SCRAM 身份验证由两个机制组成: SCRAM-SHA-256
和 SCRAM-SHA-512
。这些机制仅在使用的哈希算法中有所不同 - SHA-256 与更强大的 SHA-512。要启用 SCRAM 身份验证,HMQ 配置文件必须包括以下配置:
KafkaServer { org.apache.kafka.common.security.scram.ScramLoginModule required; };
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
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 --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
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 配置文件中:
Kerberos 主体中的域名必须始终为大写。
除了 JAAS 配置外,还需要在 Kafka 配置中的 sasl.kerberos.service.name
属性中指定 Kerberos 服务名称:
sasl.enabled.mechanisms=GSSAPI sasl.mechanism.inter.broker.protocol=GSSAPI sasl.kerberos.service.name=kafka
sasl.enabled.mechanisms=GSSAPI
sasl.mechanism.inter.broker.protocol=GSSAPI
sasl.kerberos.service.name=kafka
多个 SASL 机制
Kafka 可以同时使用多个 SASL 机制。不同的 JAAS 配置都可以添加到同一上下文中:
启用多个机制时,客户端将能够选择想要使用的机制。
4.9.5. 启用 TLS 客户端身份验证 复制链接链接已复制到粘贴板!
此流程描述了如何在 Kafka 代理中启用 TLS 客户端身份验证。
流程
- 准备一个 JKS 信任存储,其中包含用于签署用户证书的证书颁发机构的公钥。
编辑所有集群节点上的
/opt/kafka/config/server.properties
Kafka 配置文件:-
使用用户证书的证书颁发机构,将
ssl.truststore.location
选项设置为 JKS 信任存储的路径。 -
将
ssl.truststore.password
选项设置为用来保护信任存储的密码。 将
ssl.client.auth
选项设置为required
。例如:
ssl.truststore.location=/path/to/truststore.jks ssl.truststore.password=123456 ssl.client.auth=required
ssl.truststore.location=/path/to/truststore.jks ssl.truststore.password=123456 ssl.client.auth=required
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
-
使用用户证书的证书颁发机构,将
- (重新)启动 Kafka 代理
其他资源
- 有关配置 AMQ Streams 的详情,请参考 第 2.8 节 “配置 AMQ Streams”。
- 有关运行 Kafka 集群的更多信息,请参阅 第 4.5 节 “运行多节点 Kafka 集群”。
有关在客户端中配置 TLS 加密的更多信息,请参阅:
4.9.6. 启用 SASL PLAIN 身份验证 复制链接链接已复制到粘贴板!
这个步骤描述了如何在 Kafka 代理中启用 SASL PLAIN 身份验证。
先决条件
- AMQ Streams 安装在 将用作 Kafka 代理的所有主机上。
流程
编辑或创建
/opt/kafka/config/jaas.conf
JAAS 配置文件。此文件应包含您的所有用户及其密码。确保该文件在所有 Kafka 代理中都是相同的。例如:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 编辑所有集群节点上的
/opt/kafka/config/server.properties
Kafka 配置文件:-
更改
listener.security.protocol.map
字段,为您要使用 SASL PLAIN 身份验证的监听程序指定SASL_PLAINTEXT
或SASL_SSL
协议。 将
sasl.enabled.mechanisms
选项设置为PLAIN
。例如:
listeners=INSECURE://:9092,AUTHENTICATED://:9093,REPLICATION://:9094 listener.security.protocol.map=INSECURE:PLAINTEXT,AUTHENTICATED:SASL_PLAINTEXT,REPLICATION:PLAINTEXT sasl.enabled.mechanisms=PLAIN
listeners=INSECURE://:9092,AUTHENTICATED://:9093,REPLICATION://:9094 listener.security.protocol.map=INSECURE:PLAINTEXT,AUTHENTICATED:SASL_PLAINTEXT,REPLICATION:PLAINTEXT sasl.enabled.mechanisms=PLAIN
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
-
更改
使用 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/server.properties
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/server.properties
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
其他资源
- 有关配置 AMQ Streams 的详情,请参考 第 2.8 节 “配置 AMQ Streams”。
- 有关运行 Kafka 集群的更多信息,请参阅 第 4.5 节 “运行多节点 Kafka 集群”。
有关在客户端中配置 SASL PLAIN 身份验证的详情,请参考:
4.9.7. 启用 SASL SCRAM 身份验证 复制链接链接已复制到粘贴板!
此流程描述了如何在 Kafka 代理中启用 SASL SCRAM 身份验证。
先决条件
- AMQ Streams 安装在 将用作 Kafka 代理的所有主机上。
流程
编辑或创建
/opt/kafka/config/jaas.conf
JAAS 配置文件。为KafkaServer
上下文启用ScramLoginModule
。确保该文件在所有 Kafka 代理中都是相同的。例如:
KafkaServer { org.apache.kafka.common.security.scram.ScramLoginModule required; };
KafkaServer { org.apache.kafka.common.security.scram.ScramLoginModule required; };
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 编辑所有集群节点上的
/opt/kafka/config/server.properties
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
listeners=INSECURE://:9092,AUTHENTICATED://:9093,REPLICATION://:9094 listener.security.protocol.map=INSECURE:PLAINTEXT,AUTHENTICATED:SASL_PLAINTEXT,REPLICATION:PLAINTEXT sasl.enabled.mechanisms=SCRAM-SHA-512
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
-
更改
使用 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/server.properties
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/server.properties
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
其他资源
- 有关配置 AMQ Streams 的详情,请参考 第 2.8 节 “配置 AMQ Streams”。
- 有关运行 Kafka 集群的更多信息,请参阅 第 4.5 节 “运行多节点 Kafka 集群”。
- 有关添加 SASL SCRAM 用户的详情,请参考 第 4.9.8 节 “添加 SASL SCRAM 用户”。
- 有关删除 SASL SCRAM 用户的详情请参考 第 4.9.9 节 “删除 SASL SCRAM 用户”。
有关在客户端中配置 SASL SCRAM 身份验证的更多信息,请参阅:
4.9.8. 添加 SASL SCRAM 用户 复制链接链接已复制到粘贴板!
这个步骤描述了如何使用 SASL SCRAM 为身份验证添加新用户。
流程
使用
kafka-configs.sh
工具添加新的 SASL SCRAM 用户。bin/kafka-configs.sh --bootstrap-server <BrokerAddress> --alter --add-config 'SCRAM-SHA-512=[password=<Password>]' --entity-type users --entity-name <Username>
bin/kafka-configs.sh --bootstrap-server <BrokerAddress> --alter --add-config 'SCRAM-SHA-512=[password=<Password>]' --entity-type users --entity-name <Username>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 例如:
bin/kafka-configs.sh --bootstrap-server localhost:9092 --alter --add-config 'SCRAM-SHA-512=[password=123456]' --entity-type users --entity-name user1
bin/kafka-configs.sh --bootstrap-server localhost:9092 --alter --add-config 'SCRAM-SHA-512=[password=123456]' --entity-type users --entity-name user1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
其他资源
有关在客户端中配置 SASL SCRAM 身份验证的更多信息,请参阅:
4.9.9. 删除 SASL SCRAM 用户 复制链接链接已复制到粘贴板!
这个流程描述了如何在使用 SASL SCRAM 身份验证时删除用户。
流程
使用
kafka-configs.sh
工具删除 SASL SCRAM 用户。bin/kafka-configs.sh --bootstrap-server <BrokerAddress> --alter --delete-config 'SCRAM-SHA-512' --entity-type users --entity-name <Username>
bin/kafka-configs.sh --bootstrap-server <BrokerAddress> --alter --delete-config 'SCRAM-SHA-512' --entity-type users --entity-name <Username>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 例如:
bin/kafka-configs.sh --bootstrap-server localhost:9092 --alter --delete-config 'SCRAM-SHA-512' --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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
其他资源
有关在客户端中配置 SASL SCRAM 身份验证的更多信息,请参阅: