前言

在前两篇文章中,已经介绍了 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…