Kerberos之配置HDP组件Kafka(四)

标题为Kerberos配置HDP组件

本节介绍如何配置Kerberos以对Ambari受管群集中的HDP组件进行强身份验证。

为Kerberos配置Kafka

本节介绍如何在Ambari管理的群集上为Kafka配置Kerberos安全性。
Kafka的Kerberos安全性是一项可选功能。 启用安全性后,功能包括:
•对客户端与代理之间的连接(消费者,生产者)进行身份验证
•基于ACL的授权

Kerberos for Kafka先决条件

如果要为Kerberos配置Kafka,则群集必须满足一些先决条件,然后才能启用Kerberos。

先决条件参考*
Ambari-managed cluster with Kafka installed.• Ambari Version 2.1.0.0 or later• Stack version HDP 2.3.2 or later“Installing, Configuring, and Deploying a Cluster” (link below)
Key Distribution Center (KDC) server installed and running“Installing and Configuring the KDC” (link below)
JCE installed on all hosts on the cluster (including the Ambari server)“Enabling Kerberos Authentication Using Ambari” (link below)

链接适用于Ambari 2.1.2.0。
满足所有先决条件后,请启用Kerberos安全性。 有关更多信息,请参见“启动Kerberos向导(自动设置)”(下面的链接)。

为Kerberos配置Kafka代理

在安装过程中,Ambari会配置一系列Kafka设置,并为Kafka服务器创建JAAS配置文件。
不需要修改这些设置,但是有关更多信息,请参见“附录:Kerberos Kafka配置选项”。

创建Kafka主题

当您使用脚本,命令或API创建主题时,将在ZooKeeper下创建一个条目。 唯一有权访问ZooKeeper的用户是运行Kafka(默认情况下为kafka)的服务帐户。 因此,在安全集群上创建Kafka主题的第一步是运行kinit,指定Kafka服务密钥表。 第二步是创建主题。

程序
1.运行kinit,指定Kafka服务密钥表。 例如:
kinit -k -t /etc/security/keytabs/kafka.service.keytab kafka/c6401.ambari.apache.org@EXAMPLE.COM
2.接下来,创建主题。 使用以下选项运行kafka-topics.sh命令行工具:
/bin/kafka-topics.sh --zookeeper <主机名>:<端口> --create --topic --partitions <分区数> --replication-factor <复制数 -服务器>
有关kafka-topics.sh参数的更多信息,请参阅Apache Kafka上的Basic Kafka Operations。
网站。

/bin/kafka-topics.sh --zookeeper c6401.ambari.apache.org:2181 --create --
topic test_topic --partitions 2 --replication-factor 2
Created topic "test_topic".

3.添加权限:
默认情况下,设置权限,以便只有Kafka服务用户可以访问; 没有其他用户可以读取或写入新主题。 换句话说,如果您的Kafka服务器使用主体$ KAFKA-USER运行,则只有该主体才能写入ZooKeeper。

有关添加权限的信息,请参阅“启用Kerberos时授权访问”。

在安全集群上产生事件或消息给Kafka

如何在安全集群上向Kafka生成事件/消息。

开始之前请确保已为与主题相关联的用户启用了对主题的访问权限(通过Ranger或本机ACL)。
生产者过程。 我们建议您使用Ranger来管理权限。 有关更多信息,请参阅“ Apache Ranger用户指南>添加KAFKA策略”。

关于此任务

在安装过程中,Ambari会配置一系列Kafka客户端和生产者设置,并为Kafka客户端创建JAAS配置文件。 无需修改这些设置,但是有关它们的更多信息,请参见“附录:Kerberos Kafka配置选项”。
注意:
Kerberos仅支持Kafka Java API。 不支持第三方客户端。

程序
1.将JAAS配置文件的路径指定为JVM参数之一:
Djava.security.auth.login.config = / usr / hdp / current / kafka-broker / config / kafka_client_jaas.conf
有关kafka_client_jaas文件的更多信息,请参见“ Kafka客户端的JAAS配置文件”。
2.使用主体的密钥表进行初始化。
3.使用以下配置选项启动kafka-console-producer.sh。 (注意:除了–security-protocol SASL_PLAINTEXT之外,这些设置与以前的版本相同。)
./bin/kafka-console-producer.sh --broker-list <hostname:port [,hostname:port, …]> --topic –
security-protocol SASL_PLAINTEXT
./bin/kafka-console-producer.sh --broker-list c6401.ambari.apache.org:6667,c6402.ambari.apache.org:6667 --topic
test_topic --security-protocol SASL_PLAINTEXT
问题:如果您从命令行界面启动生产者而未指定security-protocol选项,
您将看到以下错误:

