从 Azure应用服务安全地连接到 Azure 服务和数据库

你的应用服务可能需要连接到其他 Azure 服务,例如数据库、存储或其他应用。 本概述推荐了不同的连接方法及其使用时机。

目前,有关连接方法的决策与机密管理密切相关。 在连接字符串中使用连接机密(例如用户名和密码、机密密钥等)的常用模式不再被视为最安全的连接方法。 目前的风险甚至更高,因为威胁行动者会定期以爬网方式在公共 GitHub 存储库中窃取意外提交的连接机密。 对于云应用程序而言,最好的机密管理方式就是根本不提供机密。 迁移到 Azure 应用服务时,应用可能会从基于机密的连接开始,而应用服务可让你安全地保守机密。 但是,Azure 可以通过 Microsoft Entra 身份验证来帮助保护应用的后端连接,从而完全消除了应用中的机密。

连接方法 使用时机
使用应用标识进行连接 * 你希望从应用程序中完全删除凭据、密钥或机密。
* 下游 Azure 服务支持 Microsoft Entra 身份验证,例如 Microsoft Graph。
* 下游资源不需要知道当前已登录的用户,也不需要对当前已登录的用户进行精细授权。
代表已登录的用户进行连接 * 应用必须代表已登录的用户访问下游资源。
* 下游 Azure 服务支持 Microsoft Entra 身份验证,例如 Microsoft Graph。
* 下游资源必须对当前已登录的用户执行精细授权。
使用机密进行连接 * 下游资源需要连接机密。
* 应用连接到非 Azure 服务,例如本地数据库服务器。
* 下游 Azure 服务尚不支持 Microsoft Entra 身份验证。

使用应用标识进行连接

如果应用已使用单一的一组凭据来访问下游 Azure 服务,则你可以快速将连接转换为使用应用标识。 Microsoft Entra ID 提供的托管标识允许应用服务不使用机密来访问资源,并且你可以通过基于角色的访问控制 (RBAC) 来管理其访问权限。 托管标识可以连接到任何支持 Microsoft Entra 身份验证的 Azure 资源,并且身份验证将通过短期令牌进行。

下图说明了以下应用服务连接到其他 Azure 服务:

  • A:用户访问 Azure 应用服务网站。
  • B:使用托管标识从应用服务安全地连接到另一个 Azure 服务。
  • C:使用托管标识从应用服务安全地连接到 Azure Graph。

一个图示,显示了访问资源的托管标识(使用或不使用用户的标识)。

使用应用程序机密连接到数据库的示例:

代表已登录的用户进行连接

应用可能需要代表已登录的用户连接到下游服务。 应用服务允许你使用最常见的标识提供者轻松验证用户身份(请参阅 Azure 应用服务和 Azure Functions 中的身份验证和授权)。 如果使用 Microsoft 提供者(Microsoft Entra 身份验证),则你可以将已登录的用户定向到任何下游服务。 例如:

  • 运行数据库查询,用于返回已登录用户有权读取的机密数据。
  • 以已登录用户的身份在 Azure Graph 中检索个人数据或执行操作。

下图演示一个应用程序代表已登录用户安全地访问 SQL 数据库。

教程方案的体系结构示意图。

一些常见的情况有:

使用机密进行连接

建议通过两种方式在应用中使用机密:使用 Azure 密钥保管库中存储的机密或应用服务应用设置中的机密。

使用 Key Vault 中的机密

Azure Key Vault 可用于安全地存储机密和密钥、监视机密的访问和使用以及简化应用程序机密的管理。 如果下游服务不支持 Microsoft Entra 身份验证或需要连接字符串或密钥,请使用密钥保管库来存储机密,并使用托管标识将应用连接到密钥保管库并检索机密。 应用可以访问密钥保管库机密,因为密钥保管库引用应用设置中的

与 Key Vault 集成的托管标识的优势包括:

  • 仅限应用访问密钥保管库机密。
  • 应用参与者(例如管理员)可以完全控制应用服务资源,但同时无权访问密钥保管库机密。
  • 如果你的应用程序代码可以通过应用设置访问连接机密,则无需进行任何更改。
  • Key Vault 提供监视和审核谁访问了机密的功能。
  • 轮换密钥保管库机密不需要在应用服务中进行任何更改。

下图演示了应用服务使用托管标识连接到密钥保管库,然后使用密钥保管库中存储的机密访问 Azure 服务:

该图显示应用服务使用一个机密来连接到 Azure AI 服务,该机密存储在密钥保管库中并通过托管标识进行管理。

使用应用设置中的机密

对于使用机密(例如用户名、密码和 API 密钥)连接到服务的应用,应用服务可将这些机密安全地存储在应用设置中。 这些机密会在应用启动时作为环境变量注入到应用程序代码中。 应用程序设置在存储时始终进行加密(静态加密)。 要进行更高级的机密管理,例如机密轮换、访问策略和审核历史记录,请尝试使用密钥保管库

使用应用程序机密连接到数据库的示例:

后续步骤

了解如何: