Linux下搭建zookeeper+kafka+kerberos(基于centos7)

3台机器:
192.168.10.102 安装kafka服务
192.168.10.103 安装zookeeper服务
192.168.10.105 安装kerberos服务
zookeeper是用来提供服务发现之用,搭建kafka集群,注册到zookeeper,为防止消费的异常,搭建kerberos做认证管理,只有通过认证的kafka消费者才可以消费生产者的消息。kerberos在生产者和消费者之间建立共享秘钥,提供身份认证。

kerberos验证在java环境下依赖加解密,需要jce的jar包
下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html (jre8)
下载后将两个jar包解压到%JDK_HOME%/jre/lib/security目录下

1.在192.168.10.105上安装kerberos服务
yum install krb5-server krb5-libs krb5-auth-dialog
2.配置ip和主机域名的映射
修改/etc/hosts文件
vim /etc/hosts
在这里插入图片描述
3.安装完kerberos之后,会有两个配置文件

/etc/krb5.conf   配置realm name
/var/kerberos/krb5kdc/kdc.conf  配置domain-to-realm mappings,主机到域的映射。

配置/var/kerberos/krb5kdc/kdc.conf

[kdcdefaults]
 kdc_ports = 88
 kdc_tcp_ports = 88

[realms]
 XH.COM = {
  #master_key_type = aes256-cts
  acl_file = /var/kerberos/krb5kdc/kadm5.acl
  dict_file = /usr/share/dict/words
  admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab
  supported_enctypes = aes256-cts:normal aes128-cts:normal des3-hmac-sha1:normal arcfour-hmac:normal camellia256-cts:normal camellia128-cts:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal
 }

XH.COM可随意取,代表一个realm,可配置多个realm,此处不讨论。此处的XH.COM必须和/etc/krb5.conf中配置的保持一致。

配置/etc/krb5.conf

#Configuration snippets may be placed in this directory as well
includedir /etc/krb5.conf.d/

[logging]
 default = FILE:/var/log/krb5libs.log
 kdc = FILE:/var/log/krb5kdc.log
 admin_server = FILE:/var/log/kadmind.log

[libdefaults]
 dns_lookup_realm = false
 ticket_lifetime = 24h
 renew_lifetime = 7d
 forwardable = true
 rdns = false
 default_realm = XH.COM
 default_ccache_name = KEYRING:persistent:%{uid}

 #禁止使用udp
 udp_preference_limit = 1

[realms]
  XH.COM = {
    kdc = kdc
    admin_server = kdc
  }

[domain_realm]
  .xh.com = XH.COM
  xh.com = XH.COM

参数说明:
[logging]:表示server端的日志的打印位置
[libdefaults]:每种连接的默认配置,需要注意以下几个关键的小配置
default_realm = XH.COM 默认的realm,必须跟要配置的realm的名称一致。
udp_preference_limit = 1 禁止使用udp
oticket_lifetime表明凭证生效的时限,一般为24小时。
orenew_lifetime表明凭证最长可以被延期的时限,一般为一个礼拜。当凭证过期之后,
对安全认证的服务的后续访问则会失败。
kdc:代表要kdc的位置。格式是 机器:端口
admin_server:代表admin的位置。格式是机器:端口
default_domain:代表默认的域名

4.初始化kerberos并启动

kdb5_util create -s -r XH.COM

其中,[-s]表示生成stash file,并在其中存储master server key(krb5kdc);还可以用[-r]来指定一个realm name —— 当krb5.conf中定义了多个realm时才是必要的。
创建过程中要求输入database的管理密码,此密码需要牢记。
当kerberos database创建好之后,可以在/var/kerberos/krb5kdc目录下看到

kadm5.acl 
kdc.conf 
principal 
principal.kadm5 
principal.kadm5.lock 
principal.ok

6个文件

启动Kerberos服务
低于centos7版本:

service krb5kdc start
service kadmin start

设置开机自启动