2015-07-21 04:14:06,611] ERROR fetching topic metadata for topics 
[Set(test_topic)] from broker 
[ArrayBuffer(BrokerEndPoint(0,c6401.ambari.apache.org,6667), 
BrokerEndPoint(1,c6402.ambari.apache.org,6667))] failed 
(kafka.utils.CoreUtils$)
kafka.common.KafkaException: fetching topic metadata for topics 
[Set(test_topic)] from broker 
[ArrayBuffer(BrokerEndPoint(0,c6401.ambari.apache.org,6667), 
BrokerEndPoint(1,c6402.ambari.apache.org,6667))] failed 
 at kafka.client.ClientUtils$.fetchTopicMetadata(ClientUtils.scala:73)
Caused by: java.io.EOFException: Received -1 when reading from channel,
 socket has likely been closed.
 at kafka.utils.CoreUtils$.read(CoreUtils.scala:193)
 at
 kafka.network.BoundedByteBufferReceive.readFrom(BoundedByteBufferReceive.scala:54)
解决方案:将--security-protocol SASL_PLAINTEXT添加到kafka-console-producer.sh运行时选项中。
启用Kerberos的群集的生产者代码示例

以下示例显示了启用Kerberos的Kafka群集中生产者的示例代码。 请注意,SECURITY_PROTOCOL_CONFIG属性设置为SASL_PLAINTEXT

package com.hortonworks.example.kafka.producer;
import org.apache.kafka.clients.CommonClientConfigs;
import org.apache.kafka.clients.producer.Callback;
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.Producer;
import org.apache.kafka.clients.producer.ProducerConfig;
import org.apache.kafka.clients.producer.ProducerRecord;
import org.apache.kafka.clients.producer.RecordMetadata;
import java.util.Properties;
import java.util.Random;
public class BasicProducerExample {
 public static void main(String[] args){
 Properties props = new Properties();
 props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,
 "kafka.example.com:6667");
 
 // specify the protocol for SSL Encryption
 props.put(CommonClientConfigs.SECURITY_PROTOCOL_CONFIG,
 "SASL_PLAINTEXT");

 props.put(ProducerConfig.ACKS_CONFIG, "all");
 props.put(ProducerConfig.RETRIES_CONFIG, 0);
 props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,
 "org.apache.kafka.common.serialization.StringSerializer");
 props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG,
 "org.apache.kafka.common.serialization.StringSerializer");
 Producer<String, String> producer = new KafkaProducer<String,
 String>(props);
 TestCallback callback = new TestCallback();
 Random rnd = new Random();
 for (long i = 0; i < 100 ; i++) {
 ProducerRecord<String, String> data = new ProducerRecord<String,
 String>(
 "test-topic", "key-" + i, "message-"+i );
 producer.send(data, callback);
 }
 producer.close();
 }
 private static class TestCallback implements Callback {
 @Override
 public void onCompletion(RecordMetadata recordMetadata, Exception e)
 {
 if (e != null) {
 System.out.println("Error while producing message to topic :"
 + recordMetadata);
 e.printStackTrace();
 } else {
 String message = String.format("sent message
 to topic:%s partition:%s offset:%s", recordMetadata.topic(),
 recordMetadata.partition(), recordMetadata.offset());
 System.out.println(message);
 }
 }
 }
}

要运行该示例,请发出以下命令:

$ java -Djava.security.auth.login.config=/usr/hdp/
current/kafka-broker/config/kafka_client_jaas.conf
 com.hortonworks.example.kafka.producer.BasicProducerExample

在安全的群集上使用来自Kafka的事件或消息

如何在安全群集上使用来自Kafka的事件/消息。

在你开始之前

