在上一篇文章《配置客户端以安全连接到Kafka集群- Kerberos》中,我们讨论了Kerberos身份验证,并说明了如何配置Kafka客户端以使用Kerberos凭据进行身份验证。在本文中,我们将研究如何配置Kafka客户端以使用LDAP(而不是Kerberos)进行身份验证。
我们将不在本文中介绍服务器端配置,但在需要使示例更清楚时将添加一些引用。
此处显示的示例将以粗体突出显示与身份验证相关的属性,以将其与其他必需的安全属性区分开,如下例所示。假定已为Apache Kafka集群启用了TLS,并且应该为每个安全集群启用TLS。
代码语言:javascript复制security.protocol=SASL_SSL
ssl.truststore.location=/opt/cloudera/security/jks/truststore.jks
我们在下面的所有示例中都使用Kafka-console-consumer 。所有概念和配置也适用于其他应用程序。
LDAP验证
LDAP代表轻量级目录访问协议,并且是用于身份验证的行业标准应用程序协议。它是CDP上Kafka支持的身份验证机制之一。
LDAP认证也通过SASL框架完成,类似于Kerberos。SASL支持各种身份验证机制,例如我们在上一篇文章中介绍过的GSSAPI,以及将用于LDAP身份验证的PLAIN。
必须设置以下Kafka客户端属性,以配置Kafka客户端通过LDAP进行身份验证:
代码语言:javascript复制# Uses SASL/PLAIN over a TLS encrypted connection
security.protocol=SASL_SSL
sasl.mechanism=PLAIN
# LDAP credentials
sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="alice" password="supersecret1";
# TLS truststore
ssl.truststore.location=/opt/cloudera/security/jks/truststore.jks
上面的配置使用SASL / PLAIN进行身份验证,并使用TLS(SSL)进行数据加密。LDAP身份验证的选择是在SASL / PLAIN的服务器端处理程序上配置的,我们将在本节后面介绍。
LDAP和Kerberos
LDAP和Kerberos是不同的身份验证协议,各有其优缺点。但是,在Kafka集群中使用这些协议并不是相互排斥的。同时为集群启用Kerberos和LDAP身份验证是一种有效的配置。
身份目录服务(例如Active Directory,RedHat IPA和FreeIPA)支持Kerberos和LDAP身份验证,并且为Kafka集群启用了这两种功能,从而为客户端提供了处理身份验证的不同选择。
LDAP可以消除与配置Kerberos客户端有关的一些复杂性,例如要求在客户端安装Kerberos库以及在更严格的环境中与Kerberos KDC的网络连接。
确保集群使用TLS / SSL加密
与Kerberos协议不同,当使用LDAP进行身份验证时,用户凭据(用户名和密码)通过网络发送到Kafka集群。因此,当为Kafka启用LDAP身份验证时,为Kafka客户端之间的所有通信启用并实施TLS加密非常重要。这将确保凭据始终通过网络加密,并且不会受到损害。
必须将所有Kafka代理配置为对其SASL端点使用SASL_SSL安全协议。
在Kafka Broker上启用LDAP身份验证
安装Kafka服务时,默认情况下未为Kafka代理启用LDAP身份验证,但是在Cloudera数据平台(CDP)上配置它非常容易:
- 在Cloudera Manager中,在Kafka服务配置中设置以下属性以匹配您的环境:通过选择LDAP作为上面的SASL / PLAIN身份验证选项,Cloudera Manager会自动将Kafka Brokers配置为使用以下SASL / PLAIN回调处理程序,该实现LDAP验证:
org.apache.kafka.common.security.ldap.internals.LdapPlainServerCallbackHandler
- Kafka必须通过TLS连接(LDAPS)连接到LDAP服务器。为确保Kafka代理可以信任LDAP服务器证书,请将LDAP服务器的CA证书添加到Kafka服务使用的信任库中。您可以在Cloudera Manager的以下属性中找到信任库的位置:
- 运行以下命令(以root用户身份)以将LDAP CA证书添加到信任库中:
keytool
-importcert
-keystore /opt/cloudera/security/jks/truststore.jks
-storetype JKS
-alias ldap-ca
-file /path/to/ldap-ca-cert.pem
- 单击Kafka>操作>重新启动以重新启动Kafka服务并使更改生效。
局限性
Kafka服务器的LDAP回调处理程序使用Apache Shiro库将用户ID(简短登录名)映射到LDAP领域中的用户实体。它通过提供一个“用户DN模板”来做到这一点,给定用户短名称,该模板可用于在LDAP中派生用户专有名称:
例如,如库文档中所述,“如果目录使用LDAP uid属性表示用户名,则jsmith用户的用户DN可能如下所示:
代码语言:javascript复制uid=jsmith,ou=users,dc=mycompany,dc=com
在这种情况下,您可以使用以下模板值设置此属性:
代码语言:javascript复制uid={0},ou=users,dc=mycompany,dc=com"
这将LDAP回调处理程序的使用限制为以用户名是专有名称的一部分的方式配置的LDAP目录。对于RedHat IPA和FreeIPA实现,通常是上面这样。但是,在Active Directory中,默认情况下,专有名称的格式为:
代码语言:javascript复制CN=Smith, John, ou=users, dc=mycompany, dc=com
它们包含用户的全名而不是用户ID,这使得不可能通过简单的模式从简短的用户名中获取它。幸运的是,对于Active Directory ,除专有名称外,<用户名> @ <域>也是有效的LDAP用户名。如果使用的是Active Directory,则可以将LDAP用户DN模板设置为以下模板(使用上面的mycompany.com示例):
代码语言:javascript复制{0}@mycompany.com
如果您的LDAP目录不接受可以如上所述构造的用户名,请考虑使用Kerberos身份验证而不是LDAP。
示例
以下是使用Kafka控制台使用者使用LDAP身份验证从主题读取的示例:
代码语言:javascript复制# Complete configuration file for LDAP auth
$ cat ldap-client.properties
security.protocol=SASL_SSL
sasl.mechanism=PLAIN
sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="alice" password="supersecret1";
ssl.truststore.location=/opt/cloudera/security/jks/truststore.jks
# Connect to Kafka using LDAP auth
$ kafka-console-consumer
--bootstrap-server host-1.example.com:9093
--topic test
--consumer.config ./ldap-client.properties
注意:上面的配置文件包含敏感凭据。确保设置了文件许可权,以便只有文件所有者才能读取它。
如果我没有Kerberos或LDAP服务器怎么办?
到目前为止,Kerberos和LDAP身份验证是行业标准,是我们在整个客户群中与Kafka一起使用的最常见的身份验证机制。但是,它们并不是唯一的。
Kerberos和LDAP要求Kafka集群与后端目录服务集成,有时在某些环境中不可用。在这种情况下,仍然可以使用其他方法(例如相互TLS身份验证或带有密码文件后端的SASL / PLAIN)为Kafka集群设置身份验证。
原文作者:Andre Araujo
原文链接:https://blog.cloudera.com/how-to-configure-clients-to-connect-to-apache-kafka-clusters-securely-part-2-ldap/