怎么配置客户端以安全连接到Kafka集群
这篇文章主要介绍"怎么配置客户端以安全连接到Kafka集群",在日常操作中,相信很多人在怎么配置客户端以安全连接到Kafka集群问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"怎么配置客户端以安全连接到Kafka集群"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
这是有关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。
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。
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属性来完成的:
... -Djava.security.auth.login.config=/path/to/jaas.conf...
如果您在Cloudera数据平台(CDP)中使用Kafka命令行工具,则可以通过设置以下环境变量来实现:
$ export KAFKA_OPTS="-Djava.security.auth.login.config=/path/to/jaas.conf"
配置文件的内容取决于凭证的来源。要使用存储在用户票证缓存中的Kerberos票证,请使用以下jaas.conf文件:
KafkaClient { com.sun.security.auth.module.Krb5LoginModule required useTicketCache=true;};
要使用Keytab,请改用以下命令:
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票证,请执行以下操作:
sasl.jaas.config=com.sun.security.auth.module.Krb5LoginModule required useTicketCache=true;
要使用keytab,请改用以下命令:
sasl.jaas.config=com.sun.security.auth.module.Krb5LoginModule required useKeyTab=true keyTab="/etc/security/keytabs/alice.keytab" principal="alice@EXAMPLE.COM";
示例
以下是使用Kafka控制台使用者使用Kerberos身份验证并直接连接到代理(不使用负载均衡器)从主题读取的示例:
# 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支持其他身份验证机制,因此客户可以使用其他替代方法,我们将在下一篇文章中进行探讨。
到此,关于"怎么配置客户端以安全连接到Kafka集群"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!