Jenkins + SonarQube 從原理到實戰三:SonarQube 打通 Windows AD(LDAP)認證與踩坑記錄

前言

在前兩篇文章中,已經介紹了 SonarQube 的部署 以及 通過 sonar-cxx 插件實現 C/C++ 代碼掃描
本篇將重點講 如何讓 SonarQube 對接 Windows AD(LDAP),實現域賬號登錄和基于 AD 組的權限管理。


一、背景與需求分析

需求分析

在原有環境中,代碼流轉流程是這樣的:

  • 開發在 Gerrit 提交代碼
  • Jenkins 節點定時或按需觸發自定義腳本掃描問題,并執行編譯

新需求:

  1. 在編譯之前,先掃描一次代碼(或編譯+掃描同步進行)
  2. 項目相關人員 能直接登錄 SonarQube 查看代碼問題并修復
  3. 非項目相關人員 無法訪問該項目(權限管控)

權限模型簡述

SonarQube 的權限是項目級的,可以通過:

  • 將項目設為 私有
  • 給特定 用戶組成員 分配訪問所需權限

經測試,權限如下:

角色/權限項組管理(添加/刪除成員)項目權限配置項目刪除備注
系統管理員(Administrator)? 可以對任意組添加或刪除成員? 可以配置任意項目的成員或組權限? 可以刪除任意項目擁有全局最高權限
項目管理員(Project Administrator)? 無法管理組成員? 僅能管理該項目的權限(成員/組)? 僅能刪除該項目該權限需系統管理將項目為私有后才可配置
普通組成員? 無法管理組成員? 無法配置項目權限? 無法刪除項目系統組沒有單獨的“組管理員”角色

所以這里無法單獨給項目設組管理員去維護組成員,但可以配置 項目管理員,由其對相關組或用戶進行權限管理

碰巧目前我司項目是由 部門/組 進行劃分,并且 Windows AD 上早已為這些成員配置了 AD 組 ,所以只需要在項目上設 私有 并且給相應的組配置好權限,讓 LADP 將要組人員信息同步過來,那就可以減少一部分的人為操作管理。


二、Windows AD 集成

舊版本 SonarQube 需要額外安裝 LDAP 插件,而 9.9 LTS 版本(我是用的版本)已經內置了 LDAP 支持。

官方參考文檔:

  • SonarQube 9.9 LDAP 配置文檔
    這篇文檔,詳細介紹了 LDAP 怎么連接、使用、配置參數等,如:
    ldap.url這個參數是指 ldap 的連接地址
  • SonarQube 環境變量配置文檔
    但使用的是 k8s ,即容器,該文檔介紹了 SonarQube 容器可使用哪些 env 參數。

配置思路

由于我是在 Kubernetes 環境運行 SonarQube,所以我選擇:

  • 數據庫配置與 LDAP 配置都放到 Secret 中,避免明文寫在 Deployment YAML
  • Deployment 通過 envFrom 讀取 Secret

原 Deployment(明文寫環境變量)

...
containers:
- name: sonarqubeimage: sonarqube:lts-communityenv:- name: TZvalue: 'Asia/Shanghai'- name: SONAR_JDBC_URLvalue: jdbc:postgresql://postgresql:5432/sonar- name: SONAR_JDBC_USERNAMEvalue: sonar- name: SONAR_JDBC_PASSWORDvalue: sonar- name: SONAR_WEB_JVM_OPTSvalue: "-Xmx2G -Xms1G -XX:+HeapDumpOnOutOfMemoryError"
...

新 Deployment(調用 Secret)

...
containers:
- name: sonarqubeimage: sonarqube:lts-communityenv:- name: TZvalue: 'Asia/Shanghai'- name: SONAR_WEB_JVM_OPTSvalue: "-Xmx2G -Xms1G -XX:+HeapDumpOnOutOfMemoryError"envFrom:- secretRef:name: sonar-secret
...

