网站logo修改,fw怎么做网站,php手机网站怎么做,做公司门户网站的重点编辑导读#xff1a;本篇内容将进一步介绍 Kafka 中的认证、鉴权等概念。AutoMQ 是与 Apache Kafka 100% 完全兼容的新一代 Kafka#xff0c;可以帮助用户降低 90%以上的 Kafka 成本并且进行极速地自动弹性。作为 Kafka 生态的忠实拥护者#xff0c;我们也会持续致力于传播 … 编辑导读本篇内容将进一步介绍 Kafka 中的认证、鉴权等概念。AutoMQ 是与 Apache Kafka 100% 完全兼容的新一代 Kafka可以帮助用户降低 90%以上的 Kafka 成本并且进行极速地自动弹性。作为 Kafka 生态的忠实拥护者我们也会持续致力于传播 Kafka 技术欢迎关注我们。 我们在此前的文章《AutoMQ SASL 安全身份认证配置教程》[1]介绍过 Apache Kafka 以下简称 Kafka服务端和客户端的 SASL 认证协议配置并在《AutoMQ SSL 安全协议配置教程》[2]详细介绍了如何利用 SSLTLS 实现 Kafka 或 AutoMQ 的安全通信。本文将进一步概述 Kakfa 中的认证方法和鉴权策略并通过一个例子来说明我们在真实应用场景中如何对 Kafka 或者 AutoMQ 集群开启身份认证和鉴权。 注意本文默认 Kafka 集群是以 Kraft 模式工作的。 Listener、安全协议、认证与鉴权的关系
先回顾一下 listener 的作用。listener 是 Kafka 服务端定义监听地址域名/IP 端口和安全协议的实体。一般情况下我们可以利用多 listener 来差异化设置 broker 与 broker 之间controller 与 broker 之间client 与 broker 之间的通信安全协议 内网局域网或 VPC 内部访问 broker、外网访问 broker 时的通信安全协议
我们可以将 listener name 跟安全协议进行映射举例来说Kafka 支持以下安全协议
我们可以设置 client 与 broker 之间使用 SASL_SSL 协议保证加密性而集群节点之间使用 SASL_PLAINTEXT 减少 CPU 加密解密的消耗
listenersEXTERNAL://:9092,BROKER://10.0.0.2:9094
advertised.listenersEXTERNAL://broker1.example.com:9092,BROKER://broker1.local:9094
listener.security.protocol.mapEXTERNAL:SASL_SSL,BROKER:SASL_PLAINTEXT
inter.broker.listener.nameBROKER下图展示了 Listener、安全协议、认证与鉴权之间的关系 安全协议决定了服务端和客户端之间的认证Authentication协议而鉴权Authorization基本独立于认证只校验通过认证的主体对请求中涉及的资源是否有操作权限。下文将详细介绍认证方法和鉴权规则。
认证
认证主体
先简单介绍一下认证主体的概念。
认证主体是对 client 的身份标识对应一个 KafkaPrincipal 对象[5]。当 client 通过认证协议完成认证后broker 侧会将该 KafkaPrincipal 对象塞入 RequestContext并向上传递以供后续鉴权。一个 KafkaPrincipal 对象主要包括主体类型目前仅有User这一类别以及一个名称可以简单理解为 client 声明的用户名。
认证协议
安全协议到认证协议之间的映射为 PLAINTEXT无认证 SSL无认证/mTLS SASL_PLAINTEXT: SASL; SASL_SSL: SASL;
其中 SSL 如果想要利用 mTLS 进行认证需要在 broker 侧开启对 client 的 SSL 验证
ssl.client.authrequired利用证书中的“DistinguishedName”字段[4]识别认证主体。由于认证通常涉及到用户的管理这种通过证书进行认证的方式在增删用户时显得比较“笨重”尤其是动态增删用户的场景并不是主流的认证方式。
SASL 认证协议又可以进一步细分为以下认证机制 GSSAPI借助第三方 Kerberos[3]一种基于 ticket 的加密认证协议服务器进行认证认证 PLAIN简单账密认证注意它跟前文的 PLAINTEXT 不是一个概念 SCRAM-SHA-256/512基于 SCRAM 算法由 Kafka 节点基于 record 自认证 OAUTHBEARER借助第三方 OAuth 服务器认证
Kafka broker 允许同时启用多种 SASL 认证例如同时启用 SCRAM-SHA-256/512 PLAIN
sasl.enabled.mechanismsSCRAM-SHA-256,PLAIN,SCRAM-SHA-512Broker 侧还需要额外的 JAAS 配置在《AutoMQ SASL 安全身份认证配置教程》中已经提及这里不再赘述。
需要注意的是Kafka 提供了默认的 SASL/PLAIN 实现需要在每个节点配置中显示声明账密信息。这种静态认证方式同样不利于用户的动态管理可以通过集成外部的账密认证服务器来提供动态能力。
鉴权
鉴权是基于认证主体检查是否有权限操作请求的资源。
鉴权配置
重要的配置包括 authorizer.class.name指定鉴权器默认为空。Kraft 模式下可以填写官方提供的 “org.apache.kafka.metadata.authorizer.StandardAuthorizer”基于 ACLaccess control list规则认证 super.users设置超级用户默认为空。格式为 User:{userName}。这里指定的用户将不受 ACL 约束直接拥有所有资源的所有操作权限 allow.everyone.if.no.acl.found指定资源没有任意 ACL 约束时的默认权限默认为 false。false 表示仅允许 super user 操作true 表示允许任意用户操作。
鉴权规则
Kafka 是基于 ACLaccess control list 规则限制用户对资源的访问的。一条 ACL 规则包含两部分 ResourcePattern声明资源及其匹配方式包含 ResourceType资源类型包括 TOPIC、GROUP消费者组、CLUSTER 等 ResourceName资源名称 PatternType资源匹配方式包括 LITERAL全文匹配 和 PREFIXED前缀匹配 AccessControlEntry用户限制信息包括 Principal认证主体其实就是个用户名 Host用户主机地址 AclOperation操作行为包括 Read、Write、CREATE、DELETE 等 AclPermissionType允许/禁止。
一句话串联上述规则信息就是
允许/禁止 来自 {Host} 的用户 {Principal} 对匹配类型为 {PatternType} 、名称为 {ResourceName} 的资源进行 {AclOperation} 操作。
当同时满足 存在某条 ACL 允许用户操作 不存在任何一条 ACL 禁止用户操作
时允许用户对资源进行操作。
需要注意的是可以将通配符“*”作为 ResourceName 或 Host 的内容。对于 Host 字段填写“*” 表示任意地址。ResourceName 为 “*”且 PatternType 为 LITERAL 时表示匹配任意名称如果 ResourceName 为 “*”PatternType 为 PREFIXED表示匹配前缀名称为“*”的资源。
此外当 ResourceType 为 CLUSTER 时ResourceName 只能填写kafka-cluster。
升级认证协议或开启鉴权
某些情况下我们需要考虑安全协议的切换或者需要将集群从无鉴权转为开启鉴权。例如在开发环境中我们通常直接用默认的 PLAINTEXT 配置集群如果不幸在测试或生产环境中也使用了 PLAINTEXT 协议那么就需要考虑升级安全协议并开启鉴权。
以下以“PLAINTEXT、无鉴权”升级为“SASL_PLAINTEXT、开启鉴权”为例介绍如何平滑过渡。其他安全协议的变化可以以此类推。
以下假定三台 Kafka 节点都在本机部署使用不同的端口以示区分。三台节点均为 controller broker 的混部节点。注意各个阶段变更时需要一一重启各个节点。
整体逻辑示意图 集群共需要三轮重启业务侧需要一轮重启。
原始配置
以下为第一个节点在 PLAINTEXT 协议下的部分配置其他节点配置依次类推
node.id1
controller.quorum.voters1localhost:9093,2localhost:9095,3localhost:9097
listenersPLAINTEXT://:9092,CONTROLLER://:9093
inter.broker.listener.namePLAINTEXT
advertised.listenersPLAINTEXT://localhost:9092
controller.listener.namesCONTROLLER
listener.security.protocol.mapCONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,SSL:SSL,SASL_PLAINTEXT:SASL_PLAINTEXT,SASL_SSL:SASL_SSL阶段一新协议默认 ALLOW 鉴权上线
node.id1
# 保持不变
controller.quorum.voters1localhost:9093,2localhost:9095,3localhost:9097
# controller 和 broker 的新 listener 上线
listenersPLAINTEXT://:9092,CONTROLLER://:9093,BROKER_SASL://:9192,CONTROLLER_SASL://:9193
# 保持不变
inter.broker.listener.namePLAINTEXT
# 新地址上线
advertised.listenersPLAINTEXT://localhost:9092,BROKER_SASL://localhost:9192
# 新 listener 上线
controller.listener.namesCONTROLLER,CONTROLLER_SASL# authorization
authorizer.class.nameorg.apache.kafka.metadata.authorizer.StandardAuthorizer
# 允许所有人访问资源
allow.everyone.if.no.acl.foundtrue
# 超级用户用于节点之间认证
super.usersUser:automqsasl.enabled.mechanismsSCRAM-SHA-256,PLAIN,SCRAM-SHA-512
# 指定与 broker 通信时具体的 SASL 机制
sasl.mechanism.inter.broker.protocolPLAIN
# 指定与 controller 通信时具体的 SASL 机制
sasl.mechanism.controller.protocolPLAIN
# 静态账密配置
listener.name.broker_sasl.plain.sasl.jaas.configorg.apache.kafka.common.security.plain.PlainLoginModule required \usernameautomq \passwordautomq-secret \user_automqautomq-secret;listener.name.controller_sasl.plain.sasl.jaas.configorg.apache.kafka.common.security.plain.PlainLoginModule required \usernameautomq \passwordautomq-secret \user_automqautomq-secret;# 认证模块配置
listener.name.broker_sasl.scram-sha-256.sasl.jaas.configorg.apache.kafka.common.security.scram.ScramLoginModule required;
listener.name.controller_sasl.scram-sha-256.sasl.jaas.configorg.apache.kafka.common.security.scram.ScramLoginModule required;
listener.name.broker_sasl.scram-sha-512.sasl.jaas.configorg.apache.kafka.common.security.scram.ScramLoginModule required;
listener.name.controller_sasl.scram-sha-512.sasl.jaas.configorg.apache.kafka.common.security.scram.ScramLoginModule required;# 添加新 listener 到 安全协议的映射
listener.security.protocol.mapCONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,SSL:SSL,SASL_PLAINTEXT:SASL_PLAINTEXT,SASL_SSL:SASL_SSL,BROKER_SASL:SASL_PLAINTEXT,CONTROLLER_SASL:SASL_PLAINTEXT其中“allow.everyone.if.no.acl.found”设置为 true是为了让线上的 client 能够正常认证避免直接鉴权失败。
“controller.listener.names”设置为“CONTROLLERCONTROLLER_SASL”表示 controller 同时使用两个 listener并且本 node 的 broker 将使用“CONTROLLER”映射的安全协议与 controller 通信。
本阶段结束以后需要通知业务方重新配置基于 SASL_PLAINTEXT 配置客户端。同时需要为各业务方配置 ACL 所需的规则。
阶段二节点之间使用新协议鉴权开启
在上一阶段执行后新协议下的 listener 已经上线并可以对外提供服务但是集群的节点之间依旧维持原有的通信协议本阶段会将内部通信进行升级
node.id1
# 使用新 controller 端口
controller.quorum.voters1localhost:9193,2localhost:9195,3localhost:9197
# 保持不变
listenersPLAINTEXT://:9092,CONTROLLER://:9093,BROKER_SASL://:9192,CONTROLLER_SASL://:9193
# 使用新协议
inter.broker.listener.nameBROKER_SASL
# 使用新地址
advertised.listenersPLAINTEXT://localhost:9092,BROKER_SASL://localhost:9192# 注意顺序变化
controller.listener.namesCONTROLLER_SASL,CONTROLLER# authorization
authorizer.class.nameorg.apache.kafka.metadata.authorizer.StandardAuthorizer
# allow.everyone.if.no.acl.foundtrue
super.usersUser:automq# 保持不变
sasl.enabled.mechanismsSCRAM-SHA-256,PLAIN,SCRAM-SHA-512
sasl.mechanism.inter.broker.protocolPLAIN
sasl.mechanism.controller.protocolPLAIN
listener.name.broker_sasl.plain.sasl.jaas.configorg.apache.kafka.common.security.plain.PlainLoginModule required \usernameautomq \passwordautomq-secret \user_automqautomq-secret;
listener.name.controller_sasl.plain.sasl.jaas.configorg.apache.kafka.common.security.plain.PlainLoginModule required \usernameautomq \passwordautomq-secret \user_automqautomq-secret;# 保持不变
listener.name.broker_sasl.scram-sha-256.sasl.jaas.configorg.apache.kafka.common.security.scram.ScramLoginModule required;
listener.name.controller_sasl.scram-sha-256.sasl.jaas.configorg.apache.kafka.common.security.scram.ScramLoginModule required;
listener.name.broker_sasl.scram-sha-512.sasl.jaas.configorg.apache.kafka.common.security.scram.ScramLoginModule required;
listener.name.controller_sasl.scram-sha-512.sasl.jaas.configorg.apache.kafka.common.security.scram.ScramLoginModule required;# 保持不变
listener.security.protocol.mapCONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,SSL:SSL,SASL_PLAINTEXT:SASL_PLAINTEXT,SASL_SSL:SASL_SSL,BROKER_SASL:SASL_PLAINTEXT,CONTROLLER_SASL:SASL_PLAINTEXT注意“allow.everyone.if.no.acl.found”配置被注释掉了也就是不再默认允许任何人任意操作资源了。
阶段三下线旧协议
node.id1# 保持不变
controller.quorum.voters1localhost:9193,2localhost:9195,3localhost:9197
# 下线旧 listener
listenersBROKER_SASL://:9192,CONTROLLER_SASL://:9193# 保持不变
inter.broker.listener.nameBROKER_SASL# 下线旧地址
advertised.listenersBROKER_SASL://localhost:9192# 下线旧 listener
controller.listener.namesCONTROLLER_SASL# authorization
authorizer.class.nameorg.apache.kafka.metadata.authorizer.StandardAuthorizer
# allow.everyone.if.no.acl.foundtrue
super.usersUser:automq# 保持不变
sasl.enabled.mechanismsSCRAM-SHA-256,PLAIN,SCRAM-SHA-512
sasl.mechanism.inter.broker.protocolPLAIN
sasl.mechanism.controller.protocolPLAIN
listener.name.broker_sasl.plain.sasl.jaas.configorg.apache.kafka.common.security.plain.PlainLoginModule required \usernameautomq \passwordautomq-secret \user_automqautomq-secret;
listener.name.controller_sasl.plain.sasl.jaas.configorg.apache.kafka.common.security.plain.PlainLoginModule required \usernameautomq \passwordautomq-secret \user_automqautomq-secret;# 保持不变
listener.name.broker_sasl.scram-sha-256.sasl.jaas.configorg.apache.kafka.common.security.scram.ScramLoginModule required;
listener.name.controller_sasl.scram-sha-256.sasl.jaas.configorg.apache.kafka.common.security.scram.ScramLoginModule required;
listener.name.broker_sasl.scram-sha-512.sasl.jaas.configorg.apache.kafka.common.security.scram.ScramLoginModule required;
listener.name.controller_sasl.scram-sha-512.sasl.jaas.configorg.apache.kafka.common.security.scram.ScramLoginModule required;# 保持不变
listener.security.protocol.mapCONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,SSL:SSL,SASL_PLAINTEXT:SASL_PLAINTEXT,SASL_SSL:SASL_SSL,BROKER_SASL:SASL_PLAINTEXT,CONTROLLER_SASL:SASL_PLAINTEXT至此旧协议下线所有通信基于 SASL_PLAINTEXT 协议。
总结
本文概述了 Kafka 中的认证协议和鉴权策略。首先介绍了 listener 与安全协议的映射以及安全协议与认证方法的映射。接着分别介绍 Kafka 中支持的多种认证协议以及 ACL 鉴权策略。在认证通过后Kafka 会生成一个认证主体供上层进行细粒度的鉴权。最后介绍了如何对一个运行中的 Kafka 集群中进行认证协议升级以及开启鉴权。
参考文献
[1] https://www.automq.com/blog/automq-sasl-security-authentication-configuration-guide
[2] https://www.automq.com/blog/automq-ssl-security-protocol-configuration-tutorial
[3] https://developer.confluent.io/courses/security/authentication-basics/
[4] https://smallstep.com/hello-mtls/doc/server/kafka
[5] https://web.mit.edu/kerberos/