chkconfig krb5kdc on
chkconfig kadmin on

centos7版本及以上:

systemctl start krb5kdc.service
systemctl start kadmin.service

设置开机自启动

systemctl enable krb5kdc.service
systemctl enable kadmin.service

5.添加kerberos用户并生成密钥表文件

kadmin.local -q "addprinc -randkey zookeeper/kdc@XH.COM"
kadmin.local -q "addprinc -randkey kafka/kdc@XH.COM"

或者通过kadmin.local命令进入kadmin服务:
在这里插入图片描述
因为之前添加过zookeeper的用户,所以此处显示zookeeper用户已经存在。
在192.168.10.103上搭建的zookeeper服务,因为kafka自带的zookeeper服务不好用,所以此处单独搭建了一个zookeeper服务。
因为需要在192.168.10.103上搭建zookeeper服务和在192.168.10.102上搭建kafka服务,所以还需要建立用户zookeeper/slave2@XH.COM、 kafka/slave1@XH.COM,如果是单机,只需要建立上面zookeeper/kdc@XH.COM和kafka/kdc@XH.COM两个用户即可。

生成keytab密钥表文件
在这里插入图片描述

7.在192.168.10.105上验证用户是否可用
使用kinit命令:

kinit -kt /etc/security/keytabs/zookeeper.keytab zookeeper/kdc@XH.COM

/etc/security/keytabs为存放keytab文件的路径,这个可以自己选择
在这里插入图片描述
再通过klist命令查看连接是否建立。
Default principal就是建立的用户,Valid starting是认证开始时间,Expires是到期时间。

8.在192.168.10.102和192.168.10.103上安装kerberos客户端服务

yum -y install krb5-workstation krb5-libs

配置/etc/krb5.conf

#Configuration snippets may be placed in this directory as well
includedir /etc/krb5.conf.d/

[logging]
 default = FILE:/var/log/krb5libs.log
 kdc = FILE:/var/log/krb5kdc.log
 admin_server = FILE:/var/log/kadmind.log

[libdefaults]
 dns_lookup_realm = false
 ticket_lifetime = 24h
 renew_lifetime = 7d
 forwardable = true
 rdns = false
 default_realm = XH.COM
 default_ccache_name = KEYRING:persistent:%{uid}

 #禁止使用udp
 udp_preference_limit = 1

[realms]
  XH.COM = {
    kdc = kdc
  }

[domain_realm]
  .xh.com = XH.COM
  xh.com = XH.COM

9.将keytab文件拷贝到192.168.10.103上
因为zookeeper服务安装在192.168.10.103上,需要将keytab文件拷贝过去才可以使用

scp /etc/security/keytabs/zookeeper.keytab root@192.168.10.103:/etc/security/keytabs/zookeeper.keytab

在这里插入图片描述
在192.168.10.103上验证keytab文件可用
在这里插入图片描述

10.在192.168.10.103上安装zookeeper
从官网下载zookeeper压缩包

wget http://mirrors.hust.edu.cn/apache/zookeeper/stable/zookeeper-3.4.12.tar.gz

解压

tar -zxvf zookeeper-3.4.12.tar.gz -C /usr/local/

切换目录

cd /usr/local/zookeeper-3.4.12

11.配置zookeeper的kerberos验证
切换到配置文件目录下cd conf
添加zoo.cfg配置文件,cp zoo_sample.cfg zoo.cfg
打开zoo.cfg配置文件,添加配置

#kerberos
authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
jaasLoginRenew=3600000

添加配置文件jaas.conf

Server {
  com.sun.security.auth.module.Krb5LoginModule required
  useKeyTab=true
  keyTab="/etc/security/keytabs/zookeeper.keytab"
  storeKey=true
  useTicketCache=false
  principal="zookeeper/slave2@XH.COM";
};

添加配置文件java.env

export JVMFLAGS="-Djava.security.auth.login.config=/usr/local/zookeeper/conf/jaas.conf"

