标题为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";
};