SASL配置

使用 SASL/PLAIN 进行身份验证

SASL/PLAIN 是一种简单的用户名/密码认证机制。 Kafka 支持 SASL/PLAIN 的默认实现,下面将详细描述如何为Kafka配置SASL/PLAIN。

  1. 在每个 Kafka Broker 的配置目录中(例如:/home/chen/kafka_2.12-0.11.0.0/config,后文将使用{KAFKA_HOME}代表/home/chen/kafka_2.12-0.11.0.0)添加一个经过适当修改的 JAAS 文件,类似于下面的文件,我们将其命名为 kafka_server_jaas.conf 以用于本示例:

    KafkaServer {
    org.apache.kafka.common.security.plain.PlainLoginModule required
    username="admin"
    password="admin-secret"
    user_admin="admin-secret"
    user_alice="alice-secret";
    };
    
    此配置定义了两个用户(admin 和 alice)。 KafkaServer中的属性usernamepassword由Broker用于启动与其他Broker的连接。 在本例中,admin 是Broker间通信的用户。 属性集 user_username 定义了连接到Broker的所有用户的密码,Broker使用这些属性验证所有客户端连接,包括来自其他Broker的连接。

  2. 将 JAAS 配置文件位置作为 JVM 参数传递给每个 Kafka Broker

    export KAFKA_OPTS="-Djava.security.auth.login.config={KAFKA_HOME}/config/kafka_server_jaas.conf"
    

  3. server.properties 中配置 SASL 端口和 SASL 机制。 例如:

    listeners=SASL_PLAINTEXT://{server_host}:9092
    security.inter.broker.protocol=SASL_PLAINTEXT
    sasl.mechanism.inter.broker.protocol=PLAIN
    sasl.enabled.mechanisms=PLAIN
    

  4. 最后,通过Kafka Assistant进行连接

使用 SASL/SCRAM-SHA-256 进行身份验证

TODO

使用 SASL/SCRAM-SHA-512 进行身份验证

TODO

SSL配置

为简单起见,我们将只设置一个代理和客户端,但我们还将在此过程中记录您需要为更复杂的配置做什么。

在您完成这些说明时,您需要多次指定代理 {server_hostname} 和客户端 {client_hostname} 机器的名称。 理想情况下,您将使用机器的完全限定域名 (Fully Qualified Domain Name, FQDN),但如果您尚未为机器分配主机名,则可以使用 IP 地址。 如果您只是在进行试验,并且打算在同一台机器上运行代理和客户端,那么两者都使用 localhost 或 127.0.0.1 也是可以的。

单向 SSL/TLS

步骤:

第一步:为代理创建私钥/公钥证书对:

注意:您需要对集群中的每个代理重复此步骤。

注意:我们使用 Java 附带的 keytool 实用程序来执行此任务,因为它根据代理的要求将生成的密钥/证书对存储在 JKS 容器中。

keytool -keystore server.keystore.jks -alias {server_hostname} -validity 365 -genkey -keyalg RSA

这将:

  1. 在当前目录中创建一个新的密钥库 server.keystore.jks。

  2. 提示您输入密码以保护密钥库。

  3. 生成新的公钥/私钥对并提示您输入制作公钥证书所需的其他信息。 总的来说,此信息称为可分辨名称 (Distinguishing Name, DN)。

    1. 您需要将 CN(“What is your first and last name?”问题的答案)设置为 {server_hostname}。 其他信息对于我们的目的均不重要。
    2. 您还可以通过命令行 -dname 参数设置 DN,如下所示: -dname "cn={server_hostname}"
  4. 将私钥和自签名公钥证书存储在密钥库文件中的别名 {server_hostname} 下。

    1. 系统将提示您输入密码以保护密钥库中的此特定密钥/证书对。
    2. 或者,您可以使用 -storepass-keypass 命令行参数设置密码。

例如,我的{server_hostname}kago,那么在我机器上执行的命令实际为:

keytool -keystore server.keystore.jks -alias kago -validity 365 -genkey -keyalg RSA -dname "CN=kago, OU=IT, O=Redisant, L=XIAN, ST=SHANXI, C=CN"

第二步:创建证书颁发机构 (CA) 私钥/根证书:

重要提示:不要试图通过使用自签名证书(避免使用 CA)来简化配置过程 - 这不安全(容易受到中间人攻击)。

