kafka集群安全化之启用kerberos与acl
一、背景
在我们部署完kafka之后,虽然我们已经可以“肆意”的用kafka了,但是在一个大公司的实际生产环境中,kafka集群往往十分庞大,每个使用者都应该只关心自己所负责的Topic,并且对其他人所使用的Topic没有权限。这样一来可以将资源隔离开来,二来可以防止误操作。
在权限控制之前,我们必须要启用的就是用户认证,没有用户,自然没有权限一说了。
二、kafka启用kerberos认证
2.1 在KDC中添加kafka用户,并生成keytab
新建kfaka用户 |
kadmin.local -q 'addprinc -randkey kafka/{hostname}@{REALM}' |
生成keytab |
kadmin.local -q "ktadd -k /etc/security/keytabs/{keytabname}.keytab kafka/{hostname}@{REALM}" |
注意:
1、如果之前zookeeper没有启用kerberos,这里也要启用zookeeper的kerberos
2、如果之前在CM中启用了kerberos,我们可以直接从CM中获取keytab,但是注意keytab一定要保持最新的,否则认证不会通过,keytab的位置是:
/var/run/cloudera-scm-agent/process/****-kafka-KAFKA_BROKER/kafka.keytab
/var/run/cloudera-scm-agent/process/****-zookeeper-server/zookeeper.keytab
2.2 修改server.properties
//修改这一句 listeners=SASL_PLAINTEXT://host.name:port //新增以下 authorizer.class.name = kafka.security.auth.SimpleAclAuthorizer security.inter.broker.protocol=SASL_PLAINTEXT sasl.mechanism.inter.broker.protocol=GSSAPI sasl.enabled.mechanisms=GSSAPI sasl.kerberos.service.name=kafka super.users=User:kafka |
2.3 新建kafka_server.jaass
KafkaServer { com.sun.security.auth.module.Krb5LoginModule required useKeyTab=true storeKey=true serviceName="kafka" keyTab="/etc/keytab/kafka_122.keytab" //替换为自己的keytab所在位置 principal="kafka/{hostname}@{REALM}";//替换为自己的keytab所对应principle }; // Zookeeper client authentication,因为卡夫卡使用过程中会和zookeeper进行交互 Client { com.sun.security.auth.module.Krb5LoginModule required useKeyTab=true storeKey=true serviceName="zookeeper" keyTab="/etc/keytab/kafka_122.keytab" //替换为自己的keytab所在位置 principal="kafka/{hostname}@{REALM}";//替换为自己的keytab所对应principle }; |
2.4 修改启动脚本
export KAFKA_OPTS="-Djava.security.krb5.conf=/etc/krb5.conf -Djava.security.auth.login.config=/root/kafka/config/kafka_server.jaas" //刚才的kafka_server.jaas位置 |
2.5重启broker
bin/kafka-server-stop.sh bin/kafka-server-start.sh |
2.6 客户端启用kerberos
在broker启用kerberos之后,如果我们后续需要在命令行界面进行操作,及consumer与producer操作,我们需要在这些客户端也配置上kerberos
2.6.1新增kafka_client.jaas
KafkaClient { com.sun.security.auth.module.Krb5LoginModule required useKeyTab=true storeKey=true keyTab="/etc/keytab/kafka_122.keytab" serviceName="kafka" principal="kafka/{hostname}@{REALM}"; }; // Zookeeper client authentication Client { com.sun.security.auth.module.Krb5LoginModule required useKeyTab=true storeKey=true serviceName="zookeeper" keyTab="/etc/keytab/kafka_122.keytab" principal="kafka/{hostname}@{REALM}"; }; |
2.6.2配置生效
当前会话生效: export KAFKA_OPTS="-Djava.security.krb5.conf=/etc/krb5.conf -Djava.security.auth.login.config=/opt/kafka/config/kafka_client.jaas" |
配置到环境变量中 vim /etc/profile 增加 export KAFKA_OPTS="-Djava.security.krb5.conf=/etc/krb5.conf -Djava.security.auth.login.config=/opt/kafka/config/kafka_client.jaas" |
2.6.3若有用到consumer或者producer,在consumer.properties或producer.properties中增加
security.protocol=SASL_PLAINTEXT sasl.mechanism=GSSAPI sasl.kerberos.service.name=kafka |
三、kafka启用acl
Kafka认证管理CLI(和其他的CLI脚本)可以在bin目录中找到。CLI脚本名是kafka-acls.sh。启用之前,需要在server.properties里添加这句:
allow.everyone.if.no.acl.found=false |
四、MirrorMaker的跨域同步
4.1 修改kerberos配置
添加互信principle |
kadmin.local下操作 addprinc krbtgt/{REALMA}@{REALMB} addprinc krbtgt/{REALMB}@{REALMA} |
修改krb5.conf |
[realms]//realms 里配上两个域的信息 HADOOP.SPADE.COM = { kdc = hb21-bd-cm-130-61:88 admin_server = hb21-bd-cm-130-61:749 } HADOOP.TEST.COM = { kdc = tk-dba-hadoop-152:88 admin_server = tk-dba-hadoop-152:749 } [domain_realm] //domain_realm 配上域名和主机名的映射,有多少机器就要配多少 tk-dba-hadoop-154 = HADOOP.TEST.COM hb21-dba-kfk-130-120 = HADOOP.SPADE.COM [capaths] //capaths 配上互信的域的映射 HADOOP.SAPDE.COM ={ HADOOP.TEST.COM = . } HADOOP.TEST.COM={ HADOOP.SPADE.COM = . } |
4.2 修改broker配置
添加sasl.kerberos.principal.to.local.rules属性
sasl.kerberos.principal.to.local.rules=RULE:[1:$1@$0](.*@\HADOOP.TEST.COM$)s/@\HADOOP.TEST.COM$//,RULE:[2:$1@$0](.*@\HADOOP.TEST.COM$)s/@\HADOOP.TEST.COM$//,RULE:[1:$1@$0](.*@\HADOOP.SPADE.COM$)s/@\HADOOP.SPADE.COM$//,RULE:[2:$1@$0](.*@\HADOOP.SPADE.COM$)s/@\HADOOP.SPADE.COM$//,DEFAULT |
4.3 验证互信是否成功
从域B中复制出keytab到域A的机器中,然后在A中使用该keytab,配置jaas文件,导入环境变量中。用该keytab操作集群A或者集群B中的topic,能正常写入数据即为成功。
五、启用kerberos之后的平滑过度期
生产环境启用kerberos之后,为了给业务向的consumer和producer一个平滑的接入认证系统的缓冲时间,这段时间我们可以给kafka启用两个监听端口,一个是需要kerberos认证的端口,一个不需要认证的端口。让他们共同存在,同时服务。
5.1 增加监听端口
修改server.properties |
listeners=SASL_PLAINTEXT://10.21.130.120:9092,PLAINTEXT://10.21.130.120:9093 allow.everyone.if.no.acl.found=false |
5.2 添加ANONYMOUS用户的访问权限
bin/kafka-acls.sh --add --authorizer-properties zookeeper.connect={host:port/childpath} --allow-principal User:ANONYMOUS --allow-host * --operation All --topic {topicname} |
5.3 测试不同认证方式共存成功与否
删除jaas环境变量 |
unset {变量名} |
producer测试 |
bin/kafka-console-producer.sh --broker-list {host}:9093 --topic{topicname} |
六、启用zookeeper的acl同步
kafka的bin目录下的zookeeper-security-migration.sh,可以将kafka的权限,遍历赋给zookeeper中每个子节点,然后分别设置acl,因为zookeeper的acl是仅对当前节点生效,对其下节点不生效的,单独赋权限很麻烦。zookeeper-security-migration.sh解决了这个问题。
修改server.properties,增加 zookeeper.set.acl=true |
重启kafka集群(批量重启或滚动重启) |
启动zookeeper-security-migration.sh脚本,secure设置同步,unsecure取消同步 bin/zookeeper-security-migration --zookeeper.acl=secure --zookeeper.connect={host}:{port}/{path} |
kafka集群安全化之启用kerberos与acl的更多相关文章
- 一键运行CIS安全扫描,集群安全无忧!
CIS安全扫描是Rancher 2.4推出的其中一个重磅功能,旨在帮助用户快速.有效地加强集群的安全性.本文将详细介绍CIS安全扫描这一功能,包含详细的操作demo. 本文来自Rancher Labs ...
- Apache-Shiro+Zookeeper系统集群安全解决方案之缓存管理
上篇[Apache-Shiro+Zookeeper系统集群安全解决方案之会话管理],解决了Shiro在系统集群开发时安全的会话共享问题,系统在使用过程中会有大量的权限检查和用户身份检验动作,为了不频繁 ...
- kafka——集群安裝部署(自带zookeeper)
kafka系列文章 第一章 linux单机安装kafka 第二章 kafka--集群安裝部署(自带zookeeper) 一.kafka简介 kafka官网:http://kafka.apache.or ...
- Kafka集群安裝部署(自带Zookeeper)
kafka简介 kafka官网:http://kafka.apache.org/ kafka下载页面:http://kafka.apache.org/downloads kafka配置快速入门:htt ...
- Apache-Shiro+Zookeeper系统集群安全解决方案之会话管理
如今的系统多不是孤军奋战,在多结点会话共享管理方面有着各自的解决办法,比如Session粘连,基于Web容器的各种处理等或者类似本文说的完全接管Web容器的Session管理,只是做法不尽相同. 而本 ...
- Kubernetes集群安全概述
API的访问安全性 API Server的端口和地址 在默认情况下,API Server通过本地端口和安全端口两个不同的HTTP端口,对外提供API服务,其中本地端口是基于HTTP协议的,用于在本机( ...
- mongodb副本集加分片集群安全认证使用账号密码登录
mongodb副本集加分片集群搭建网上资料有很多.粘贴一个写的比较好的.副本集加分片搭建 对于搭建好的mongodb副本集加分片集群,为了安全,启动安全认证,使用账号密码登录. 默认的mongodb是 ...
- kubernetes实战(八):k8s集群安全机制RBAC
1.基本概念 RBAC(Role-Based Access Control,基于角色的访问控制)在k8s v1.5中引入,在v1.6版本时升级为Beta版本,并成为kubeadm安装方式下的默认选项, ...
- kubernetes(k8s)集群安全机制RBAC
1.基本概念 RBAC(Role-Based Access Control,基于角色的访问控制)在k8s v1.5中引入,在v1.6版本时升级为Beta版本,并成为kubeadm安装方式下的默认选项, ...
随机推荐
- Python在Linux环境中安装Thrift
1.文件下载:thrift-0.11.0.tar.gz 个人网盘下载:链接:https://pan.baidu.com/s/1MXgx8LuN4wk7ssVUD9Wzaw 提取码:xw85 2. ...
- vmware-vmx.exe进程应该怎么杀掉
如何解决VMware-vmx.exe无法彻底删除的问题 遇见的问题就是 虚拟机一直黑屏,强制关机之后,无法再次打开的问题. 显示:无法创建新虚拟机: 无法打开配置文件 以独占方式锁定此配置文件失败.另 ...
- rhel6安装rabbitmq-sever
1.下载rabbitmq-sever3.7.7,我下的是RHEL/CentOS 6.x, 你的系统是哪个版本就下哪个https://github.com/rabbitmq/ Downloadson G ...
- nginx 常用的中间件
1.--with-http_stub_status_module nginx客户端状态 # 打开default.conf文件 vim /etc/nginx/conf.d/default.conf # ...
- woocommerce分类页产品数量修改
我们用woocommerce建商城,不同的模板分类页产品数量不同,如果想要显示更多或更少的数量要如何修改呢?很简单,一行代码就能搞定!打开当前主题的function.php文件,加入如下代码,把18改 ...
- .eslintrc的配置
{ // 环境定义了预定义的全局变量. "env": { //环境定义了预定义的全局变量.更多在官网查看 "browser": true, "node ...
- eclipse export runnable jar(导出可执行jar包) runnable jar可以执行的
如果要导出可运行的JAR文件,需要选择Runnable Jar File. 1. 选择要到处JAR文件的工程,右键选择“Export”: 2. 选择“Java-->Runnable JAR fi ...
- VS 代码过长自动换行
然后就需要设置自动换行.在VS上面的菜单栏中,选择 工具=>选项,出现选项对话框. 在对话框中,展开“文本编辑器”,然后选中“C#”,勾选右边的“自动换行“. 点击确定按钮.这样就可以看 ...
- java的excel表格的导出与下载
今天做一个java对excel表格的导出和下载的时候,从网络上搜寻了下载的模板,代码如下: 控制层: @RequestMapping(value = "excelOut_identifier ...
- SDOI2010选做
Round1 D1T1外星千足虫 \(BSOJ2793\)--高斯消元解异或方程组 简述 有\(n\)个数\(\{a_i\}\) 给出\(m\)个信息,每个信息给出\(\displaystyle{(\ ...