Azure 服务的无密码连接

注释

无密码连接是一项跨多个 Azure 服务的语言无关功能。 尽管当前文档侧重于几种语言和服务,但我们目前正在为其他语言和服务制作其他文档。

本文介绍了密码的安全挑战,并介绍了 Azure 服务的无密码连接。

密码和机密的安全挑战

应谨慎使用密码和密钥,开发人员绝不能将它们放置在不安全的位置。 许多应用使用用户名、密码和访问密钥连接到后端数据库、缓存、消息传送和事件服务。 如果公开,这些凭据可用于未经授权访问敏感信息,例如为即将到来的市场活动生成的销售目录,或必须专用的客户数据。

由于许多原因(包括通过代码存储库发现)将密码嵌入应用程序本身会带来巨大的安全风险。 许多开发人员使用环境变量外部化此类密码,以便应用程序可以从不同的环境加载这些密码。 但是,这只会将风险从代码本身转移到执行环境。 获得环境访问权限的任何人都可以窃取密码,进而会增加数据外泄风险。

下面的代码示例演示如何使用存储帐户密钥连接到 Azure 存储。 许多开发人员倾向于这种解决方案,因为它与他们过去使用过的选项感觉很熟悉,即使它不是一个理想的解决方案。 如果您的应用程序当前使用访问密钥,请考虑迁移到无密码连接。

// Connection using secret access keys
BlobServiceClient blobServiceClient = new(
    new Uri("https://<storage-account-name>.blob.core.windows.net"),
    new StorageSharedKeyCredential("<storage-account-name>", "<your-access-key>"));

开发人员必须勤奋,切勿在不安全的位置公开这些类型的密钥或密钥。 许多公司都有严格的安全要求,可以在不向开发人员、作员或其他任何人公开密码的情况下连接到 Azure 服务。 他们通常使用保险库来存储密码并将其加载到应用程序中,并通过添加密码轮换要求和过程来进一步降低风险。 这种方法反过来又增加了作复杂性,有时还会导致应用程序连接中断。

无密码连接和 Zero Trust

现在,您可以在应用程序中使用无密码连接来连接到基于 Azure 的服务,而无需轮换密码。 在某些情况下,您只需要配置,不需要新代码。 Zero Trust 使用“从不信任、始终验证和无凭据”的原则。 这意味着只有在验证身份并授予他们访问后端服务的权限之前,才能通过信任机器或用户来保护所有通信。

对于安全的无密码连接,建议的身份验证选项是将托管身份和 Azure 基于角色的访问控制 (RBAC) 结合使用。 使用此方法,您不必手动跟踪和管理托管身份的许多不同机密,因为这些任务由 Azure 在内部安全地处理。

可以使用服务连接器配置与 Azure 服务的无密码连接,也可以手动进行配置。 服务连接器可在 Azure Spring Apps、Azure 应用服务和 Azure 容器应用等应用托管服务中启用托管标识。 Service Connector 还使用托管身份和 Azure RBAC 通过无密码连接配置后端服务,并使用必要的连接信息激活应用程序。

如果检查配置为无密码连接的应用程序的运行环境,则可以看到完整的连接字符串。 例如,连接字符串包含数据库服务器地址、数据库名称和将身份验证委托给 Azure 身份验证插件的指令,但它不包含任何密码或机密。

以下视频以 Java 应用程序为例,演示了从应用到 Azure 服务的无密码连接。 其他语言的类似报道即将推出。


DefaultAzureCredential 简介

可以使用 Azure 标识客户端库通过 Microsoft Entra ID 和基于角色的访问控制 (RBAC) 实现 DefaultAzureCredential 与 Azure 服务的无密码连接。

重要

某些语言必须在代码中显式实现 DefaultAzureCredential,而其他语言则通过基础插件或驱动程序在内部使用 DefaultAzureCredential

DefaultAzureCredential 支持多种身份验证方法,并自动确定应在运行时使用哪些方法。 此方法使应用能够在不同环境(本地开发与生产环境)中使用不同的身份验证方法,而无需实现特定于环境的代码。

搜索凭据的顺序和位置 DefaultAzureCredential 因语言而异:

例如,在本地使用 .NET 时,DefaultAzureCredential 通常会使用开发人员用于登录 Visual Studio、Azure CLI 或 Azure PowerShell 的帐户进行身份验证。 将应用部署到 Azure 时,DefaultAzureCredential 将自动发现并使用关联托管服务(例如 Azure 应用服务)的托管标识。 此转换不需要进行任何代码更改。

注释

托管标识提供用于表示应用或服务的安全标识。 该身份由 Azure 平台管理,不需要您预置或轮换机密。 可以在概述文档中详细了解托管标识。

以下代码示例演示如何使用无密码连接连接到服务总线。 其他文档更详细地介绍了如何为特定服务迁移到此设置。 .NET 应用可以将 的实例 DefaultAzureCredential 传递到服务客户端类的构造函数中。 DefaultAzureCredential 将自动发现该环境中可用的凭据。

ServiceBusClient serviceBusClient = new(
    new Uri("https://<your-service-bus-namespace>.blob.core.windows.net"),
    new DefaultAzureCredential());

另请参阅

有关无密码连接的更详细说明,请参阅开发人员指南 在多个 Azure 应用和服务之间配置无密码连接