kafka0.11部署SASL/PLAIN认证

版权声明:本文为博主原创文章,欢迎转载,转载时请注明链接。 https://blog.csdn.net/hunter_yang_Tuziki/article/details/80321386

kafka部署

本教程将在一台设备上部署3个kafka broker,1个zookeeper组成kafka集群,其中kafka broker分别使用909290939094端口数据分别存放在/data目录下的kafka-1kafka-2kafka-3目录,zookeeper使用2181端口。
该教程中kafka版本使用kafka_2.11-0.11.0.2,安全认证使用SASL/PLAIN。

1. 下载与安装

关于下载和安装,可以参考官方文档 quick-start,可以分为如下几点
- 确保已经安装了java 1.8

  • 下载与解压

    下载kafka_2.11-1.1.0.tgz

    解压并将得到的内容放到/usr/local/kafka

2. 配置

配置文件在/usr/local/kafka/config下,以下所有配置请确保配置中的路径已经存在且有对应的权限
- 修改kafka配置

修改`server.properties`文件的以下几项:
```conf
# broker id 区别集群中其它broker
broker.id=0
# 数据存放路径
log.dirs=/data/kafka-1
# zookeeper地址
zookeeper.connect=localhost:2181
# 数据存活时长
log.retention.hours=2
```
之后,将`server.properties`重命名为`server-1.properties`,然后复制为`server-2.properties`、`server-3.properties`用户另外两个broker。修改`server-2.properties`、`server-3.properties`中的`broker.id`和`log.dirs`以互相区别。

- 修改zookeeper配置

修改`zookeeper.properties`的`dataDir=/data/zookeeper`。

3. 配置认证

Kafka uses the Java Authentication and Authorization Service (JAAS) for SASL configuration

配置认证需要三个部分的操作,第一部分创建JAAS配置文件,第二部分修改启动命令加载上述配置文件, 第三部分修改properties文件添加认证方式。

3-1. 创建JAAS配置文件

需要在config下创建如下三个文件,先看下面三个文件,后面会逐个讲解其中涉及到的用户名和密码。

zoookeeper_jaas.conf

Server {
    org.apache.kafka.common.security.plain.PlainLoginModule required
    username="cluster"
    password="clusterpasswd"
    user_kafka="kafkapasswd";
};

kafka_server_jaas.conf

KafkaServer {
    org.apache.kafka.common.security.plain.PlainLoginModule required
    username="cluster"
    password="clusterpasswd"
    user_cluster="clusterpasswd"
    user_foo="foopasswd"
    user_producer="produerpasswd"
    user_consumer="consumerpasswd";
};
Client { 
    org.apache.kafka.common.security.plain.PlainLoginModule required
    username="kafka"
    password="kafkapasswd";
};

kafka_client_jaas.conf

KafkaClient {
        org.apache.kafka.common.security.plain.PlainLoginModule required
        username="foo"
        password="foopasswd";
};

zoookeeper_jaas.conf在zookeeper服务启动时加载,为zookeeper添加认证。其中username="cluster"password="clusterpasswd"是zookeeper集群(对,zookeeper也可以建成集群,我们这里只建了一个)之间通信所需的用户名和密码。user_kafka="kafkapasswd"则规定了一个用户名为kafka密码为kafkapasswd的用户,这个用户相当于zookeeper的一个“使用者”,本文中“使用者”是kafka server。

kafka_server_jaas.conf在kafka server服务启动时加载,为kafka添加认证。该文件分为两个部分——KafkaServer和Client,KafkaServer用于kafka集群之间和kafka服务的认证,Clinet部分用于连接zookeeper。KafkaServer中username="cluster"password="clusterpasswd"是kafka集群中各个broker之间通信所需的用户名和密码,user_*涉及的用户相当于kafka server的用户(例如生产者,消费者),这里需要注意的是必须有user_cluster用户且其密码需与username="cluster"相同,而且需要保证zoookeeper_jaas.conf中的username="cluster"一样,cluster可以是其他的单词有些教程用admin,但是要保证这三处相同,具体机制我还不明白。

kafka_client_jaas.conf在启动kafka producer/consumer命令时加载,相当于在客户端访问kafka服务时需要输入的用户名和密码,其中需要填写kafka_server_jaas.conf的KafkaServer部分的任意一个user_*用户信息。