12.启动zookeeper服务
切换到bin目录下

cd ../bin
./zkServer.sh start

通过./zkServer status查看服务启动状态
(PS:可以将此目录添加到环境变量,不需要每次都在此目录下启动)

13.将kafka用户的keytab文件拷贝到192.168.10.102

scp /etc/security/keytabs/kafka.keytab root@192.168.10.102:/etc/security/keytabs/kafka.keytab

14.验证kafka用户可用
在这里插入图片描述

15.安装kafka服务
下载kafka

wget http://mirrors.shu.edu.cn/apache/kafka/2.0.0/kafka_2.12-2.0.0.tgz

解压压缩包

tar -zxvf kafka_2.12-2.0.0.tgz -C /usr/local

切换目录

cd /usr/local/kafka_2.12-2.0.0

16.配置kafka的kerberos认证
切换目录 cd config
创建jaas.conf配置文件,添加配置如下:

KafkaServer {
       com.sun.security.auth.module.Krb5LoginModule required
       useKeyTab=true
       storeKey=true
       useTicketCache=false
       serviceName="kafka"
       keyTab="/etc/security/keytabs/kafka.keytab"
       principal="kafka/slave1@XH.COM";
};
KafkaClient {
     com.sun.security.auth.module.Krb5LoginModule required
     useKeyTab=true
     keyTab="/etc/security/keytabs/kafka.keytab"
     storeKey=true
     useTicketCache=false
     serviceName="kafka"
     principal="kafka/slave1@XH.COM";
};
Client {
  com.sun.security.auth.module.Krb5LoginModule required
  useKeyTab=true
  keyTab="/etc/security/keytabs/zookeeper.keytab"
  storeKey=true
  useTicketCache=false
  principal="zookeeper/slave2@XH.COM";
};

其中Client是用来向zookeeper注册。

修改server.properties配置
zookeeper.connect=slave2:2181 其中slave2是192.168.10.103的主机名

添加配置

#kerberos
listeners=SASL_PLAINTEXT://slave1:9092
advertised.listeners=SASL_PLAINTEXT://slave1:9092
security.inter.broker.protocol=SASL_PLAINTEXT
sasl.mechanism.inter.broker.protocol=GSSAPI
principal.to.local.class=kafka.security.auth.KerberosPrincipalToLocal
isasl.enabled.mechanisms=GSSAPI

在bin/kafka-run-class.sh脚本中添加kafka jvm参数

# JVM performance options
if [ -z "$KAFKA_JVM_PERFORMANCE_OPTS" ]; then
  KAFKA_JVM_PERFORMANCE_OPTS="-server -XX:+UseG1GC -XX:MaxGCPauseMillis=20 -XX:InitiatingHeapOccupancyPercent=35 -XX:+DisableExplicitGC -Djava.awt.headless=true -Djava.security.krb5.conf=/etc/krb5.conf -Djava.security.auth.login.config=/usr/local/kafka_2.12-2.0.0/config/jaas.conf -Dzookeeper.sasl.client.username=zookeeper"
fi

修改生产者配置文件producer.properties,添加以下配置

#kerberos
security.protocol=SASL_PLAINTEXT
sasl.mechanism=GSSAPI
sasl.kerberos.service.name=kafka

修改消费者配置文件consumer.properties

修改
zookeeper.connect=slave2:2181
添加配置
#kerberos
security.protocol=SASL_PLAINTEXT
sasl.mechanism=GSSAPI
sasl.kerberos.service.name=kafka

17.启动kafka服务

nohup bin/kafka-server-start.sh config/server.properties &

查看nohup日志 tail -f nohup.out,查看服务启动是否成功

18.生产消费
生产消息:

bin/kafka-console-producer.sh --broker-list slave1:9092 --topic test --producer.config config/producer.properties

在这里插入图片描述

消费消息:

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

在这里插入图片描述

(PS:我的102服务器磁盘空间满了,所以在103上演示的,结果是一样的。)

评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值