kafka0.11部署SASL/PLAIN认证

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文件的以下几项:

    # 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.propertiesserver-3.properties用户另外两个broker。修改server-2.propertiesserver-3.properties中的broker.idlog.dirs以互相区别。

  • 修改zookeeper配置

    修改zookeeper.propertiesdataDir=/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配置修改
    在文件末尾添加如下两行

    security.protocol=SASL_PLAINTEXT
    sasl.mechanism=PLAIN
    

4. 启动、测试

  • 先启动zookeeper,然后依次启动3个broker
    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服务器的hostname,默认的当使用pykafka等和kafka建立连接时,客户端会使用kafka服务器的hostname和kafka服务进行通信。

可通过在servser.properties添加配置项`advertised.host.name=主机的ip`来解决这个问题。

也可以给kafka主机设置一个有意义的hostname,并在客户端主机的/etc/hosts中添加hostname到ip的关系。

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值