确保已为与使用者进程关联的用户启用了对主题的访问(通过Ranger或本机ACL)。 我们建议您使用Ranger来管理权限。 有关更多信息,请参阅“ Apache Ranger用户指南>添加KAFKA策略”。

关于此任务

在安装过程中,Ambari会配置一系列Kafka客户端和生产者设置,并为Kafka客户端创建JAAS配置文件。 无需修改这些值,但有关更多信息,请参见“附录:Kerberos Kafka配置选项”。

注意:Kerberos仅支持Kafka Java API。 不支持第三方客户端。

程序

1.将JAAS配置文件的路径指定为JVM参数之一。
有关kafka_client_jaas文件的更多信息,请参见“ Kafka客户端的JAAS配置文件”。
-Djava.security.auth.login.config = / usr / hdp / current / kafka-broker / config / kafka_client_jaas.conf
2.使用主体的密钥表进行初始化。
3.使用以下配置设置启动kafka-console-consumer.sh。 (注意:除了–security-protocol SASL_PLAINTEXT之外,这些设置与以前的版本相同。)
./bin/kafka-console-consumer.sh --zookeeper c6401.ambari.apache.org:2181 --topic test_topic --from-beginning-
安全协议SASL_PLAINTEXT
问题:如果您从命令行界面启动使用者,而未指定security-protocol选项,
您将看到以下错误:

2015-07-21 04:14:06,611] ERROR fetching topic metadata for topics 
[Set(test_topic)] from broker 
[ArrayBuffer(BrokerEndPoint(0,c6401.ambari.apache.org,6667), 
BrokerEndPoint(1,c6402.ambari.apache.org,6667))] failed 
(kafka.utils.CoreUtils$)
kafka.common.KafkaException: fetching topic metadata for topics 
[Set(test_topic)] from broker 
[ArrayBuffer(BrokerEndPoint(0,c6401.ambari.apache.org,6667), 
BrokerEndPoint(1,c6402.ambari.apache.org,6667))] failed 
 at kafka.client.ClientUtils$.fetchTopicMetadata(ClientUtils.scala:73)
Caused by: java.io.EOFException: Received -1 when reading from channel,
 socket has likely been closed.
 at kafka.utils.CoreUtils$.read(CoreUtils.scala:193)
 at
 kafka.network.BoundedByteBufferReceive.readFrom(BoundedByteBufferReceive.scala:54)

解决方式:

Add --security-protocol SASL_PLAINTEXT to the kafka-console-consumer.sh runtime options.

启用Kerberos的群集的使用者代码示例

以下示例显示了启用Kerberos的Kafka群集中生产者的示例代码。 请注意,SECURITY_PROTOCOL_CONFIG属性设置为SASL_PLAINTEXT。

package com.hortonworks.example.kafka.consumer;
import org.apache.kafka.clients.CommonClientConfigs;
import org.apache.kafka.clients.consumer.ConsumerConfig;
import org.apache.kafka.clients.consumer.ConsumerRebalanceListener;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer;
import org.apache.kafka.common.TopicPartition;
import java.util.Collection;
import java.util.Collections;
import java.util.Properties;
public class BasicConsumerExample {
 public static void main(String[] args) {
 Properties consumerConfig = new Properties();
 consumerConfig.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG,
 "kafka.example.com:6667");
 // specify the protocol for SSL Encryption
 consumerConfig.put(CommonClientConfigs.SECURITY_PROTOCOL_CONFIG,
 "SASL_PLAINTEXT");
 consumerConfig.put(ConsumerConfig.GROUP_ID_CONFIG, "my-group");
 consumerConfig.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG,
 "earliest");
 consumerConfig.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG,
 "org.apache.kafka.common.serialization.StringDeserializer");
 consumerConfig.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG,
 "org.apache.kafka.common.serialization.StringDeserializer");
 KafkaConsumer<byte[], byte[]> consumer = new
 KafkaConsumer<>(consumerConfig);
 TestConsumerRebalanceListener rebalanceListener = new
 TestConsumerRebalanceListener();
 consumer.subscribe(Collections.singletonList("test-topic"),
 rebalanceListener);
 while (true) {
 ConsumerRecords<byte[], byte[]> records = consumer.poll(1000);
 for (ConsumerRecord<byte[], byte[]> record : records) {
 System.out.printf("Received Message topic =%s, partition =%s,
 offset = %d, key = %s, value = %s\n", record.topic(), record.partition(),
 record.offset(), record.key(), record.value());
 }
 consumer.commitSync();
 }
 }
 private static class TestConsumerRebalanceListener implements
 ConsumerRebalanceListener {
 @Override
 public void onPartitionsRevoked(Collection<TopicPartition>
 partitions) {
 System.out.println("Called onPartitionsRevoked with partitions:"
 + partitions);
 }
 @Override
 public void onPartitionsAssigned(Collection<TopicPartition>
 partitions) {
 System.out.println("Called onPartitionsAssigned with partitions:"
 + partitions);
 }
 }
}

