SonarQube配置Azure SQL ActiveDirectoryManagedIdentity认证失败求助
关于SonarQube对接Azure SQL托管身份认证的问题
背景
尝试在SonarQube主机中不硬编码账号密码的前提下,配置SonarQube与Azure SQL数据库对接,相关环境信息如下:
- SonarQube版本:10.1.0(评估版)
- Java版本:
java 17.0.7 2023-04-18 LTS Java(TM) SE Runtime Environment (build 17.0.7+8-LTS-224) Java HotSpot(TM) 64-Bit Server VM (build 17.0.7+8-LTS-224, mixed mode, sharing) - SonarQube主机:Azure上的Windows Server 2019 Datacenter,已配置系统分配托管标识
- Azure SQL数据库配置:启用Azure AD认证,SonarQube主机的托管标识已被添加为数据库用户,且通过SSMS验证了连通性
- SonarQube当前配置:
sonar.jdbc.url=jdbc:sqlserver://my-sqlserver.database.windows.net:1433;database=ms-sql-db-sonar;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;user=<SONAR VM IdentityId>;Authentication=ActiveDirectoryManagedIdentity; - 内置JDBC驱动版本:mssql-jdbc-12.2.0.jre11
- SonarQube运行模式:控制台模式
问题
执行<SONAR安装路径>\bin\windows-x86-64\StartSonar启动时,出现以下错误:
2023.07.14 21:41:33 ERROR web[][c.z.h.p.HikariPool] HikariPool-1 - Exception during pool initialization. com.microsoft.sqlserver.jdbc.SQLServerException: Failed to load MSAL4J Java library for performing ActiveDirectoryManagedIdentity authentication. at com.microsoft.sqlserver.jdbc.SQLServerConnection.getFedAuthToken(SQLServerConnection.java:5642) ...
疑问
- SonarQube是否支持Azure SQL的ActiveDirectoryManagedIdentity认证模式?
- 若支持,正确的配置步骤是什么?
- 若不支持,有没有安全存储SQL连接账号密码的替代方案?
已尝试操作
- 从Maven下载msal4j-1.13.9和azure-identity-1.7.0 jar包放入
C:\Program Files\Java\jdk-17\bin - 添加CLASSPATH环境变量指向这些jar包
- 重启系统后问题仍未解决
解答
1. SonarQube是否支持该认证模式?
SonarQube 10.1.0本身支持Azure SQL的ActiveDirectoryManagedIdentity认证模式,但内置的mssql-jdbc驱动需要额外的MSAL4J相关依赖库才能完成托管身份的令牌获取,这是当前报错的核心原因。
2. 正确配置步骤
步骤1:准备兼容的依赖包
mssql-jdbc-12.2.0.jre11需要搭配兼容版本的MSAL4J和Azure Identity库,建议使用:
- msal4j: 1.14.0 及以上版本
- azure-identity: 1.8.0 及以上版本
步骤2:放置依赖包到正确路径
不要将jar包放到JDK目录,应该放到SonarQube安装目录下的extensions/jdbc-driver/mssql文件夹(如果该文件夹不存在,手动创建)。SonarQube启动时会自动加载这个目录下的JDBC驱动相关依赖。
步骤3:修正JDBC URL配置
对于系统分配托管标识,不需要在JDBC URL中指定user=<SONAR VM IdentityId>参数,修正后的URL如下:
sonar.jdbc.url=jdbc:sqlserver://my-sqlserver.database.windows.net:1433;database=ms-sql-db-sonar;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;Authentication=ActiveDirectoryManagedIdentity;
步骤4:重启SonarQube
先停止控制台运行的SonarQube进程,再重新执行StartSonar.bat启动服务。
3. 替代安全方案(若认证模式无法生效时)
如果托管身份认证仍有问题,可以使用Azure Key Vault安全存储SQL账号密码,通过以下方式实现:
- 将SQL的账号和密码存入Azure Key Vault
- 给SonarQube主机的托管标识分配Key Vault的机密读取权限
- 修改SonarQube启动脚本(StartSonar.bat),在启动前通过PowerShell或Azure CLI从Key Vault中读取凭据,设置为环境变量
- 在
sonar.properties中通过环境变量引用凭据:sonar.jdbc.username=${env:SQL_DB_USER} sonar.jdbc.password=${env:SQL_DB_PWD}
内容的提问来源于stack exchange,提问作者Mithun Sen
相关产品推荐
相关产品推荐

