一、背景

在我们部署完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}

转载于:https://www.cnblogs.com/felixzh/p/11506020.html

kafka集群安全化之启用kerberos与acl相关推荐

  1. EMR集群安全认证和授权管理

    简介:介绍EMR高安全集群如何使用Kerberos和Apache Ranger进行鉴权和访问授权管理 直达最佳实践:[EMR集群安全认证和授权管理] 最佳实践频道:[点击查看更多上云最佳实践] 这里有 ...

  2. Kubernetes集群安全概述

    转自Kubernetes集群安全概述 - 我是程序员 - 博客园 (cnblogs.com) API的访问安全性 API Server的端口和地址 在默认情况下,API Server通过本地端口和安全 ...

  3. Kubernetes 集群安全机制详解

    本文主要介绍 Kubernetes 的安全机制,如何使用一系列概念.技术点.机制确保集群的访问是安全的,涉及到的关键词有:api-server,认证,授权,准入控制,RBAC,Service Acco ...

  4. 一键运行CIS安全扫描,集群安全无忧!

    CIS安全扫描是Rancher 2.4推出的其中一个重磅功能,旨在帮助用户快速.有效地加强集群的安全性.本文将详细介绍CIS安全扫描这一功能,包含详细的操作demo. 本文来自Rancher Labs ...

  5. k8s(六):配置管理与集群安全机制

    文章目录 1. 配置管理 1.1 Secret 1.1.1 变量形式挂载到Pod 1.1.2 数据卷形式挂载 1.2 ConfigMap 1.2.1 数据卷形式挂载到pod容器中 1.2.1 变量形式 ...

  6. Kubernetes API Server 之集群安全认证

    文章目录 前言 一.为什么要有 api-server 集群安全认证? 二.安全机制的三个流程 三.HTTP Bearer Token 认证 四.HTTPS 双向证书认证 总结 前言 kubernete ...

  7. 【Linux集群教程】12 集群安全防御 - 安全防御概述和Linux防火墙

    1 安全防御概述 1.1 常见的攻击手段 拒绝服务(DOS): 通过大量访问请求使服务器资源耗尽,无法向正常用户处理请求连接.常见解决手段将提供服务的机器配置的足够多,性能足够好 或者 使用云服务商的 ...

  8. kubernetes集群安全——认证、鉴权、准入控制

    机制说明 Kubernetes 作为一个分布式集群的管理工具,保证集群的安全性是其一个重要的任务.API Server 是集群内部各个组件通信的中介,也是外部控制的入口.所以 Kubernetes 的 ...

  9. 11、Kubernetes集群安全机制

    文章目录 一.概述 1.1 认证 1.2 鉴权 1.3 准入控制 二.RBAC介绍 三.RBAC实现鉴权 3.1 创建命名空间 3.2 命名空间创建Pod 3.3 创建角色 3.4 创建角色绑定 3. ...

最新文章

  1. 高级SQL优化(三) 常用优化工具 ——《12年资深DBA教你Oracle开发与优化——性能优化部分》...
  2. boost::geometry::detail::overlay::get_ring用法的测试程序
  3. Ajax中什么时候用同步,什么时候用异步?
  4. php支持cs吗,关于composer、phpmd和phpcs于windows中的安装与使用方法
  5. 挑战程序设计竞赛 (秋叶拓哉 / 岩田阳一 / 北川宜稔 著)
  6. 服务器配置RAID5(3块硬盘做RAID5,另外再弄一块做数据冗余盘)
  7. CentOS 6.5高可用集群LVS+Keepalived
  8. Git GUI,Git Bash,Git CMD标签之间的区别
  9. 从入门到入土(十)RocketMQ集群流程以及核心概念
  10. layer 一些理解
  11. WPS2000系列之四图文混编(转)
  12. LaTeX 中的花体字母
  13. atom的linux版本,Atom平台多版本Linux性能测试
  14. xducs学习经验分享
  15. 数字证书在web应用中实现登陆
  16. fluent支持python吗_Python与Fluent联合仿真设置
  17. 大学生计算机课如何退出教学系统,如何把Windows 10的系统进程关闭?
  18. java springboot分销商城小程序源码
  19. 怎样配置外汇ea服务器运行,外汇EA如何在MT4上运行?以及如何挂到服务器?
  20. 学生专用计算机玩俄罗斯方块,c++编程俄罗斯方块计算机实习报告模板.doc

热门文章

  1. rabbitmq-5-案例1-简单的案例
  2. NOIP2007 字符串的展开
  3. Python: Socket网络编程,多线程处理小Demo
  4. tensorboard 使用教程
  5. 时间戳转换成时间格式
  6. Java语言基础学习笔记——基础语法
  7. linux下获取系统时间的方法
  8. 8.7 使用索引-notes
  9. requests.get(url)执行没反应_翟至宇:执行路上,从未停歇
  10. 强制生成32位arm程序_3. 从0开始学ARM-ARM模式、寄存器、流水线