要运行该示例,请发出以下命令:

# java -Djava.security.auth.login.config=/usr/hdp/
current/kafka-broker/config/kafka_client_jaas.conf 
 com.hortonworks.example.kafka.consumer.BasicConsumerExample

Authorizing Access when Kerberos is Enabled

Kafka附带了一个可插拔授权器和一个使用ZooKeeper存储访问控制列表(ACL)的即用授权器实现。
可以通过Ranger(请参阅《 Ranger安装指南》的“ Kafka”部分)或使用本机ACL进行授权。
Kafka ACL条目具有以下常规格式:
主体P是主机H上资源R上的[允许/拒绝]操作O
•委托人是系统可以认证的任何实体,例如用户帐户,在用户帐户的安全上下文中运行的线程或进程或此类帐户的安全组。委托人以PrincipalType:PrincipalName(user:dev@EXAMPLE.COM)格式指定。指定用户:以指示所有主体。
主体是逗号分隔的主体列表。指定
表示所有主体。 (主体是可以由系统验证的任何实体,例如用户帐户,在用户帐户的安全上下文中运行的线程或进程或此类帐户的安全组。)
•操作可以是以下之一:READ,WRITE,CREATE,DESCRIBE或ALL。 •资源是主题名称,使用者组名称或字符串“ kafka-cluster”,用于指示集群级资源(仅用于CREATE操作)。
•Host是客户端主机的IP地址。指定*表示所有主机。

附录:Kerberos Kafka配置选项

Kerberos Kafka配置选项的参考资料。
Server.properties键值对Ambari在安装过程中配置以下Kafka值。 设置存储为存储在基础server.properties配置文件中的键值对。
listeners
Kafka 将侦听的URI列表,以逗号分隔。
所需的属性包括三个部分:
::

将设置为SASL_PLAINTEXT,以指定服务器接受连接的协议。 SASL身份验证将在纯文本通道上使用。 在客户端和服务器之间建立SASL身份验证后,会话将使用客户端的主体作为已身份验证的用户。 代理只能接受SASL(Kerberos)连接,并且没有应用有线加密。 (注意:对于非安全群集,应将设置为PLAINTEXT。)
将主机名设置为与要安装的节点关联的主机名。 Kerberos使用此值和“主要”来构造Kerberos服务名称。 指定主机名0.0.0.0以绑定到所有接口。 将主机名保留为空以绑定到默认接口。

将端口设置为Kafka服务端口。 使用Ambari安装Kafka时,默认端口号是6667。
合法侦听器列表的示例:
listeners = SASL_PLAINTEXT://kafka1.host1.com:6667
listeners = PLAINTEXT:// myhost:9092,TRACE://:9091,SASL_PLAINTEXT://0.0.0.0:9093

advertised.listeners
与上一节中指定的侦听器不同的侦听器列表,这些侦听器将发布到ZooKeeper供客户端使用。
在IaaS环境中,此值可能需要与代理绑定的接口不同。
如果未设置advertised.listeners,则将使用侦听器的值。
所需值包括三个部分:
::

将协议设置为SASL_PLAINTEXT,以指定服务器接受连接的协议。 SASL身份验证将在纯文本通道上使用。 在客户端和服务器之间建立SASL身份验证后,会话将使用客户端的主体作为已身份验证的用户。 代理只能接受SASL(Kerberos)连接,并且没有应用有线加密。 (注意:对于非安全群集,应将设置为PLAINTEXT。)
将主机名设置为与要安装的节点关联的主机名。 Kerberos使用此名称和“主要”来构造Kerberos服务名称。
将端口设置为Kafka服务端口。 使用Ambari安装Kafka时,默认端口号是6667。
例如:
advertised.listeners = SASL_PLAINTEXT://kafka1.host1.com:6667

