当前位置:首页 > 科技  > 软件

升级到 Pulsar3.0 后深入了解 JWT 鉴权

来源: 责编: 时间:2023-11-20 08:57:42 376观看
导读背景最近在测试将 Pulsar 2.11.2 升级到 3.0.1的过程中碰到一个鉴权问题,正好借着这个问题充分了解下 Pulsar 的鉴权机制是如何运转的。Pulsar 支持 Namespace/Topic 级别的鉴权,在生产环境中往往会使用 topic 级别的鉴

背景

最近在测试将 Pulsar 2.11.2 升级到 3.0.1的过程中碰到一个鉴权问题,正好借着这个问题充分了解下 Pulsar 的鉴权机制是如何运转的。mdb28资讯网——每日最新资讯28at.com

Pulsar 支持 Namespace/Topic 级别的鉴权,在生产环境中往往会使用 topic 级别的鉴权,从而防止消息泄露或者其他因为权限管控不严格而导致的问题。mdb28资讯网——每日最新资讯28at.com

图片图片mdb28资讯网——每日最新资讯28at.com

我们会在创建 topic 的时候为 topic 绑定一个应用,这样就只能由这个应用发送消息,其他的应用尝试发送消息的时候会遇到 401 鉴权的异常。mdb28资讯网——每日最新资讯28at.com

同理,对于订阅者也可以关联指定的应用,从而使得只有规定的应用可以消费消息。mdb28资讯网——每日最新资讯28at.com

鉴权流程

以上的两个功能本质上都是通过 Pulsar 的 admin-API 实现的。mdb28资讯网——每日最新资讯28at.com

图片图片mdb28资讯网——每日最新资讯28at.com

这里关键的就是 role,在我们的场景下通常是一个应用的 AppId,只要是一个和项目唯一绑定的 ID 即可。mdb28资讯网——每日最新资讯28at.com

这只是授权的一步,整个鉴权流程图如下:mdb28资讯网——每日最新资讯28at.com

图片图片mdb28资讯网——每日最新资讯28at.com

详细步骤

生成公私钥

bin/pulsar tokens create-key-pair --output-private-key my-private.key --output-public-key my-public.key

将公钥分发到 broker 的节点上,鉴权的时候 broker 会使用公钥进行验证。mdb28资讯网——每日最新资讯28at.com

而私钥通常是管理员单独保存起来用于在后续的步骤为客户端生成 tokenmdb28资讯网——每日最新资讯28at.com

使用私钥生成 token

之后我们便可以使用这个私钥生成 token 了:mdb28资讯网——每日最新资讯28at.com

bin/pulsar tokens create --private-key file:///path/to/my-private.key /            --subject 123456eyJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJhZG1pbiJ9

其中的 subject 和本文长提到的 role 相等mdb28资讯网——每日最新资讯28at.com

使用 subject 授权

只是单纯生成了 token 其实并没有什么作用,还得将 subject(role) 与 topic 进行授权绑定。mdb28资讯网——每日最新资讯28at.com

图片图片mdb28资讯网——每日最新资讯28at.com

也就是上图的这个步骤。mdb28资讯网——每日最新资讯28at.com

这里创建的 admin 客户端也得使用一个 superRole 角色的 token 才有权限进行授权。superRole 使用在  broker.conf 中进行配置。mdb28资讯网——每日最新资讯28at.com

客户端使用 token 接入 broker

PulsarClient client = PulsarClient.builder()    .serviceUrl("pulsar://broker.example.com:6650/")    .authentication(AuthenticationFactory.token("eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJKb2UifQ.ipevRNuRP6HflG8cFKnmUPtypruRC4fb1DWtoLL62SY"))    .build();

使用刚才私钥生成的 token 接入 broker 才能生产或者消费数据。mdb28资讯网——每日最新资讯28at.com

originalPrincipal cannot be a proxy role

这些流程正常都没啥问题,但直到我升级了 Pulsar3.0 后客户端直接就连不上了。mdb28资讯网——每日最新资讯28at.com