3-2. 修改启动命令

修改bin/目录下的kafka-run-class.shzookeeper-server-start.shkafka-console-consumer.shkafka-console-producer.sh

  • 修改kafka-run-class.sh

# Launch mode位置做如下修改,其实只修改了KAFKA_SASL_OPTS出现的部分。

# Launch mode
KAFKA_SASL_OPTS="-Djava.security.auth.login.config=$base_dir/config/kafka_server_jaas.conf"
if [ "x$DAEMON_MODE" = "xtrue" ]; then
nohup $JAVA $KAFKA_HEAP_OPTS $KAFKA_JVM_PERFORMANCE_OPTS $KAFKA_GC_LOG_OPTS $KAFKA_SASL_OPTS $KAFKA_JMX_OPTS $KAFKA_LOG4J_OPTS -cp $CLASSPATH $KAFKA_OPTS "$@" > "$CONSOLE_OUTPUT_FILE" 2>&1 <
/dev/null &
else
exec $JAVA $KAFKA_HEAP_OPTS $KAFKA_JVM_PERFORMANCE_OPTS $KAFKA_GC_LOG_OPTS $KAFKA_SASL_OPTS $KAFKA_JMX_OPTS $KAFKA_LOG4J_OPTS -cp $CLASSPATH $KAFKA_OPTS "$@"
fi
  • 修改zookeeper-server-start.sh
    base_dir=$(dirname $0)下添加一行
export KAFKA_OPTS="-Djava.security.auth.login.config=$base_dir/../config/zookeeper_jaas.conf"
  • 修改kafka-console-consumer.shkafka-console-producer.sh
    在该文件开头添加如下代码:
base_dir=$(dirname $0)/..
if [ "x$KAFKA_OPTS" ]; then
 export KAFKA_OPTS="-Djava.security.auth.login.config=$base_dir/config/kafka_client_jaas.conf"
fi

3-3. 修改properties文件

对,又要修改server-*.propertieszookeeper.properties两个文件了,为了区别基础配置和认证配置,我将两次配置分开了,这里写认证先关的配置。

另外,为了能使用命令行运行produer和consumer,还需要修改produer.propertiesconsumer.properties两个文件。

  • server-*.properties配置修改

    修改原来的listenersSASL_PLAINTEXT://:9092,然后添加4项其它的配置,修改后如下

    listeners=SASL_PLAINTEXT://:9092
    security.inter.broker.protocol=SASL_PLAINTEXT
    sasl.mechanism.inter.broker.protocol=PLAIN 
    sasl.enabled.mechanisms=PLAIN
    allow.everyone.if.no.acl.found=true
  • zookeeper.properties配置修改

    在文件末尾添加如下几行:

    authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
    requireClientAuthScheme=sasl
    jaasLoginRenew=3600000
  • produer.propertiesconsumer.properties配置修改
    在文件末尾添加如下两行
    conf
    security.protocol=SASL_PLAINTEXT
    sasl.mechanism=PLAIN

4. 启动、测试

  • 先启动zookeeper,然后依次启动3个broker
    bash
    bin/zookeeper-server-start.sh config/zookeeper.properties &
    bin/kafka-server-start.sh config/server-1.properties &
    bin/kafka-server-start.sh config/server-2.properties &
    bin/kafka-server-start.sh config/server-3.properties &
  • 创建一个topic

    bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test
  • 创建produer,生产数据

    bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test --producer.config config/producer.properties
  • 创建consumer,消费数据

    bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning --consumer.config config/consumer.properties

示例

from kafka import KafkaConsumer
config = config = {
    'bootstrap_servers':'192.168.1.5:9092',
    'security_protocol':'SASL_PLAINTEXT',
    'sasl_mechanism':'PLAIN',
    'sasl_plain_username':'foo',
    'sasl_plain_password':'foopasswd',
    'api_version':(0, 11, 0)
}
c = KafkaConsumer('test_topic', **config)
for msg in c:
    print(msg.value.decode())

参考链接:
Kafka的SASL/PLAIN认证配置说明
kafka使用SASL验证
Kafka 0.10.0 SASL/PLAIN身份认证及权限实现
Security between Kafka and zookeeper using SASL | Kafka and ZK authentication using SASL

猜你喜欢

转载自blog.csdn.net/hunter_yang_Tuziki/article/details/80321386