配置客户端以安全连接到Kafka集群–PAM身份验证

2021-02-07 14:42:50 浏览数 (1)

在本系列的前几篇文章《配置客户端以安全连接到Kafka集群- Kerberos》和《配置客户端以安全连接到Kafka集群- LDAP》中,我们讨论了Kafka的Kerberos和LDAP身份验证。在本文中,我们将研究如何配置Kafka集群以使用PAM后端而不是LDAP后端。

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

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

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

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

PAM验证

将Kafka集群配置为执行PAM(可插入身份验证模块)身份验证时,Kafka会将客户端的身份验证委派给为其运行的操作系统配置的PAM模块。

Kafka客户端配置与我们用于LDAP身份验证的配置相同,正如我们在上一篇文章中看到的:

代码语言:javascript复制
# Uses SASL/PLAIN over a TLS encrypted connection
security.protocol=SASL_SSL.protocol=SASL_SSL
sasl.mechanism=PLAIN.mechanism=PLAIN
# LDAP credentials
sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="alice" password="supersecret1";.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.truststore.location=/opt/cloudera/security/jks/truststore.jks

上面的配置使用SASL/PLAIN进行身份验证,并使用TLS(SSL)进行数据加密。PAM身份验证的选择是在SASL/PLAIN的服务器端处理程序上配置的,我们将在本节后面介绍。

确保正在使用TLS/SSL加密

与LDAP身份验证情况类似,由于用户名和密码是通过网络发送的以用于客户端身份验证,因此对于Kafka客户端之间的所有通信启用并实施TLS加密非常重要。这将确保凭据始终通过网络加密,并且不会受到损害。

必须将所有Kafka代理配置为对其SASL端点使用SASL_SSL安全协议。

其他要求

根据系统中配置的PAM模块,可能需要正确配置一些其他要求才能使PAM身份验证起作用。确切的配置取决于所使用的模块,不在本文档的范围之内。

以下是使用某些PAM模块时可能需要的两个附加配置的简单示例:

  • 如果要使用登录服务的pam_unix模块,则kafka用户(运行Kafka代理的用户)必须有权访问/etc/shadow文件,以使身份验证起作用。

下面的命令只是一个简单的示例,说明如何在单个节点上实现此目标。可能会有更好的方法来确保整个集群都满足此要求。

代码语言:javascript复制
usermod -G shadow kafka-G shadow kafka
chgrp shadow /etc/shadow/etc/shadow
chmod 440 /etc/shadow 440 /etc/shadow
  • 如果使用了pam_nologin模块,则代理上文件/var/run/nologin的存在将阻止Kafka的PAM身份验证正常工作。为了使PAM身份验证正常工作,必须从所有代理中删除文件/var/run/nologin,或者必须禁用pam_nologin模块。

在Kafka Broker上启用PAM身份验证

安装Kafka服务时,默认情况下未为Kafka代理启用PAM身份验证,但是通过Cloudera Manager对其进行配置非常简单:

在Cloudera Manager中,在Kafka服务配置中设置以下属性以匹配您的环境:通过选择PAM作为上面的SASL/PLAIN身份验证选项,Cloudera Manager将Kafka配置为使用以下SASL/PLAIN回调处理程序:

代码语言:javascript复制
org.apache.kafka.common.security.pam.internals..apache.kafka.common.security.pam.internals.PamPlainServerCallbackHandler
  • 配置要用于身份验证的PAM服务:
  • 单击Kafka>操作>重新启动以重新启动Kafka服务并使更改生效。

示例

注意:以下信息包含敏感的凭据。将此配置存储在文件中时,请确保已设置文件许可权,以便只有文件所有者才能读取它。

以下是使用Kafka控制台使用者通过PAM身份验证从主题读取的示例。请注意,此示例的配置与上一节中的LDAP示例相同。

代码语言:javascript复制
$ cat pam-client.properties-client.properties
security.protocol=SASL_SSL.protocol=SASL_SSL
sasl.mechanism=PLAIN.mechanism=PLAIN
sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="alice" password="supersecret1";.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="alice" password="supersecret1";
ssl.truststore.location=/opt/cloudera/security/jks/truststore.jks.truststore.location=/opt/cloudera/security/jks/truststore.jks


$ kafka-console-consumer -console-consumer 
   --bootstrap-server host-1.example.com:9093 --bootstrap-server host-1.example.com:9093 
   --topic test --topic test 
    --consumer.config ./pam-client.properties--consumer.config ./pam-client.properties

还有更多方法

我们将在本博客系列中回顾所有这些身份验证方法,这些方法为您提供了灵活的配置Kafka集群的方法,以与您环境中的身份验证机制集成。

原文作者:Andre Araujo

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

0 人点赞