成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

升級到 Pulsar3.0 后深入了解 JWT 鑒權

開發 前端
Pulsar 支持 Namespace/Topic? 級別的鑒權,在生產環境中往往會使用 topic 級別的鑒權,從而防止消息泄露或者其他因為權限管控不嚴格而導致的問題。

背景

最近在測試將 Pulsar 2.11.2 升級到 3.0.1的過程中碰到一個鑒權問題,正好借著這個問題充分了解下 Pulsar 的鑒權機制是如何運轉的。

Pulsar 支持 Namespace/Topic 級別的鑒權,在生產環境中往往會使用 topic 級別的鑒權,從而防止消息泄露或者其他因為權限管控不嚴格而導致的問題。

圖片圖片

我們會在創建 topic 的時候為 topic 綁定一個應用,這樣就只能由這個應用發送消息,其他的應用嘗試發送消息的時候會遇到 401 鑒權的異常。

同理,對于訂閱者也可以關聯指定的應用,從而使得只有規定的應用可以消費消息。

鑒權流程

以上的兩個功能本質上都是通過 Pulsar 的 admin-API 實現的。

圖片圖片

這里關鍵的就是 role,在我們的場景下通常是一個應用的 AppId,只要是一個和項目唯一綁定的 ID 即可。

這只是授權的一步,整個鑒權流程圖如下:

圖片圖片

詳細步驟

生成公私鑰

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

將公鑰分發到 broker 的節點上,鑒權的時候 broker 會使用公鑰進行驗證。

而私鑰通常是管理員單獨保存起來用于在后續的步驟為客戶端生成 token

使用私鑰生成 token

之后我們便可以使用這個私鑰生成 token 了:

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

eyJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJhZG1pbiJ9

其中的 subject 和本文長提到的 role 相等

使用 subject 授權

只是單純生成了 token 其實并沒有什么作用,還得將 subject(role) 與 topic 進行授權綁定。

圖片圖片

也就是上圖的這個步驟。

這里創建的 admin 客戶端也得使用一個 superRole 角色的 token 才有權限進行授權。superRole 使用在  broker.conf 中進行配置。

客戶端使用 token 接入 broker

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

使用剛才私鑰生成的 token 接入 broker 才能生產或者消費數據。

originalPrincipal cannot be a proxy role

這些流程正常都沒啥問題,但直到我升級了 Pulsar3.0 后客戶端直接就連不上了。

在 broker 中看到了 WARN 的警告日志:

cannot specify originalPrincipal when connecting without valid proxy role

圖片圖片

之后在 3.0 的升級日志中看到相關的 Issue。

從這個 PR 相關的代碼和變更的文檔可以得知:

圖片圖片

圖片圖片

升級到 3.0 之后風險校驗等級提高了,proxyRole 這個字段需要在 broker 中進行指定(之前的版本不需要強制填寫)。

因為我們使用了 Proxy 組件,所有的請求都需要從 proxy 中轉一次,這個 proxyRole 是為了告訴 broker:只有使用了 proxyRole 作為 token 的 Proxy 才能訪問 broker,這樣保證了 broker 的安全。

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

以上是我的配置,我的 Proxy 配置的也是 proxy-admin 這個 token,所以理論上是沒有問題的,但依然鑒權失敗了,查看 broker 的日志后拿到以下日志:

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 相等。

圖片圖片

閱讀源碼和這個 PR 的 comment 之后得知:

圖片圖片

也就是說客戶端不能使用和 proxyRole 相同的角色進行連接,這個角色應當也只能給 Proxy 使用,這樣的安全性才會高。

所以這個 Comment 還在討論這是一個 breaking change? 還是一個增強補丁。因為合并這個 PR 后對沒有使用 proxyRole 的客戶端將無法連接,同時也可能出現我這種 proxyRole 就是客戶端使用的角色,這種情況也會鑒權失敗。