security.inter.broker.protocol
指定代理间通信协议。 在使用Kerberized的集群中,要求代理通过SASL进行通信。 (此方法支持主题数据的复制。)将值设置为SASL_PLAINTEXT:
security.inter.broker.protocol = SASL_PLAINTEXT

authorizer.class.name
配置授权者类。
将此值设置为kafka.security.auth.SimpleAclAuthorizer:
authorizer.class.name = kafka.security.auth.SimpleAclAuthorizer
有关更多信息,请参见“启用Kerberos时授权访问”。

principal.to.local.class

将Kerberos主体转换为它们的本地Unix用户名。
将此值设置为kafka.security.auth.KerberosPrincipalToLocal:
Principal.to.local.class = kafka.security.auth.KerberosPrincipalToLocal

super.users
指定将具有所有群集权限的用户帐户列表。 默认情况下,这些超级用户拥有所有需要通过kafka-acls.sh脚本添加的权限。 但是请注意,他们的权限不包括通过kafka-topics.sh创建主题的能力,因为这涉及到与 ZooKeeper。
将此值设置为由分号分隔的user:对的列表。 请注意,启用Kerberos时,Ambari会添加user:kafka。

这是一个例子:

super.users=user:bob;user:alice
Kafka服务器的JAAS配置文件

Java身份验证和授权服务(JAAS)API为Java应用程序提供用户身份验证和授权服务。
启用Kerberos后,Ambari会为Kafka服务器设置JAAS登录配置文件。 该文件用于根据Kerberos验证Kafka broker。 该文件存储在:
/usr/hdp/current/kafka-broker/config/kafka_server_jaas.conf
Ambari将以下设置添加到文件中。 (请注意:serviceName =“ kafka”是与其他broker建立连接所必需的。)

KafkaServer {
 com.sun.security.auth.module.Krb5LoginModule required
 useKeyTab=true
 keyTab="/etc/security/keytabs/kafka.service.keytab"
 storeKey=true
 useTicketCache=false
 serviceName="kafka" 
 principal="kafka/c6401.ambari.apache.org@EXAMPLE.COM";
 };
 
Client { // used for zookeeper connection
 com.sun.security.auth.module.Krb5LoginModule required
 useKeyTab=true
 keyTab="/etc/security/keytabs/kafka.service.keytab"
 storeKey=true
 useTicketCache=false
 serviceName="zookeeper"
 principal="kafka/c6401.ambari.apache.org@EXAMPLE.COM";
 };
Kafka Producer的配置设置

Kafka生产者的配置设置的参考信息。
启用Kerberos后,Ambari在server.properties文件中设置以下键/值对:
security.protocol = SASL_PLAINTEXT

Kafka客户端的JAAS配置文件

启用Kerberos后,Ambari会为Kafka客户端设置JAAS登录配置文件。 此文件中的设置将用于连接到已启用Kerberos的Kafka群集的所有客户端(消费者,生产者)。
该文件存储在:
/usr/hdp/current/kafka-broker/config/kafka_client_jaas.conf
Ambari将以下设置添加到文件中。 (注意:serviceName = kafka是与其他broker连接所必需的
。)
带有keytab的Kafka客户端配置,适用于生产者:

KafkaClient {
 com.sun.security.auth.module.Krb5LoginModule required
 useKeyTab=true
 keyTab="/etc/security/keytabs/storm.service.keytab"
 storeKey=true
 useTicketCache=false
 serviceName="kafka"
 principal="storm@EXAMPLE.COM";
 };

不带keytab的Kafka客户端配置,适用于生产者:

KafkaClient {
 com.sun.security.auth.module.Krb5LoginModule required
 useTicketCache=true
 renewTicket=true
 serviceName="kafka";
 };

消费者的Kafka客户端配置:

KafkaClient {
 com.sun.security.auth.module.Krb5LoginModule required
 useTicketCache=true
 renewTicket=true
 serviceName="kafka";
 };
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值