使用 AD 帐户从 ASP.NET 8 容器登录 SQL Server 的 Kerberos Sidecar
我最近在做一个项目,需要将一个 ASP.NET 8 Web API 应用程序容器化,该应用程序需要与本地运行的 SQL Server 数据库进行通信。我们决定将 ASP.NET 8 容器定位到 Linux 系统,因此必须与运行在 Windows AD 域中的数据库进行通信。
问题
我们之前的设置是使用 IIS 在 Windows 上部署 ASP.NET 8 应用,将 AD 服务帐户配置为 AppPool 身份,并授予其对 SQL Server 数据库的访问权限。
在容器化 ASP.NET 8 应用时,我们遇到的问题是与 SQL Server 数据库的连接中断。只有 Azure SQL Server 数据库在连接字符串中接受用户名和密码,但考虑到我们的本地 SQL Server 设置,这对我们来说行不通。
解决方案
因此,唯一的选择是为我们的 Linux 容器构建一个 Sidecar,通过管理 AD SQL 帐户登录的 Kerberos 令牌,实现从 ASP.NET 8 容器到 SQL Server 数据库的连接。您可以使用 Linux 上可用的 Kerberos 库来实现这一点,并启用 SQL Server 来接受使用 Kerberos 协议的登录。
步骤非常简单:
- 使用您的 SQL 登录名和相关密码生成密钥表文件 (keytab)。为此,您需要使用 ktutil 工具。您可以在此处找到相关文档。
- 创建 Sidecar,它使用 SQL 登录名和密钥表文件(位于只读文件夹中)更新票据,并将 Kerberos 票据存储在共享文件夹中。
Sidecar 也可以创建第一个 Kerberos 票据,但这需要传入 SQL 登录名帐户的密码,并且根据您的偏好设置和安全策略,这可能行不通。
- 配置 ASP.NET 容器使用上一步中相同的共享卷,并使用 Kerberos 票证,以便 SqlConnection 可以与 SQL Server 数据库通信。
实施
下图展示了该解决方案的整体设置,其中主容器和 Sidecar 使用一个共享卷,Kerberos