在 broker 中看到了 WARN 的警告日志:mdb28资讯网——每日最新资讯28at.com

cannot specify originalPrincipal when connecting without valid proxy role

图片图片mdb28资讯网——每日最新资讯28at.com

之后在 3.0 的升级日志中看到相关的 Issue。mdb28资讯网——每日最新资讯28at.com

从这个 PR 相关的代码和变更的文档可以得知:mdb28资讯网——每日最新资讯28at.com

图片图片mdb28资讯网——每日最新资讯28at.com

图片图片mdb28资讯网——每日最新资讯28at.com

升级到 3.0 之后风险校验等级提高了,proxyRole 这个字段需要在 broker 中进行指定(之前的版本不需要强制填写)。mdb28资讯网——每日最新资讯28at.com

因为我们使用了 Proxy 组件,所有的请求都需要从 proxy 中转一次,这个 proxyRole 是为了告诉 broker:只有使用了 proxyRole 作为 token 的 Proxy 才能访问 broker,这样保证了 broker 的安全。mdb28资讯网——每日最新资讯28at.com

superUserRoles: broker-admin,admin,proxy-admin proxyRoles: proxy-admin

以上是我的配置,我的 Proxy 配置的也是 proxy-admin 这个 token,所以理论上是没有问题的,但依然鉴权失败了,查看 broker 的日志后拿到以下日志:mdb28资讯网——每日最新资讯28at.com

Illegal combination of role [proxy-admin] and originalPrincipal [proxy-admin]: originalPrincipal cannot be a proxy role.

排查了许久依然没有太多头绪,所以我提了相关的 issue:https://github.com/apache/pulsar/issues/21583之后我咨询了 Pulsar 的 PMC @Technoboy  在他的提示下发现我在测试的时候使用的是 proxy-admin,正好和 proxyRoles 相等。mdb28资讯网——每日最新资讯28at.com

图片图片mdb28资讯网——每日最新资讯28at.com

阅读源码和这个 PR 的 comment 之后得知:mdb28资讯网——每日最新资讯28at.com

图片图片mdb28资讯网——每日最新资讯28at.com

也就是说客户端不能使用和 proxyRole 相同的角色进行连接,这个角色应当也只能给 Proxy 使用,这样的安全性才会高。mdb28资讯网——每日最新资讯28at.com

所以这个 Comment 还在讨论这是一个 breaking change? 还是一个增强补丁。因为合并这个 PR 后对没有使用 proxyRole 的客户端将无法连接,同时也可能出现我这种 proxyRole 就是客户端使用的角色,这种情况也会鉴权失败。mdb28资讯网——每日最新资讯28at.com

所以我换了一个 superRole 角色就可以了,比如换成了 admin。mdb28资讯网——每日最新资讯28at.com

但其实即便是放到我们的生产系统,只要配置了 proxyRole 也不会有问题,因为我们应用所使用的 role 都是不这里的 superUserRole,全部都是使用 AppId 生成的。mdb28资讯网——每日最新资讯28at.com

token 不一致

但也有一个疑惑,我在换为存放在 configmap 中的 admin token 之前(测试环境使用的是 helm 安装集群,所以这些 token 都是存放在 configmap 中的),mdb28资讯网——每日最新资讯28at.com

为了验证是否只要非 proxyRole 的 superRole 都可以使用,我就自己使用了私钥重新生成了一个 admin 的 token。mdb28资讯网——每日最新资讯28at.com

bin/pulsar tokens create --private-key file:///pulsar/private/private.key --subject admin

这样生成的 token 也是可以使用的,但是我将 token 复制出来之后却发现 helm 生成的 token 与我用 pulsar 命令行生成的 token 并不相同。mdb28资讯网——每日最新资讯28at.com

为了搞清楚为什么 token 不同但鉴权依然可以通过的原因,之后我将 token decode之后知道了原因:mdb28资讯网——每日最新资讯28at.com

图片图片mdb28资讯网——每日最新资讯28at.com