所以我換了一個 superRole 角色就可以了,比如換成了 admin。

但其實即便是放到我們的生產系統,只要配置了 proxyRole 也不會有問題,因為我們應用所使用的 role 都是不這里的 superUserRole,全部都是使用 AppId 生成的。

token 不一致

但也有一個疑惑,我在換為存放在 configmap 中的 admin token 之前(測試環境使用的是 helm 安裝集群,所以這些 token 都是存放在 configmap 中的),

為了驗證是否只要非 proxyRole 的 superRole 都可以使用,我就自己使用了私鑰重新生成了一個 admin 的 token。

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

這樣生成的 token 也是可以使用的,但是我將 token 復制出來之后卻發現 helm 生成的 token 與我用 pulsar 命令行生成的 token 并不相同。

為了搞清楚為什么 token 不同但鑒權依然可以通過的原因,之后我將 token decode之后知道了原因:

圖片圖片

圖片圖片

原來是 Header 不同從而導致最終的 token 不同,helm 生成的 token 中多了一個 typ 字段。

之后我檢查了 helm 安裝的流程,發現原來 helm 的腳本中使用的并不是 Java 的命令行工具:

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

這個 PULSARCTL_BIN 是一個由 Go 寫的命令行工具,我查看了其中的源碼,才知道 Go 的 JWT 工具會自帶一個 header。https://github.com/streamnative/pulsarctl

圖片圖片

而 Java 是沒有這個邏輯的,但也只是加了 header,payload 的值都是相同的。這樣也就解釋了為什么 token 不同但確依然能使用的原因。

責任編輯:武曉燕 來源: crossoverJie
相關推薦

2024-01-03 08:08:51

Pulsar版本數據

2023-12-25 08:08:41

存儲降級災難恢復

2010-06-23 20:31:54

2010-07-13 09:36:25

2010-11-19 16:22:14

Oracle事務

2022-08-26 13:48:40

EPUBLinux

2009-08-25 16:27:10

Mscomm控件

2020-09-21 09:53:04

FlexCSS開發

2020-07-20 06:35:55

BashLinux

2011-07-18 15:08:34

2022-06-03 10:09:32

威脅檢測軟件

2010-11-15 11:40:44

Oracle表空間

2018-06-22 13:05:02

前端JavaScript引擎

2021-01-19 12:00:39

前端監控代碼

2010-09-27 09:31:42

JVM內存結構

2010-11-08 13:54:49

Sqlserver運行

2013-04-16 10:20:21

云存儲服務云存儲SLA服務水平協議

2021-04-28 10:13:58

zookeeperZNode核心原理

2021-09-01 10:15:15

前端cookiesession
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产 日韩 欧美 在线 | 久久99久久98精品免观看软件 | 中文字幕日韩av | 国产精品高潮呻吟久久 | 日韩精品久久久久 | 久久久毛片 | 三a毛片| 高清国产一区二区 | 91视频导航| 伊人狠狠 | 久久av.com| 亚洲人成在线播放 | 国产精品成人一区二区三区 | 黄色电影在线免费观看 | 久久午夜影院 | 99免费在线视频 | 午夜亚洲 | 午夜小影院 | 国产在线对白 | 亚洲国产精品99久久久久久久久 | 午夜激情在线视频 | 风间由美一区二区三区在线观看 | 日韩在线精品视频 | 国产精品久久久久久亚洲调教 | 国产一区二区久久 | 欧美男人天堂 | 一级高清免费毛片 | 青青草一区二区三区 | 亚洲xxxxx| 97精品国产 | 国产精品一区二区三 | 国产粉嫩尤物极品99综合精品 | 91精品国产91 | 国产一区二区自拍 | 午夜一区二区三区视频 | 亚洲国产精品久久 | 精品国产一区一区二区三亚瑟 | 亚洲成人综合社区 | 一区中文字幕 | 粉嫩一区二区三区国产精品 | 国产精品中文在线 |