Secret 配置(secret.yaml

apiVersion: v1
kind: Secret
metadata:name: sonar-secretnamespace: sonar
type: Opaque
stringData:SONAR_JDBC_URL: "jdbc:postgresql://postgresql:5432/sonar"SONAR_JDBC_USERNAME: "sonar"SONAR_JDBC_PASSWORD: "sonar"SONAR_SECURITY_REALM: "LDAP"                      # 啟用 LDAP 認證SONAR_AUTHENTICATOR_DOWNCASE: "true"                 # 登錄名轉小寫,防止大小寫問題LDAP_URL: "ldap://192.168.1.1:389"                  # AD/LDAP 服務器地址(可改成 ldaps:// )LDAP_BINDDN: "CN=sonar,OU=User,OU=AA,DC=aa,DC=com"LDAP_BINDPASSWORD: "sonar"                 # 綁定賬號密碼LDAP_AUTHENTICATION: "simple"                      # 認證方式,一般 simple 就夠LDAP_REALM: "aa.com"                          # 可選,用于某些 Digest 認證LDAP_CONTEXTFACTORYCLASS: "com.sun.jndi.ldap.LdapCtxFactory" # LDAP Java 工廠類LDAP_STARTTLS: "false"                              # 是否啟用 StartTLS(不是 SSL)LDAP_FOLLOWREFERRALS: "false"                       # 是否跟隨 LDAP 引用LDAP_USER_BASEDN: "OU=AA,DC=aa,DC=com"      # 用戶搜索起始 DNLDAP_USER_REQUEST: "(&(objectClass=user)(sAMAccountName={login}))" # 用戶搜索過濾條件LDAP_USER_REALNAMEATTRIBUTE: "cn"                   # 用戶真實姓名屬性LDAP_USER_EMAILATTRIBUTE: "mail"                    # 用戶郵箱屬性LDAP_GROUP_BASEDN: "OU=Groups,DC=aa,DC=com"    # 組搜索起始 DNLDAP_GROUP_REQUEST: "(&(objectClass=group)(member={dn}))" # 組搜索過濾條件LDAP_GROUP_IDATTRIBUTE: "sAMAccountName"            # 組 ID 屬性

參數解釋

變量名作用
SONAR_SECURITY_REALM啟用 LDAP 認證
SONAR_AUTHENTICATOR_DOWNCASE將用戶名轉換為小寫,避免 AD 大小寫問題
LDAP_URLLDAP/AD 服務器地址,支持 ldap://ldaps://
LDAP_BINDDN用于綁定 LDAP 的賬號 DN(需有讀取用戶/組的權限)
LDAP_BINDPASSWORD綁定賬號的密碼
LDAP_USER_BASEDN用戶搜索起點 DN
LDAP_USER_REQUEST用戶搜索過濾規則
LDAP_GROUP_BASEDN組搜索起點 DN
LDAP_GROUP_REQUEST組搜索過濾規則
LDAP_GROUP_IDATTRIBUTE組 ID 屬性,一般為 sAMAccountName

小貼士:
LDAP_BINDDN 格式:

CN=sonar,OU=User,OU=AA,DC=aa,DC=com

表示 aa.com 域下 AA → User 組織單位中的 sonar 用戶。


部署與驗證

kubectl delete -f sonarqube.yaml
kubectl apply -f secret.yaml && kubectl apply -f sonarqube.yaml

常見啟動失敗原因:

  1. 數據庫連接信息錯誤
  2. LDAP 賬號/密碼錯誤
  3. DN 路徑拼寫錯誤
  4. 網絡防火墻攔截 LDAP 端口

若訪問有問題,kubectl logs 看下啟動日志,一般就以上問題。

然后使用 AD 域賬號瀏覽器登錄 SonarQube ,成功登錄即加域成功


三、AD 組同步的坑

經測試 + 官方聲明,發現 SonarQube 是 不會直接把 AD 組以及組內成員同步系統上

可以在 SonarQube 上面新建同名 AD 組,重啟系統進行同步,當然會存在一些 限制

  • 組不會自動同步成員

    • 只有當成員首次登錄 SonarQube 后,系統才會將該成員加入對應組。
    • 并且 SonarQube 新建同名組,還得重啟服務器生效 。
  • 組刪除成員不實時

    • AD 組刪除成員,SonarQube 上面同名組并不會實時刪除。
    • 需要重啟 SonarQube,并且該成員重新登錄后,才會被移出組。
  • 多層組結構問題

    • 如果 AD 中 A 組包含 B 組,B 組里有成員 C,SonarQube 不會識別成員 C 屬于 A 組

實際同步流程:

  1. 新建 SonarQube 組(與 AD 組同名)
  2. 重啟 SonarQube
  3. AD 組成員登錄一次
  4. 該成員才會被加入組

總結

正式上線前,給 AD 組配置同名組,并給這個同名組配好相關權限。并由 項目管理員 去配置項目權限。

后續 AD 賬號登錄 SonarQube 就自動加入對應組,即上線就有相應權限。

后續優化:
目前在新建 AD 同名組以及刪除 AD 域控上組成員,都必須要重啟 SonarQube 服務且 AD 用戶重新登錄才生效,后續看能不能通過調用 SonarQube 的 API 實現實時權限變更(通過調用 Gerrit/Jenkins 的 API 進行信息匹對)。

當然,也要看正式上線后大家反饋的問題,若有強烈的實時同步需求,就按上面方式進行優化。

下一篇將更新 SonarQube 如何打通 Jenkins。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/93056.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/93056.shtml
英文地址,請注明出處:http://en.pswp.cn/web/93056.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[AI React Web] 包與依賴管理 | `axios`庫 | `framer-motion`庫

第七章:包與依賴管理 在我們使用open-lovable的旅程中,已經探索了它如何管理對話狀態(第一章:對話狀態管理)、將創意轉化為可運行代碼(第二章:AI代碼生成管道)、如何在安全的虛擬環…

PanSou 一款開源網盤搜索項目,集成前后端,一鍵部署,開箱即用

PanSou 網盤搜索API PanSou是一個高性能的網盤資源搜索API服務,支持TG搜索和自定義插件搜索。系統設計以性能和可擴展性為核心,支持并發搜索、結果智能排序和網盤類型分類。 項目地址:https://github.com/fish2018/pansou 特性&#xff08…

java爬蟲實戰

本人目前在做魚皮的《智能協同云圖庫》,涉及到了以圖搜圖圖片爬取,雖然以前有爬過圖片,但是用的都是別人現成的代碼,不怎么去理解為什么要這樣做,這次有在嘗試理解每一個步驟。本人基礎極差,屬于一點基礎也…

深入詳解C語言的循環結構:while循環、do-while循環、for循環,結合實例,講透C語言的循環結構

🔥個人主頁:艾莉絲努力練劍 ?專欄傳送門:《C語言》、《數據結構與算法》、C語言刷題12天IO強訓、LeetCode代碼強化刷題、C/C干貨分享&學習過程記錄 🍉學習方向:C/C方向 ??人生格言:為天地立心&#…

北京-4年功能測試2年空窗-報培訓班學測開-第七十四天-線下面試-聊的很滿意但可能有風險-等信吧

今天沒去教室,因為下午有個線下面試。其實是可以去教室的,但我實在太焦慮了,我覺得去了教室我心情會更不好,什么都干不下去,所以我選擇不去早上依舊是帶著滿滿焦慮起來的,會覺得自己的一切都不令自己滿意&a…

在ubuntu服務器下安裝cuda和cudnn(筆記)

目錄 0 引言 1 相關環境查詢 2 安裝cuda 2.1 下載并安裝 2.2 安裝選項配置 2.3 驗證安裝 3 安裝cudnn 3.1 下載 3.2 解壓 3.3 刪除舊版本 cuDNN 3.4 復制新文件到 CUDA 目錄 3.5 設置文件權限 3.6 創建軟鏈接 3.7 驗證安裝 0 引言 我在使用服務器的cuda11.8的時…

docker安裝centos

docker庫地址https://hub.docker.com/ 嘗試使用centos7試了幾次超時 換了個版本就可以了 docker pull centos:centos7.9.2009有時候需要更新資源地址 可以使用 vim /etc/docker/daemon.json配置其他資源地址 {"registry-mirrors": ["http://hub-mirror.c.163…

內容索引之word轉md工具 - markitdown

切分文檔構建RAG庫過程中,langchain、llamaindex更期望處理latex、md類帶有顯式結構文檔。 langchain、llamaindex切分word,有可能將段落中間截斷,導致切分后的塊語義不完整。 所以,需要先將word轉化為md格式,然后再…

MaxKB+合合信息TextIn:通過API實現PDF掃描件的文檔審核

上海合合信息科技股份有限公司(以下簡稱為合合信息)是一家深耕人工智能、OCR(光學字符識別)及商業大數據技術領域的科技企業。該公司擁有領先的智能文字識別技術,其名片全能王(CamCard)、掃描全…

MyBatis 核心入門:從概念到實戰,一篇掌握簡單增刪改查

目錄 一、什么是 MyBatis?為什么要用它? 二、MyBatis 核心概念(通俗理解) 1.SqlSessionFactory 2.SqlSession 3.Mapper接口 4.映射文件(XML) 三、手把手搭建第一個 MyBatis 項目 1. 準備工作 2. 核心配置文…

數據結構初階(12)排序算法—插入排序(插入、希爾)(動圖演示)

2. 常見排序算法的實現2.0 十大排序算法2.1 插入排序 2.1.1 基本思想直接插入排序是一種簡單的插入排序法:基本思想把待排序的記錄按其關鍵碼值的大小逐個插入到一個已經排好序的有序序列中。直到所有的記錄插入完為止,得到一個新的有序序列 。 比 挪 (…

MySQL優化常用的幾個方法

本實例是對慢sql從2萬優化到5千優化方法的匯總。 首先貼上優化效果:1、更新數據時使用ID更新;2、"分頁/輪詢"查詢時先獲取符合數據要求主鍵的最大和最小ID,然后WHERE條件增加ID步增查詢;3、檢查SQL是否命中WHERE條件&am…

深入解析 AUTOSAR:汽車軟件開發的革命性架構

引言在汽車智能化、網聯化、電動化浪潮席卷全球的今天,汽車電子系統的復雜性與日俱增。傳統“煙囪式”的 ECU 開發模式(各供應商獨立開發軟硬件)帶來了巨大的兼容性、復用性和維護成本挑戰。AUTOSAR(AUTomotive Open System ARchi…

計算機視覺(opencv)實戰一——圖像本質、數字矩陣、RGB + 圖片基本操作(灰度、裁剪、替換等)

OpenCV 入門教程: OpenCV(Open Source Computer Vision Library)是一個開源的計算機視覺庫,廣泛應用于圖像處理、視頻分析、機器學習等領域。 在 Python 中,cv2 是 OpenCV 的主要接口模塊。本文將帶你一步步掌握 cv2…

《探索C++ set與multiset容器:深入有序唯一性集合的實現與應用》

前引:在STL的關聯式容器中,set以其嚴格的元素唯一性和自動排序特性成為處理有序數據的核心工具。其底層基于紅黑樹(Red-Black Tree)實現,保證了O(log n)的查找、插入與刪除復雜度!本文將從底層原理切入&…

各測試平臺功能對比分析(ITP,Postman,Apifox,MeterSphere)

對比ITP與Postman,Apifox,MeterSphere 功能特性ITPPostmanApifoxMeterSphere接口測試? 可視化接口調試,支持多種請求方式? 支持? 支持? 支持場景測試? 多接口串聯測試,支持前后置腳本? Collections功能? 支持? 支持定時任務? 基于Celery的定時…

開源日志log4cplus—如何將 string類型轉為tstring類型,又如何將char*類型轉換為tstring類型?

文章目錄🔧 一、理解 log4cplus::tstring 的本質?? 二、std::string 轉 tstring 的三種方法? 1. 使用內置宏 LOG4CPLUS_STRING_TO_TSTRING(推薦)? 2. 手動條件編譯轉換(精細控制)? 3. 多字節模式下的直接賦值??…

深度學習之CNN網絡簡介

CNN網絡簡單介紹 1.概述 卷積神經網絡(Convolutional Neural Network,CNN)是一種專門用于處理具有網格狀結構數據的深度學習模型。 ? CNN網絡主要有三部分構成:卷積層、池化層和全連接層構成,其中卷積層負責提取圖像中…

【微實驗】基頻提取的MATLAB實現(優化版)

前情提要: 【超詳細】科普:別再只會用自相關!YIN 和 PYIN 如何破解音頻隱藏密碼?-CSDN博客 【微實驗】媽媽我的MATLAB會識別聲音的基頻了!-CSDN博客 今天用MATLAB把算法封裝成函數,然后調用對比結果。 …

開發 npm 包【詳細教程】(含發布 npm 包,版本號升級,修改包后重新發布等)

1. 給 npm 包取個【唯一】的名字! npm 包命名規范 只能包含小寫字母(a-z)、數字(0-9)、連字符(-) 和 下劃線(_),不能包含空格、大寫字母、標點符號&#xff…