目录
写在前面:
1安装kerberos服务器
1.1yum安装
1.2配置/etc/krb5.conf
1.3配置kdc.conf
1.4配置kadm5.acl
1.5创建kerberos数据库
1.6常用命令
1.7设置开机启动kerberos
1.8其他注意事项
2.zookeeper kerberos配置
2.1生成票据
2.2修改zoo.cfg
2.3创建zk_server_jaas.conf文件
2.4修改启动文件zkEnv.sh
2.5重启zookeeper
3.kafka kerberos配置
3.1生成用户及票据
3.2配置server.properties
3.3创建配置文件kafka_server_jaas.conf
3.4启动文件修改
3.5增加客户端连接配置client.properties
3.6相关命令
3.7kafka ACL控制
3.8java程序改变
(1)本例使用三台服务器(VMware虚拟机搭建,centos7),已在hosts中配置主机与IP映射
主机 | IP | 部署内容 |
my108 | 192.168.10.108 | kerberos服务器、zookeeper、kafka |
my109 | 192.168.10.109 | zookeeper、kafka |
my110 | 192.168.10.110 | zookeeper、kafka |
(2)zookeeper单独部署,非使用kafka自带;(zookeeper版本:zookeeper-3.4.11;kafka版本:kafka_2.11-2.1.0)
(3)zookeeper与kafka安装部署,参考前面安装部署
注意:本例使用在线安装方式,本人对kerberos不是很了解;很多内容为从网上搜集,具体配置内容含义后期补充;
yum -y install krb5-workstation krb5-libs krb5-server
# 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
pkinit_anchors = /etc/pki/tls/certs/ca-bundle.crt
default_realm = KAFKA.COM
default_ccache_name = KEYRING:persistent:%{uid}
[realms]
KAFKA.COM = {
kdc = my108
admin_server = my108
}
[domain_realm]
.kafka.com = KAFKA.COM
kafka.com = KAFKA.COM
my108 = KAFKA.COM
注意:
default_realm为默认的域名,名字随意(注意最好要大写)
realms中的内容即为上面的域,里面的kdc与admin_server为本机主机名
domain_realm:提供从域名或主机名到Kerberos域名称的转换
目录:/var/kerberos/krb5kdc/kdc.conf
kdc_ports = 88
kdc_tcp_ports = 88
[realms]
KAFKA.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
}
注意域名KAFKA.COM为前面的域名
目录:/var/kerberos/krb5kdc/kadm5.acl
注意前面定义的域名(本例中为KAFKA.COM)
创建前看到/var/kerberos/krb5kdc/ 仅有两个文件,创建完成后会生成4个文件,如下
创建命令:kdb5_util create -r KAFKA.COM –s
创建过程中会需要输入密码
创建管理员并输入密码(帐号root/admin(一定要带xxx/admin)带/admin的为管理员,记住密码),参考下面常用命令。
注意:如果想重新创建数据库,把上面4个文件删除,重新创建即可
(1)在kerberos服务器上,可以直接使用kadmin.local来登录,之后执行创建命令
创建用户:addprinc 用户名/主机名@域;例:addprinc test/[email protected]
查看所有用户:listprincs
导出票据(目录需要提前创建):xst -norandkey -k /opt/kafka/kafka.keytab kafka/[email protected]
(2)或者使用:/usr/sbin/kadmin.local -q "addprinc admin/admin" 直接执行(双引号内容为执行的命令)
(3)后期补充kinit与klist命令
使用kinit命令用root/admin登录,使用klist查看
#启动
service krb5kdc start
service kadmin start
或
systemctl start krb5kdc.service
systemctl start kadmin.service
#开机启动
chkconfig krb5kdc on
chkconfig kadmin on
或
systemctl enable krb5kdc.service
systemctl enable kadmin.service
其他非kerberos服务器,直接将/etc/krb5.conf拷贝过去就可以(scp -r /etc/krb5.conf root@host:/etc/)
kerberos认证的几台服务器时间戳要保持同步(本例中my108/my109/my110要保持一致非常重要)
官网提示:如果安装的是oracle java;需要下载jce策略文件,替换掉$JAVA_HOME/jre/lib/security中的文件,jdk8下载地址:下载
##生成用户
kadmin.local -q "addprinc -randkey zookeeper/[email protected] "
kadmin.local -q "addprinc -randkey zookeeper/[email protected] "
kadmin.local -q "addprinc -randkey zookeeper/[email protected] "
##导出票据
kadmin.local -q "xst -k /opt/kerberos/zookeeper.keytab zookeeper/[email protected] "
kadmin.local -q "xst -k /opt/kerberos/zookeeper.keytab zookeeper/[email protected] "
kadmin.local -q "xst -k /opt/kerberos/zookeeper.keytab zookeeper/[email protected] "
需要将zookeeper.keytab拷贝到其他节点;上面导出票据会追加到zookeeper.keytab文件中
文件位置:zookeeper/conf目录下;
在文件中添加入下内容:
authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
jaasLoginRenew=3600000
在zookeeper/conf目录下,新建zk_server_jaas.conf文件(vi zk_server_jaas.conf)
Server {
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=true
storeKey=true
useTicketCache=false
keyTab="/opt/kerberos/zookeeper.keytab"
principal="zookeeper/[email protected]";
};
Client {
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=true
keyTab="/opt/kerberos/zookeeper.keytab"
storeKey=true
useTicketCache=false
principal="zookeeper/[email protected] ";
};
其他节点也创建此文件,注意每个节点principal不同;
启动文件添加如下内容:
export JVMFLAGS=" -Djava.security.auth.login.config=$ZOOCFGDIR/zk_server_jaas.conf "
zkServer.sh start
为broker每台服务器在kerberos服务器生成相应的principal和keytab,可以使用kadmin.local登录之后执行如下命令:
##创建kafka用户
addprinc -randkey kafka/[email protected]
addprinc -randkey kafka/[email protected]
addprinc -randkey kafka/[email protected]
##导出票据,可以导到一个文件中
xst -norandkey -k /opt/kerberos/kafka.keytab kafka/[email protected]
xst -norandkey -k /opt/kerberos/kafka.keytab kafka/[email protected]
xst -norandkey -k /opt/kerberos/kafka.keytab kafka/[email protected]
或者:kadmin.local -q "addprinc -randkey kafka/[email protected]"直接执行命令
直接修改kafka/conf下的server.properties文件,或者复制一份修改,最后启动的时候指向的复制的配置文件(本例直接修改)
advertised.host.name=my108
advertised.listeners=SASL_PLAINTEXT://my108:9092
listeners=SASL_PLAINTEXT://my108:9092
#kerberos相关设置
security.inter.broker.protocol=SASL_PLAINTEXT
sasl.mechanism.inter.broker.protocol=GSSAPI
sasl.enabled.mechanisms=GSSAPI
#与上面为kafka建立的principal相同,kafka/[email protected]的principal服务名就是kafka
sasl.kerberos.service.name=kafka
#acl相关,broker服务采用kafka这个服务身份进行交互,只有配置成superuser才能获取集群内的元数据信息
super.users=User:kafka
#acl相关,配置后才能启用acl
authorizer.class.name=kafka.security.auth.SimpleAclAuthorizer
#创建、删除topic相关(此部分可以不配置)
auto.create.topics.enable = false
delete.topic.enable=true
注意:不同节点对应主机名要修改
在kafka/conf目录下创建kafka_server_jaas.conf文件(vi kafka_server_jaas.conf);用来指定票据等信息
KafkaServer {
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=true
storeKey=true
keyTab="/opt/kerberos/kafka.keytab"
principal="kafka/[email protected]";
};
KafkaClient {
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=true
storeKey=true
useTicketCache=true
keyTab="/opt/kerberos/kafka.keytab"
principal="kafka/[email protected]";
};
Client {
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=true
storeKey=true
useTicketCache=true
keyTab="/opt/kerberos/zookeeper.keytab"
principal="zookeeper/[email protected]";
};
其中:
KafkaServer是kafka的broker之间认证使用
KafkaClient是kafka客户端连接kafka认证使用
Client是连接zookeeper认证使用
除了KafkaServer,其他两个配置使用票据可以随意
修改kafka/bin目录下kafka-run-class.sh
在exec $JAVA 后面增加kerberos启动参数,然后就可以用正常的脚本启动服务了
-Djava.security.krb5.conf=/etc/krb5.conf -Djava.security.auth.login.config=/home/kafka/config/kafka_server_jaas.conf
在kafka/conf目录下增加client.properties(此文件是用来进行生产、消费者认证的),文件内容如下:
security.protocol=SASL_PLAINTEXT
#此处注意与前面server.properties中的保持一致
sasl.kerberos.service.name=kafka
sasl.mechanism=GSSAPI
#broker启动(后台启动)
/home/kafka_2.11-2.1.0/bin/kafka-server-start.sh -daemon /home/kafka_2.11-2.1.0/config/server.properties
#创建topic
kafka-topics.sh --create --zookeeper my108:2181 --replication-factor 2 --partitions 3 --topic test111
#生产者启动(在kafka/conf目录下执行,指定client.properties)
../bin/kafka-console-producer.sh --broker-list my108:9092 --topic test111 --producer.config client.properties
#消费者启动(在kafka/conf目录下执行,指定client.properties)
../bin/kafka-console-consumer.sh --bootstrap-server my108:9092 --topic test111 --consumer.config client.properties
如果要测试不同用户,只需要修改kafka_server_jaas.conf文件中的KafkaClient即可
上面的生产消费者测试,是在kafka这个用户下执行(因为是超级用户);其他用户则需要在下面ACL授权后执行
#查看访问控制列表
kafka-acls.sh --authorizer-properties zookeeper.connect=my108:2181,my109:2181,my110:2181 --list
#对用户授权生产者权限
kafka-acls.sh --authorizer-properties zookeeper.connect=my108:2181,my109:2181,my110:2181 --add --allow-principal User:test --producer --topic test111
#对用户授权消费者权限
kafka-acls.sh --authorizer-properties zookeeper.connect=my108:2181,my109:2181,my110:2181 --add --allow-principal User:test --consumer --group group1 --topic test111
#对用户授权读写操作
kafka-acls.sh --authorizer-properties zookeeper.connect=my108:2181,my109:2181,my110:2181 --add --allow-principal User:test --operation Read --operation Write --topic test111
常用命令(参考官网:点这里;或在命令行中输入kafka-acls.sh --help即可查看所有操作说明):
操作 |
描述 |
默认 |
类型 |
--add |
增加 |
|
Action |
--remove |
删除 |
|
Action |
--list |
列表 |
|
Action |
--authorizer-properties |
类似于key=val格式 如:zookeeper.connect=localhost:2181
|
|
Configuration |
--topic |
|
|
|
--group |
如果是消费者,必须指定group |
|
|
-allow-principal |
指定用户,可以多个; 后面跟: User:username |
|
|
--deny-principal |
拒绝用户 |
|
|
--allow-host |
允许IP,*代表所有 |
|
|
--deny-host |
拒绝IP,*代表所有 |
|
|
--operation |
操作,可选值:Read,Write,Create,Delete,Alter,Describe,ClusterAction,All 注意首字母大写 |
All |
|
--producer |
设置为producer,即允许: Write,Describe,Create |
|
|
--consumer |
设置为consumer,即允许: Read,Describe |
|
|
|
|
|
|
生产者、消费者程序在原来生产消费(新版的生产消费)基础上增加如下内容:
//票据相关信息
System.setProperty("java.security.auth.login.config", "/opt/kerberos/kafka_client_jaas.conf");
System.setProperty("java.security.krb5.conf", "/etc/krb5.conf");
//固定配置
props.put("security.protocol", "SASL_PLAINTEXT");
props.put("sasl.mechanism", "GSSAPI");
props.put("sasl.kerberos.service.name","kafka");//与server.properties中配置一致
注意:
(1)krb5.conf固定配置,在前面kerberos中有;票据相关信息的文件位置自己决定
(2)kafka_client_jaas.conf配置类似于kafka_server_jaas.conf文件,(用来指定kerberos生成的用户及票据,票据需要kerberos服务端生成,参考前面3.1节)
kafka_client_jaas.conf文件配置如下:
KafkaClient {
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=true
storeKey=true
keyTab="/opt/kerberos/kafka.keytab"
principal="kafka/[email protected]";
};
其中的kafka用户及票据可以随意替换成kerberos服务器生成的用户及对应票据;(非superuser用户需要注意使用ACL进行授权)