注释
无密码连接是一项跨多个 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 应用服务和Azure 容器应用)中启用托管标识。 服务连接器还使用托管标识和 Azure RBAC 配置无密码连接的后端服务,并使用必要的连接信息冻结应用程序。
如果检查配置为无密码连接的应用程序的运行环境,则可以看到完整的连接字符串。 例如,连接字符串包含数据库服务器地址、数据库名称和将身份验证委托给 Azure 身份验证插件的指令,但它不包含任何密码或机密。
以下视频以 Java 应用程序为例,演示了从应用到 Azure 服务的无密码连接。 其他语言的类似报道即将推出。
DefaultAzureCredential 简介
可以从Azure标识客户端库使用DefaultAzureCredential,通过Microsoft Entra ID和基于角色的访问控制(RBAC)实现与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>.servicebus.windows.net"),
new DefaultAzureCredential());
另请参阅
有关无密码连接的更详细说明,请参阅开发人员指南 在多个 Azure 应用和服务之间配置无密码连接。