openssl req -nodes -new -x509 -keyout ca-root.key -out ca-root.crt -days 365
或者也可以生成.pem格式的证书
openssl req -nodes -new -x509 -keyout ca-root.key -out ca-root.pem -days 365

这将:

  1. 提示您输入 DN 信息以放入证书。 对于我们的目的,这些都不是必需的,但是,您可以使用 -subj 命令行参数来避免提示。 例如:-subj "/C=CN/ST=SHANXI/L=CHANGAN/O=Redisant/CN=Redisant"

  2. 创建一个私钥/自签名公钥证书对,其中私钥不受密码保护。

  3. 如果您想用密码保护私钥,请省略 -nodes 标志,系统将提示您输入密码。

例如,在我的机器上,这一步实际执行的命令为:

openssl req -new -x509 -keyout ca-root.key -out ca-root.crt -days 365 -subj "/C=CN/ST=SHANXI/L=CHANGAN/O=Redisant/CN=Redisant"

第三步:签署Broker公钥证书:

  1. 从您在步骤 1 中创建的位于服务器密钥库文件中的自签名证书生成证书签名请求 (CSR):
keytool -keystore server.keystore.jks -alias {server_hostname} -certreq -file {server_hostname}_server.csr
  1. 使用您在步骤 2 中生成的 CA 密钥对从您刚刚创建的 CSR 创建 CA 签名证书:
openssl x509 -req -CA ca-root.crt -CAkey ca-root.key -in {server_hostname}_server.csr -out {server_hostname}_server.crt -days 365 -CAcreateserial
  1. 将此签名证书导入您的服务器密钥库(覆盖现有的自签名证书)。 在执行此操作之前,您还需要添加 CA 公钥证书:
keytool -keystore server.keystore.jks -alias CARoot -import -noprompt -file ca-root.crt
keytool -keystore server.keystore.jks -alias {server_hostname} -import -file {server_hostname}_server.crt

最后一步:配置Broker代理和客户端

您现在拥有配置代理和客户端所需的一切。

Broker配置:

listeners=PLAINTEXT://{server_hostname}:9092,SSL://{server_hostname}:9093
ssl.keystore.location=/path/to/keystore/file/server.keystore.jks
ssl.keystore.type=JKS
ssl.keystore.password=test1234
ssl.key.password=test1234

Kafka Assistant客户端配置:

注意,如果您创建的是ca-root.pem格式的证书,需要转换成.crt格式,Kafka Assistant才能识别:

openssl x509 -in ca-root.pem -out ca-root.crt

双向 SSL/TLS(单向 SSL/TLS + SSL 客户端身份验证)

步骤:

第一步:为客户端创建私钥/公钥证书对

Kafka Assistant客户端不是基于 Java 的,因此不使用 Java 的 JKS 容器格式来存储私钥和证书。 我们将使用 openssl 为客户端创建密钥/证书对,而不是像我们为代理创建的 keytool。

第一步是创建证书签名请求 (CSR)。 注意:不需要像我们为代理所做的那样首先显式创建自签名证书。

openssl req -newkey rsa:2048 -nodes -keyout {client_hostname}_client.key -out {client_hostname}_client.csr

这将提示您输入一组标准公钥证书字段值,这些对于我们的目的并不重要。

您还将被提示输入密码。 您可以在此处输入空白密码,或设置密码。

现在您有了 CSR,您可以生成 CA 签名证书,如下所示:

openssl x509 -req -CA ca-root.crt -CAkey ca-root.key -in {client_hostname}_client.csr -out {client_hostname}_client.crt -days 365 -CAcreateserial

第二步:创建一个包含 ca-root.crt 的信任库

代理现在需要访问 CA 根证书,以检查客户端提供的证书的有效性。 创建包含 CA 根证书的信任库(另一个 JKS 容器文件),如下所示:

keytool -keystore server.truststore.jks -alias CARoot -import -file ca-root.crt

第三步:配置代理和客户端

代理配置:

listeners=PLAINTEXT://{server_hostname}:9092,SSL://{server_hostname}:9093
ssl.keystore.location=/path/to/keystore/file/server.keystore.jks
ssl.keystore.type=JKS
ssl.keystore.password=test1234
ssl.key.password=test1234
ssl.truststore.location=/path/to/truststore/file/server.truststore.jks
ssl.truststore.type=JKS
ssl.truststore.password=test1234
ssl.client.auth=required

Kafka Assistant客户端配置:

SASL_SSL配置

TODO