配置客户端以安全连接到Kafka集群- Kerberos

2021-02-07 14:36:31 浏览数 (1)

这是有关Apache Kafka安全性的简短博客文章系列的第一部分。在本文中,我们将说明如何配置客户端以使用不同的身份验证机制对集群进行身份验证。

可以将受保护的Apache Kafka集群配置为使用以下不同方法来强制执行身份验证:

  • SSL – TLS客户端身份验证
  • SASL / GSSAPI – Kerberos身份验证
  • SASL / PLAIN – LDAP和基于文件的身份验证
  • SASL / SCRAM-SHA-256和SASL / SCRAM-SHA-512
  • SASL /OAUTHBEARER

在本文中,我们将开始研究Kerberos身份验证,并将重点介绍通过配置为使用Kerberos的集群进行身份验证所需的客户端配置。其他身份验证机制将在本系列的后续文章中介绍。

我们将不在本文中介绍服务器端配置,但在需要使示例更清楚时将添加一些引用。

此处显示的示例将以粗体突出显示与身份验证相关的属性,以将其与其他必需的安全属性区分开,如下例所示。假定已为Apache Kafka集群启用了TLS,并且应该为每个安全集群启用TLS。

代码语言:javascript复制
security.protocol=SASL_SSL

ssl.truststore.location=/opt/cloudera/security/jks/truststore.jks

我们在以下所有示例中使用kafka-console-consumer 。所有概念和配置也适用于其他应用程序。

Kerberos身份验证

迄今为止,Kerberos是我们在该领域中用于保护Kafka集群安全的最常用选项。它使用户能够使用存储在Active Directory,RedHat IPA和FreeIPA等服务中的公司身份,从而简化了身份管理。Kerberos化的Kafka集群还使与大数据生态系统中的其他服务集成变得更加容易,该服务通常使用Kerberos进行强身份验证。

Kafka通过简单身份验证和安全层(SASL)框架实现Kerberos身份验证。SASL是身份验证框架,是RFC 4422定义的标准IETF协议。它支持多种不同的身份验证机制,而实现Kerberos身份验证的机制称为GSSAPI。

代码语言:javascript复制
The basic Kafka client properties that must be set to configure the Kafka client to authenticate via Kerberos are shown below:


# Uses SASL/GSSAPI over a TLS encrypted connection
security.protocol=SASL_SSL
sasl.mechanism=GSSAPI
sasl.kerberos.service.name=kafka
# TLS truststore
ssl.truststore.location=/opt/cloudera/security/jks/truststore.jks

上面的配置使用Kerberos(SASL / GSSAPI)进行身份验证。TLS(SSL)仅用于通过有线进行数据加密。

JAAS配置

但是,以上属性未向客户端提供其通过Kafka集群进行身份验证所需的凭据。我们需要更多信息。

使用Kerberos时,我们可以通过两种方式将凭据提供给客户端应用程序。以有效的Kerberos票证的形式存储在票证缓存中,或者作为keytab文件,应用程序可以使用该文件来获取Kerberos票证

Kafka客户端中Kerberos凭证的处理由Java身份验证和授权服务(JAAS)库完成。因此,我们需要为客户端配置必要的信息,以便JAAS知道从何处获取凭证。

有两种方法可以为Kafka客户端设置这些属性:

  • 创建一个JAAS配置文件,并将Java系统属性java.security.auth.login.config指向它;要么
  • 内联JAAS配置,设置Kafka客户端属性sasl.jaas.config 。

在本节中,我们显示如何使用这两种方法。为了简单起见,本文中的示例将使用sasl.jaas.config方法。

使用JAAS配置文件

如果您使用的是JAAS配置文件,则需要告诉Kafka Java客户端在哪里找到它。这是通过在命令行中设置以下Java属性来完成的:

代码语言:javascript复制
... -Djava.security.auth.login.config=/path/to/jaas.conf
...

如果您在Cloudera数据平台(CDP)中使用Kafka命令行工具,则可以通过设置以下环境变量来实现:

代码语言:javascript复制
$ export KAFKA_OPTS="-Djava.security.auth.login.config=/path/to/jaas.conf"

配置文件的内容取决于凭证的来源。要使用存储在用户票证缓存中的Kerberos票证,请使用以下jaas.conf文件:

代码语言:javascript复制
KafkaClient {
 com.sun.security.auth.module.Krb5LoginModule required
 useTicketCache=true;
};

要使用Keytab,请改用以下命令:

代码语言:javascript复制
KafkaClient {
 com.sun.security.auth.module.Krb5LoginModule required
 useKeyTab=true
 keyTab="/etc/security/keytabs/alice.keytab"
 principal="alice@EXAMPLE.COM";
};

使用sasl.jaas.config属性

我通常不喜欢使用单独的JAAS配置文件,而更喜欢使用sasl.jaas.config Kafka属性为客户端设置JAAS配置。这通常更简单,并且摆脱了其他配置文件(jaas.conf )。下面的配置与上面的jaas.conf配置相同。

注意:以下设置必须写在一行中。该行末尾的分号是必需的。

要使用存储在票证缓存中的Kerberos票证,请执行以下操作:

代码语言:javascript复制
sasl.jaas.config=com.sun.security.auth.module.Krb5LoginModule required useTicketCache=true;

要使用keytab,请改用以下命令:

代码语言:javascript复制
sasl.jaas.config=com.sun.security.auth.module.Krb5LoginModule required useKeyTab=true keyTab="/etc/security/keytabs/alice.keytab" principal="alice@EXAMPLE.COM";

示例

以下是使用Kafka控制台使用者使用Kerberos身份验证并直接连接到代理(不使用负载均衡器)从主题读取的示例:

代码语言:javascript复制
# Complete configuration file for Kerberos auth using the ticket cache
$ cat krb-client.properties
security.protocol=SASL_SSL
sasl.mechanism=GSSAPI
sasl.kerberos.service.name=kafka
sasl.jaas.config=com.sun.security.auth.module.Krb5LoginModule required useTicketCache=true;
ssl.truststore.location=/opt/cloudera/security/jks/truststore.jks
# Authenticate with Kerberos to get a valid ticket
$ kinit alice
Password for alice@REALM:


# Connect to Kafka using the ticket in the ticket cache
$ kafka-console-consumer 
   --bootstrap-server host-1.example.com:9093 
   --topic test 
    --consumer.config /path/to/krb-client.properties

与Kerberos的网络连接

Kerberos的中心组件是Kerberos分发中心(KDC)。KDC是处理客户端启动的所有Kerberos身份验证的服务。为了使Kerberos身份验证正常工作,Kafka集群和客户端都必须具有与KDC的连接。

在公司环境中,这很容易实现,通常是这种情况。但是,在某些部署中,KDC可能会放置在防火墙后面,从而使客户端无法通过它来获取有效票证。

云和混合部署(云 本地部署)可能会给客户端使用Kerberos身份验证带来挑战,因为本地KDC通常未集成到部署了云的服务中。但是,由于Kafka支持其他身份验证机制,因此客户可以使用其他替代方法,我们将在下一篇文章中进行探讨。

原文作者:Andre Araujo

原文链接:https://blog.cloudera.com/how-to-configure-clients-to-connect-to-apache-kafka-clusters-securely-part-1-kerberos/

0 人点赞