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
Copy to Clipboard Toggle word wrap

listener.security.protocol.map 可能如下所示:

listener.security.protocol.map=INT1:SASL_PLAINTEXT,INT2:SASL_SSL,REPLICATION:SSL
Copy to Clipboard Toggle word wrap

这会将侦听器 INT1 配置为使用带有 SASL 身份验证的未加密的连接,侦听器 INT2 使用 SASL 身份验证的加密连接,以及 REPLICATION 接口以使用 TLS 加密(可能与 TLS 客户端身份验证一起使用)。相同的安全协议可以多次使用。以下示例也是有效的配置:

listener.security.protocol.map=INT1:SSL,INT2:SSL,REPLICATION:SSL
Copy to Clipboard Toggle word wrap

这样的配置会将 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
Copy to Clipboard Toggle word wrap

在某些情况下,使用额外的密码来保护私钥。可以使用 ssl.key.password 属性设置此类密码。

Kafka 可以使用由证书颁发机构和自签名密钥签名的密钥。使用由证书颁发机构签名的密钥应始终是首选的方法。为了允许客户端验证其正在连接的 Kafka 代理的身份,证书应始终包含公告的主机名 (CN) 或 Subject Alternative Name(SAN)。

可以将不同的 SSL 配置用于不同的监听程序。所有以 ssl 开头的选项都可以加一个 listener.name.<NameOfTheListener>. 前缀,其中的监听程序的名称必须始终为小写。这将覆盖该特定监听器的默认 SSL 配置。以下示例演示了如何为不同的监听程序使用不同的 SSL 配置:

listeners=INT1://:9092,INT2://:9093,REPLICATION://:9094
listener.security.protocol.map=INT1:SSL,INT2:SSL,REPLICATION:SSL

# Default configuration - will be used for listeners INT1 and INT2
ssl.keystore.location=/path/to/keystore/server-1.jks
ssl.keystore.password=123456

# Different configuration for listener REPLICATION
listener.name.replication.ssl.keystore.location=/path/to/keystore/server-1.jks
listener.name.replication.ssl.keystore.password=123456
Copy to Clipboard Toggle word wrap

其他 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 代理的所有主机上。

流程

  1. 为集群中的所有 Kafka 代理生成 TLS 证书。证书应该在其 Common Name 或 Subject Alternative Name 中有其公告和 bootstrap 地址。
  2. 编辑所有集群节点上的 /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
      Copy to Clipboard Toggle word wrap
  3. (重新)启动 Kafka 代理

其他资源

4.9.4. 身份验证

要进行身份验证,您可以使用:

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
Copy to Clipboard Toggle word wrap

配置信任存储后,必须使用 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
Copy to Clipboard Toggle word wrap

通过普通未加密的连接以及 TLS 连接支持 SASL 身份验证。可以为每个监听程序单独启用 SASL。要启用它,listener.security.protocol.map 中的安全协议必须是 SASL_PLAINTEXTSASL_SSL

Kafka 中的 SASL 身份验证支持多个不同的机制:

PLAIN
根据用户名和密码实施身份验证。用户名和密码存储在 Kafka 配置中。
SCRAM-SHA-256SCRAM-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
Copy to Clipboard Toggle word wrap

如果用于 Inter-broker 通信的监听程序使用 SASL,则必须使用属性 sasl.mechanism.inter.broker.protocol 来指定它应使用的 SASL 机制。例如:

sasl.mechanism.inter.broker.protocol=PLAIN
Copy to Clipboard Toggle word wrap

将用于 openshift-broker 通信的用户名和密码,该通信必须使用字段 usernamepasswordKafkaServer JAAS 上下文中指定。

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";
};
Copy to Clipboard Toggle word wrap

与用户数据库的 JAAS 配置文件应保持在所有 Kafka 代理上同步。

当 SASL PLAIN 也用于内部代理身份验证时,usernamepassword 属性应包含在 JAAS 上下文中:

KafkaServer {
    org.apache.kafka.common.security.plain.PlainLoginModule required
    username="admin"
    password="123456"
    user_admin="123456"
    user_user1="123456"
    user_user2="123456";
};
Copy to Clipboard Toggle word wrap

SASL SCRAM

Kafka 中的 SCRAM 身份验证由两个机制组成: SCRAM-SHA-256SCRAM-SHA-512。这些机制仅在使用的哈希算法中有所不同 - SHA-256 与更强大的 SHA-512。要启用 SCRAM 身份验证,HMQ 配置文件必须包括以下配置:

KafkaServer {
    org.apache.kafka.common.security.scram.ScramLoginModule required;
};
Copy to Clipboard Toggle word wrap

当在 Kafka 配置文件中启用 SASL 身份验证时,可以列出这两个 SCRAM 机制。但是,对于代理间通信,只能选择其中一个。例如:

sasl.enabled.mechanisms=SCRAM-SHA-256,SCRAM-SHA-512
sasl.mechanism.inter.broker.protocol=SCRAM-SHA-512
Copy to Clipboard Toggle word wrap

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
Copy to Clipboard Toggle word wrap

要删除用户凭证,请使用:

bin/kafka-configs.sh --bootstrap-server localhost:9092 --alter --delete-config 'SCRAM-SHA-512' --entity-type users --entity-name user1
Copy to Clipboard Toggle word wrap

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";
};
Copy to Clipboard Toggle word wrap

Kerberos 主体中的域名必须始终为大写。

除了 JAAS 配置外,还需要在 Kafka 配置中的 sasl.kerberos.service.name 属性中指定 Kerberos 服务名称:

sasl.enabled.mechanisms=GSSAPI
sasl.mechanism.inter.broker.protocol=GSSAPI
sasl.kerberos.service.name=kafka
Copy to Clipboard Toggle word wrap

多个 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;
};
Copy to Clipboard Toggle word wrap

启用多个机制时,客户端将能够选择想要使用的机制。

4.9.5. 启用 TLS 客户端身份验证

此流程描述了如何在 Kafka 代理中启用 TLS 客户端身份验证。

先决条件

  • AMQ Streams 安装在 将用作 Kafka 代理的所有主机上。
  • 启用 TLS 加密。

流程

  1. 准备一个 JKS 信任存储,其中包含用于签署用户证书的证书颁发机构的公钥。
  2. 编辑所有集群节点上的 /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
      Copy to Clipboard Toggle word wrap
  3. (重新)启动 Kafka 代理

其他资源

4.9.6. 启用 SASL PLAIN 身份验证

这个步骤描述了如何在 Kafka 代理中启用 SASL PLAIN 身份验证。

先决条件

  • AMQ Streams 安装在 将用作 Kafka 代理的所有主机上。

流程

  1. 编辑或创建 /opt/kafka/config/jaas.conf JAAS 配置文件。此文件应包含您的所有用户及其密码。确保该文件在所有 Kafka 代理中都是相同的。

    例如:

    KafkaServer {
        org.apache.kafka.common.security.plain.PlainLoginModule required
        user_admin="123456"
        user_user1="123456"
        user_user2="123456";
    };
    Copy to Clipboard Toggle word wrap
  2. 编辑所有集群节点上的 /opt/kafka/config/server.properties Kafka 配置文件:

    • 更改 listener.security.protocol.map 字段,为您要使用 SASL PLAIN 身份验证的监听程序指定 SASL_PLAINTEXTSASL_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
      Copy to Clipboard Toggle word wrap
  3. 使用 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
    Copy to Clipboard Toggle word wrap

其他资源

4.9.7. 启用 SASL SCRAM 身份验证

此流程描述了如何在 Kafka 代理中启用 SASL SCRAM 身份验证。

先决条件

  • AMQ Streams 安装在 将用作 Kafka 代理的所有主机上。

流程

  1. 编辑或创建 /opt/kafka/config/jaas.conf JAAS 配置文件。为 KafkaServer 上下文启用 ScramLoginModule。确保该文件在所有 Kafka 代理中都是相同的。

    例如:

    KafkaServer {
        org.apache.kafka.common.security.scram.ScramLoginModule required;
    };
    Copy to Clipboard Toggle word wrap
  2. 编辑所有集群节点上的 /opt/kafka/config/server.properties Kafka 配置文件:

    • 更改 listener.security.protocol.map 字段,为您要使用 SASL SCRAM 身份验证的监听程序指定 SASL_PLAINTEXTSASL_SSL 协议。
    • sasl.enabled.mechanisms 选项设置为 SCRAM-SHA-256SCRAM-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 Toggle word wrap
  3. 使用 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
    Copy to Clipboard Toggle word wrap

其他资源

4.9.8. 添加 SASL SCRAM 用户

这个步骤描述了如何使用 SASL SCRAM 为身份验证添加新用户。

先决条件

  • AMQ Streams 安装在 将用作 Kafka 代理的所有主机上。
  • 启用 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>
    Copy to Clipboard Toggle word wrap

    例如:

    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 Toggle word wrap

其他资源

4.9.9. 删除 SASL SCRAM 用户

这个流程描述了如何在使用 SASL SCRAM 身份验证时删除用户。

先决条件

  • AMQ Streams 安装在 将用作 Kafka 代理的所有主机上。
  • 启用 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>
    Copy to Clipboard Toggle word wrap

    例如:

    bin/kafka-configs.sh --bootstrap-server localhost:9092 --alter --delete-config 'SCRAM-SHA-512' --entity-type users --entity-name user1
    Copy to Clipboard Toggle word wrap

其他资源

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat