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 /ets/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/[email protected]”
kadmin.local -q “addprinc -randkey kafka/[email protected]”
或者通过kadmin.local命令进入kadmin服务:
因为之前添加过zookeeper的用户,所以此处显示zookeeper用户已经存在。
在192.168.10.103上搭建的zookeeper服务,因为kafka自带的zookeeper服务不好用,所以此处单独搭建了一
个zookeeper服务。
因为需要在192.168.10.103上搭建zookeeper服务和在192.168.10.102上搭建kafka服务,所以还需要建立用户
zookeeper/[email protected] kafka/[email protected],如果是单机,只需要建立上面zookeeper/[email protected]和
kafka/[email protected]两个用户即可。
7.在192.168.10.105上验证用户是否可用
使用kinit命令,
kinit -kt /etc/security/keytabs/zookeeper.keytab zookeeper/[email protected]
/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 [email protected]:/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/[email protected]”;
};
添加配置文件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 [email protected]:/etc/security/keytabs/kafka.keytab
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/[email protected]”;
};
KafkaClient {
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=true
keyTab="/etc/security/keytabs/kafka.keytab"
storeKey=true
useTicketCache=false
serviceName=“kafka”
principal=“kafka/[email protected]”;
};
Client {
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=true
keyTab="/etc/security/keytabs/zookeeper.keytab"
storeKey=true
useTicketCache=false
principal=“zookeeper/[email protected]”;
};
其中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参数
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上演示的,结果是一样的。)