【问题标题】:Spring Boot on Azure Docker container for Linux fails to authenticate to Azure SQL Server on AAD Identity: KrbException适用于 Linux 的 Azure Docker 容器上的 Spring Boot 无法通过 AAD 身份向 Azure SQL Server 进行身份验证:KrbException
【发布时间】:2023-03-15 19:48:01
【问题描述】:

我相信我的标题中包含了所有内容。

我有一个使用 Gradle 和 jib 作为 Docker Linux 容器构建的 Spring Boot 应用程序。

    runtimeOnly 'com.microsoft.sqlserver:mssql-jdbc'
    runtimeOnly 'com.microsoft.sqlserver:mssql-jdbc_auth:9.4.0.x64'

该应用程序现在正在部署到 Azure Web App for Containers,我在其中通过 Identity 选项卡设置了 Web 应用程序的 AAD 身份,并分配了一个 贡献者在目标 SQL Server 中的角色。

我确信一切都已准备就绪。该应用附带Flyway,因此它会在默认架构中自行创建表。

我在 Azure 配置选项卡中设置了下面的环境变量

SPRING_DATASOURCE_URL=jdbc:sqlserver://????.database.windows.net:1433;database=?????;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;Authentication=ActiveDirectoryIntegrated

我认为这是所需的一切。

相反,例外是(与本地 Docker 完全相同)

2021-12-23T15:51:35.891324272Z Caused by: java.lang.IllegalArgumentException: KrbException: Cannot locate default realm
2021-12-23T15:51:35.891327972Z  at java.security.jgss/javax.security.auth.kerberos.KerberosPrincipal.<init>(Unknown Source) ~[java.security.jgss:na]
2021-12-23T15:51:35.891331972Z  at java.security.jgss/javax.security.auth.kerberos.KerberosPrincipal.<init>(Unknown Source) ~[java.security.jgss:na]
2021-12-23T15:51:35.891335972Z  at com.microsoft.sqlserver.jdbc.SQLServerMSAL4JUtils.getSqlFedAuthTokenIntegrated(SQLServerMSAL4JUtils.java:106) ~[mssql-jdbc-9.4.0.jre8.jar:na]
2021-12-23T15:51:35.891339872Z  at com.microsoft.sqlserver.jdbc.SQLServerConnection.getFedAuthToken(SQLServerConnection.java:4849) ~[mssql-jdbc-9.4.0.jre8.jar:na]
2021-12-23T15:51:35.891343672Z  at com.microsoft.sqlserver.jdbc.SQLServerConnection.onFedAuthInfo(SQLServerConnection.java:4724) ~[mssql-jdbc-9.4.0.jre8.jar:na]
2021-12-23T15:51:35.891348072Z  at com.microsoft.sqlserver.jdbc.SQLServerConnection.processFedAuthInfo(SQLServerConnection.java:4680) ~[mssql-jdbc-9.4.0.jre8.jar:na]
2021-12-23T15:51:35.891352072Z  at com.microsoft.sqlserver.jdbc.TDSTokenHandler.onFedAuthInfo(tdsparser.java:289) ~[mssql-jdbc-9.4.0.jre8.jar:na]
2021-12-23T15:51:35.891355872Z  at com.microsoft.sqlserver.jdbc.TDSParser.parse(tdsparser.java:125) ~[mssql-jdbc-9.4.0.jre8.jar:na]
2021-12-23T15:51:35.891359673Z  at com.microsoft.sqlserver.jdbc.TDSParser.parse(tdsparser.java:37) ~[mssql-jdbc-9.4.0.jre8.jar:na]
2021-12-23T15:51:35.891363573Z  at com.microsoft.sqlserver.jdbc.SQLServerConnection.sendLogon(SQLServerConnection.java:5560) ~[mssql-jdbc-9.4.0.jre8.jar:na]
2021-12-23T15:51:35.891367373Z  at com.microsoft.sqlserver.jdbc.SQLServerConnection.logon(SQLServerConnection.java:4289) ~[mssql-jdbc-9.4.0.jre8.jar:na]
2021-12-23T15:51:35.891371173Z  at com.microsoft.sqlserver.jdbc.SQLServerConnection.access$000(SQLServerConnection.java:88) ~[mssql-jdbc-9.4.0.jre8.jar:na]
2021-12-23T15:51:35.891375073Z  at com.microsoft.sqlserver.jdbc.SQLServerConnection$LogonCommand.doExecute(SQLServerConnection.java:4227) ~[mssql-jdbc-9.4.0.jre8.jar:na]
2021-12-23T15:51:35.891378773Z  at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:7417) ~[mssql-jdbc-9.4.0.jre8.jar:na]
2021-12-23T15:51:35.891382573Z  at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:3488) ~[mssql-jdbc-9.4.0.jre8.jar:na]
2021-12-23T15:51:35.891386373Z  at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectHelper(SQLServerConnection.java:2978) ~[mssql-jdbc-9.4.0.jre8.jar:na]
2021-12-23T15:51:35.891393373Z  at com.microsoft.sqlserver.jdbc.SQLServerConnection.login(SQLServerConnection.java:2628) ~[mssql-jdbc-9.4.0.jre8.jar:na]
2021-12-23T15:51:35.891397373Z  at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectInternal(SQLServerConnection.java:2471) ~[mssql-jdbc-9.4.0.jre8.jar:na]
2021-12-23T15:51:35.891401273Z  at com.microsoft.sqlserver.jdbc.SQLServerConnection.connect(SQLServerConnection.java:1470) ~[mssql-jdbc-9.4.0.jre8.jar:na]
2021-12-23T15:51:35.891405173Z  at com.microsoft.sqlserver.jdbc.SQLServerDriver.connect(SQLServerDriver.java:915) ~[mssql-jdbc-9.4.0.jre8.jar:na]
2021-12-23T15:51:35.891408973Z  at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:121) ~[HikariCP-4.0.3.jar:na]
2021-12-23T15:51:35.891412773Z  at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:364) ~[HikariCP-4.0.3.jar:na]
2021-12-23T15:51:35.891417173Z  at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:206) ~[HikariCP-4.0.3.jar:na]
2021-12-23T15:51:35.891421173Z  at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:476) ~[HikariCP-4.0.3.jar:na]
2021-12-23T15:51:35.891424973Z  at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) ~[HikariCP-4.0.3.jar:na]
2021-12-23T15:51:35.891428873Z  ... 32 common frames omitted
2021-12-23T15:51:35.891432573Z 

在本地,这很明显。我绝对没有 KRB 配置。

但我认为 Azure 会在我导航门户上的“身份”选项卡时自动配置容器(我的应用程序的身份所在的位置,即 395f00ce-c4ed-4be5-ac35-7767f4799555

问题:为了将 Web 应用程序的无密码后端到后端身份验证配置到 Azure SQL Server,我可以/必须做些什么?

我读过一些tutorials,其中包括许多机器级别的配置步骤,但我们谈论的是由 Azure 部署和管理的容器。我不知道这些是否适用。 Docker镜像是Jib构建的Spring Boot兼容镜像,所以我没有Dockerfile

【问题讨论】:

  • 您是否使用 az login --identity 从容器/Web 应用登录到 Azure
  • 没有。我没有从容器中运行任何 内容。它只是一个基于 Java 11 的普通 Docker/Spring Boot 映像。我认为容器在 $PATH 中没有可用的 az 命令。我不知道az login 的影响我已通过 Azure 门户 Web 界面为 Web 应用程序分配了一个标识。我不知道它是否与问题中指定的上述命令具有相同的效果。该 GUID 在 SQL 数据库中为 Collaborator

标签: java azure jdbc azure-active-directory azure-sql-server


【解决方案1】:

问题:还有什么我可以/必须做的 为 Web 应用程序配置无密码后端到后端身份验证 到 Azure SQL Server?

当您为 Web 应用程序使用系统分配的托管标识并向 SQL 服务器提供贡献者角色时,您需要从 Spring Boot 应用程序登录到 Azure

您可以将 Spring Boot 应用程序配置为在应用程序代码中使用系统分配的托管标识

然后您就可以从您的 Web 应用程序访问 Azure SQL 服务器,而无需任何密码

【讨论】:

  • You can configure your spring boot application to use System Assigned Managed Identity in your application code => 您能否就这项任务提供一些指导?我只找到了关于通过 http (docs.microsoft.com/en-us/azure/active-directory/…) 检索托管身份令牌的 Microsoft 教程,但我还不知道如何将其集成到 Spring Boot 中
猜你喜欢
  • 1970-01-01
  • 2019-01-13
  • 1970-01-01
  • 1970-01-01
  • 2021-04-18
  • 1970-01-01
  • 1970-01-01
  • 2018-11-17
  • 2020-01-31
相关资源
最近更新 更多