基于Keycloak的SSO平臺(tái)——Jenkins接入并支持組(group)信息同步

背景

在支持Keycloak第三方認(rèn)證,同時(shí)需要從keycloak中獲取到用戶(員工)的部門(group)信息,以便于Jenkins針對(duì)不同的部門(group)進(jìn)行權(quán)限控制。
因此前提是要飛書把用戶的部門信息同步到Keycloak上。我們通過訂閱飛書的用戶、部門相關(guān)事件,開發(fā)了一個(gè)adapter程序,在接收到飛書事件后,調(diào)用一堆飛書API和Keycloak API實(shí)現(xiàn)了飛書和Keycloak的部門信息同步,從而使得飛書中用戶與部門的增刪改事件可以(實(shí)時(shí))同步到Keycloak中。

其中Keycloak與飛書的集成可以參考:https://github.com/tedgxt/keycloak-service-social-lark

Jenkins配置前必看

  1. Configure Global SecurityAuthorization配置為Anyone can do anything。防止切換到oidc登陸時(shí),若不成功無(wú)法登陸Jenkins。設(shè)置了此項(xiàng)后即使未登錄Jenkins也能修改配置(生產(chǎn)環(huán)境操作時(shí)注意安全性)。
  2. 后臺(tái)備份Jenkins的config.xml文件,以便于配置過程異常時(shí)的恢復(fù)。

Keycloak配置

  1. 創(chuàng)建Jenkins使用的client,此處命名為jenkins-test,類型選擇oidc。jenkins-test就是后面Jenkins中要配置的Client ID
  2. client詳情中, 設(shè)置Access Typeconfidential,并設(shè)置Valid Redirect URIs為允許跳轉(zhuǎn)的Jenkins地址。記錄Credentials標(biāo)簽頁(yè)中的Secret,后面在Jenkins配置Client Secret時(shí)使用。
  3. 配置使得Keycloak可以提供group信息。有兩種配置方式,按下面的說明根據(jù)實(shí)際場(chǎng)景選擇其中一種進(jìn)行配置:
  • 點(diǎn)擊client jenkins-test,進(jìn)入設(shè)置頁(yè),選擇Mappers,右上角點(diǎn)擊create。添加group相關(guān)映射,Mapper Type選擇Group MembershipToken Claim Name配置為group-membership,其中Token Claim Name的值就是jwt token中g(shù)roup信息的key值,后面Jenkins會(huì)通過該key獲取到group信息。該方法是針對(duì)單個(gè)client。配置如下圖:
    image.png
  • 點(diǎn)擊Client Scopes->profile->MappersToken Claim Name配置為group-membershipMapper Type設(shè)置為Group Membership注意該方法會(huì)導(dǎo)致所有的client的profile信息都包含group信息
    配置如下圖
    image.png

配置了group相關(guān)映射后,調(diào)用Keycloak的接口可以獲取基于用戶的Jwt Token,通過解析Jwt Token可以獲取到group-membership信息:

   // 省略了token payload信息
  "scope": "email profile",
  "email_verified": false,
  "name": "xxxx",
  "nickname": "xxxx",
  "preferred_username": "xiatao.guan@xxxxxx",
  "given_name": "xxxx",
  "family_name": "xxxxx",
  "email": "xiatao.guan@xxxxxx",
  "group-membership": [
    "/Dev/HZ Dev/Ops & QA& LBware/QA"

后續(xù)Jenkins通過配置,會(huì)從token的group-membership中獲取用戶的group信息。

Jenkins配置

安裝OIDC插件

當(dāng)前Jenkins實(shí)際有提供Keycloak插件用于直接對(duì)接Keycloak。有配置成功過的同學(xué)可以留言交流一下。
當(dāng)前我們使用OIDC插件來(lái)進(jìn)行配置。

需要配置信息如下:

配置項(xiàng) 描述
Client id jenkins-test Keycloak中添加的jenkins client的Client ID
Client secret xxxxx Keycloak中添加的jenkins client的Secret
Token Server url xxxxx 獲取token的地址
Authorization server url xxxxx 授權(quán)地址
UserInfo server url xxxxx 獲取用戶信息的地址
Scopes openid email phone group-membership等 一定要包含group-membership,否則無(wú)法獲取到group信息
User name field name email 使用email作為jenkins用戶名
Full name field name email 使用email作為jenkins用戶全名
Email field name email email
Groups field name group-membership Keycloak中配置的group的映射名
image.png

保存后退出當(dāng)前用戶,重新登陸Jenkins會(huì)跳轉(zhuǎn)到Keycloak的登陸頁(yè)面。我們?cè)贙eycloak中集成了飛書,通過飛書掃碼登錄后即跳轉(zhuǎn)到Jenkins主頁(yè)。
進(jìn)入用戶詳情頁(yè),若當(dāng)前用戶有管理員權(quán)限,可以看到Groups信息,如下圖:


image.png

若只是普通用戶,在用戶詳情頁(yè)看不到Groups信息,可以訪問 http://127.0.0.1:8280/whoAmI/ 獲取到當(dāng)前登陸用戶的Groups信息,如圖:

image.png

后面就可以通過配置Jenkins的授權(quán)策略,來(lái)實(shí)現(xiàn)基于group的權(quán)限管理啦。

Trobule Shotting

  1. 在生產(chǎn)環(huán)境Jenkins接入keycloak,在Keycloak/飛書登陸后,Jenkins跳轉(zhuǎn)后頁(yè)面報(bào)401錯(cuò)誤/securityRealm/finishLogin 401。檢查對(duì)比了Keycloak和Jenkins線上與線下環(huán)境相關(guān)的配置,發(fā)現(xiàn)配置都是相同的。
    經(jīng)過分析HTTP請(qǐng)求,發(fā)現(xiàn)線上環(huán)境的Jenkins對(duì)外暴露的是域名https://jenkins.xxxxx.com/,而認(rèn)證后跳轉(zhuǎn)到的401地址是http://10.xx.xx.xx:8080/securityRealm/finishLogin
    http://10.xx.xx.xx:8080是Jenkins的ip訪問地址,并且通過該IP訪問方式,Keycloak/飛書可以成功登陸并跳轉(zhuǎn)到Jenkins頁(yè)面。
    檢查Jenkins的配置,發(fā)現(xiàn)Jenkins URL被配置成了http://10.xx.xx.xx:8080,導(dǎo)致通過域名方式訪問Jenkins并認(rèn)證后,跳轉(zhuǎn)到了http://10.xx.xx.xx:8080,此處應(yīng)該是存在session問題,導(dǎo)致認(rèn)證失敗報(bào)401錯(cuò)誤。于是把Jenkins URL改為域名https://jenkins.xxxxx.com/,生效后通過域名登陸成功。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,818評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,185評(píng)論 3 414
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,656評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,647評(píng)論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,446評(píng)論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,951評(píng)論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,041評(píng)論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,189評(píng)論 0 287
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,718評(píng)論 1 333
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,602評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,800評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,316評(píng)論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,045評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,419評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,671評(píng)論 1 281
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,420評(píng)論 3 390
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,755評(píng)論 2 371