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 服务。 它们通常使用保管库将密码存储和加载到应用程序中,并通过添加密码轮换要求和过程进一步降低风险。 反过来,此方法会增加操作复杂性,有时还会导致应用程序连接中断。

无密码连接和零信任

现在可以在应用中使用无密码连接连接到基于 Azure 的服务,而无需轮换密码。 在某些情况下,只需要配置 -- 无需新代码。 零信任使用“永不信任、始终验证和无凭据”的原则。 这意味着仅在验证标识后以及授予用户对后端服务的访问权限后,才信任计算机或用户来保护所有通信。

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

可以使用服务连接或手动配置与 Azure 服务的无密码连接。 服务连接器可在 Azure Spring Apps、Azure 应用服务和 Azure 容器应用等应用托管服务中启用托管标识。 服务连接程序还使用托管标识和 Azure RBAC 配置无密码连接的后端服务,并使用必要的连接信息冻结应用程序。

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

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


DefaultAzureCredential 简介

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

重要

某些语言必须在代码中显式实现 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 应用和服务之间配置无密码连接。