图片图片mdb28资讯网——每日最新资讯28at.com

原来是 Header 不同从而导致最终的 token 不同,helm 生成的 token 中多了一个 typ 字段。mdb28资讯网——每日最新资讯28at.com

之后我检查了 helm 安装的流程,发现原来 helm 的脚本中使用的并不是 Java 的命令行工具:mdb28资讯网——每日最新资讯28at.com

${PULSARCTL_BIN} token create -a RS256 --private-key-file ${privatekeytmpfile} --subject ${role} 2&> ${tokentmpfile}

这个 PULSARCTL_BIN 是一个由 Go 写的命令行工具,我查看了其中的源码,才知道 Go 的 JWT 工具会自带一个 header。https://github.com/streamnative/pulsarctlmdb28资讯网——每日最新资讯28at.com

图片图片mdb28资讯网——每日最新资讯28at.com

而 Java 是没有这个逻辑的,但也只是加了 header,payload 的值都是相同的。这样也就解释了为什么 token 不同但确依然能使用的原因。mdb28资讯网——每日最新资讯28at.com

mdb28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-31005-0.html升级到 Pulsar3.0 后深入了解 JWT 鉴权

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 深入理解CPU缓存一致性协议MESI(建议收藏)

下一篇: 聊聊接口最大并发处理数

标签:
  • 热门焦点
  • Mate60手机壳曝光 致敬自己的经典设计

    8月3日消息,今天下午博主数码闲聊站带来了华为Mate60的第三方手机壳图,可以让我们在真机发布之前看看这款华为全新旗舰的大致轮廓。从曝光的图片看,Mate 60背后摄像头面积依然
  • 从 Pulsar Client 的原理到它的监控面板

    背景前段时间业务团队偶尔会碰到一些 Pulsar 使用的问题,比如消息阻塞不消费了、生产者消息发送缓慢等各种问题。虽然我们有个监控页面可以根据 topic 维度查看他的发送状态,
  • 三言两语说透设计模式的艺术-单例模式

    写在前面单例模式是一种常用的软件设计模式,它所创建的对象只有一个实例,且该实例易于被外界访问。单例对象由于只有一个实例,所以它可以方便地被系统中的其他对象共享,从而减少
  • 如何正确使用:Has和:Nth-Last-Child

    我们可以用CSS检查,以了解一组元素的数量是否小于或等于一个数字。例如,一个拥有三个或更多子项的grid。你可能会想,为什么需要这样做呢?在某些情况下,一个组件或一个布局可能会
  • Java NIO内存映射文件:提高文件读写效率的优秀实践!

    Java的NIO库提供了内存映射文件的支持,它可以将文件映射到内存中,从而可以更快地读取和写入文件数据。本文将对Java内存映射文件进行详细的介绍和演示。内存映射文件概述内存
  • 花7万退货退款无门:谁在纵容淘宝珠宝商家造假?

    来源:极点商业作者:杨铭在淘宝购买珠宝玉石后,因为保证金不够赔付,店铺关闭,退货退款难、维权无门的比比皆是。“提供相关产品鉴定证书,支持全国复检,可以30天无理由退换货。&
  • 认真聊聊东方甄选:如何告别低垂的果实

    来源:山核桃作者:财经无忌爆火一年后,俞敏洪和他的东方甄选依旧是颇受外界关心的“网红”。7月5日至9日,为期5天的东方甄选“甘肃行”首次在自有App内直播,
  • Windows 11发布,微软一改往常对老机型开放的态度

    距离 Windows 11 发布已经过去一周,在过去一周里,很多数码爱好者围绕其对 Android 应用的支持、对老机型的升级问题展开了激烈讨论。与以往不同的是,在这次大
  • AI艺术欣赏体验会在上海梅赛德斯奔驰中心音乐俱乐部上演

    光影交错的镜像世界,虚实幻化的视觉奇观,虚拟偶像与真人共同主持,这些场景都出现在2019世界人工智能大会的舞台上。8月29日至31日,“AI艺术欣赏体验会”在上海
Top