(三)kafka kerberos ACL权限控制

目录

写在前面:

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部署内容
my108192.168.10.108kerberos服务器、zookeeper、kafka
my109192.168.10.109zookeeper、kafka
my110192.168.10.110zookeeper、kafka

(2)zookeeper单独部署,非使用kafka自带;(zookeeper版本:zookeeper-3.4.11;kafka版本:kafka_2.11-2.1.0)

(3)zookeeper与kafka安装部署,参考前面安装部署

1安装kerberos服务器

注意:本例使用在线安装方式,本人对kerberos不是很了解;很多内容为从网上搜集,具体配置内容含义后期补充;

1.1yum安装

yum -y install krb5-workstation krb5-libs krb5-server

1.2配置/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
 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域名称的转换

1.3配置kdc.conf

目录:/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为前面的域名

1.4配置kadm5.acl

目录:/var/kerberos/krb5kdc/kadm5.acl

注意前面定义的域名(本例中为KAFKA.COM)

1.5创建kerberos数据库

创建前看到/var/kerberos/krb5kdc/ 仅有两个文件,创建完成后会生成4个文件,如下

创建命令:kdb5_util create -r KAFKA.COM –s

创建过程中会需要输入密码

创建管理员并输入密码(帐号root/admin(一定要带xxx/admin)带/admin的为管理员,记住密码),参考下面常用命令。

注意:如果想重新创建数据库,把上面4个文件删除,重新创建即可

1.6常用命令

(1)在kerberos服务器上,可以直接使用kadmin.local来登录,之后执行创建命令

创建用户:addprinc 用户名/主机名@域;例:addprinc test/my108@KAFKA.COM
查看所有用户:listprincs
导出票据(目录需要提前创建):xst -norandkey -k /opt/kafka/kafka.keytab kafka/my108@KAFKA.COM

(2)或者使用:/usr/sbin/kadmin.local -q "addprinc admin/admin" 直接执行(双引号内容为执行的命令)

(3)后期补充kinit与klist命令

使用kinit命令用root/admin登录,使用klist查看

1.7设置开机启动kerberos

#启动
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

 1.8其他注意事项

其他非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下载地址:下载

2.zookeeper kerberos配置

2.1生成票据

##生成用户
kadmin.local -q "addprinc -randkey zookeeper/my108@KAFKA.COM "
kadmin.local -q "addprinc -randkey zookeeper/my109@KAFKA.COM "
kadmin.local -q "addprinc -randkey zookeeper/my110@KAFKA.COM "
##导出票据
kadmin.local -q "xst  -k /opt/kerberos/zookeeper.keytab  zookeeper/my108@KAFKA.COM "
kadmin.local -q "xst  -k /opt/kerberos/zookeeper.keytab  zookeeper/my109@KAFKA.COM "
kadmin.local -q "xst  -k /opt/kerberos/zookeeper.keytab  zookeeper/my110@KAFKA.COM "

需要将zookeeper.keytab拷贝到其他节点;上面导出票据会追加到zookeeper.keytab文件中

2.2修改zoo.cfg

文件位置:zookeeper/conf目录下;

在文件中添加入下内容:

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

2.3创建zk_server_jaas.conf文件

在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/my108@KAFKA.COM";
};
Client {
   com.sun.security.auth.module.Krb5LoginModule required
   useKeyTab=true
   keyTab="/opt/kerberos/zookeeper.keytab"
   storeKey=true
   useTicketCache=false
   principal="zookeeper/my108@KAFKA.COM ";
};

其他节点也创建此文件,注意每个节点principal不同;

2.4修改启动文件zkEnv.sh

启动文件添加如下内容:

export JVMFLAGS=" -Djava.security.auth.login.config=$ZOOCFGDIR/zk_server_jaas.conf "

2.5重启zookeeper

zkServer.sh start

3.kafka kerberos配置

3.1生成用户及票据

broker每台服务器在kerberos服务器生成相应的principalkeytab,可以使用kadmin.local登录之后执行如下命令:

##创建kafka用户
addprinc -randkey kafka/my108@KAFKA.COM
addprinc -randkey kafka/my109@KAFKA.COM
addprinc -randkey kafka/my110@KAFKA.COM
##导出票据,可以导到一个文件中
xst -norandkey -k /opt/kerberos/kafka.keytab kafka/my108@KAFKA.COM
xst -norandkey -k /opt/kerberos/kafka.keytab kafka/my109@KAFKA.COM
xst -norandkey -k /opt/kerberos/kafka.keytab kafka/my110@KAFKA.COM

或者:kadmin.local -q "addprinc -randkey kafka/my108@KAFKA.COM"直接执行命令

3.2配置server.properties

直接修改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/my108@KAFKA.COM的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

注意:不同节点对应主机名要修改

3.3创建配置文件kafka_server_jaas.conf

在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/my108@KAFKA.COM";
};
KafkaClient {
        com.sun.security.auth.module.Krb5LoginModule required
        useKeyTab=true
        storeKey=true
        useTicketCache=true
        keyTab="/opt/kerberos/kafka.keytab"
        principal="kafka/my108@KAFKA.COM";
};
Client {
   com.sun.security.auth.module.Krb5LoginModule required
   useKeyTab=true
   storeKey=true
   useTicketCache=true
   keyTab="/opt/kerberos/zookeeper.keytab"
   principal="zookeeper/my108@KAFKA.COM";
};

其中:

KafkaServer是kafka的broker之间认证使用

KafkaClient是kafka客户端连接kafka认证使用

Client是连接zookeeper认证使用

除了KafkaServer,其他两个配置使用票据可以随意

3.4启动文件修改

修改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

3.5增加客户端连接配置client.properties

在kafka/conf目录下增加client.properties(此文件是用来进行生产、消费者认证的),文件内容如下:

security.protocol=SASL_PLAINTEXT
#此处注意与前面server.properties中的保持一致
sasl.kerberos.service.name=kafka
sasl.mechanism=GSSAPI

3.6相关命令

#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授权后执行

3.7kafka 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

 

 

 

 

 

 

3.8java程序改变

生产者、消费者程序在原来生产消费(新版的生产消费)基础上增加如下内容:

//票据相关信息
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/my108@KAFKA.COM";
};

其中的kafka用户及票据可以随意替换成kerberos服务器生成的用户及对应票据;(非superuser用户需要注意使用ACL进行授权)

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值