Partager via

使用 Azure Service Bus 禁用本地或共享访问密钥身份验证

可以通过两种方式向 Azure 服务总线资源进行身份验证:

  • Microsoft Entra ID
  • 共享访问签名 (SAS)

Microsoft Entra ID提供优于共享访问签名(SAS)的安全性和易用性。 通过使用 Microsoft Entra ID,无需在代码中存储令牌,从而减少潜在的安全漏洞。 尽可能将 Microsoft Entra ID 与 Azure 服务总线应用程序配合使用。

本文介绍如何禁用 SAS 密钥身份验证(或本地身份验证),并仅使用Microsoft Entra ID进行身份验证。

为何禁用本地身份验证?

禁用本地(SAS 密钥)身份验证可以通过多种方式增强服务总线命名空间的安全性:

  • 消除静态凭据。 SAS 密钥是长期共享机密。 如果密钥泄漏,则拥有该密钥的任何人都可以访问命名空间,直到你手动轮换密钥。 Microsoft Entra ID 使用自动刷新的短期令牌。
  • 启用精细访问控制。 SAS 策略在命名空间或实体级别授予广泛的权限(发送、侦听、管理)。 Microsoft Entra 基于角色的访问控制(RBAC)允许向单个用户、组、服务主体或托管标识分配特定角色(Azure Service Bus Data SenderAzure Service Bus Data ReceiverAzure Service Bus Data Owner、)。
  • 提供审核线索。 Microsoft Entra 身份验证事件显示在 Microsoft Entra 登录日志中。 SAS 密钥使用情况不会生成可比的标识级审核记录。
  • 支持条件访问。 通过使用 Microsoft Entra ID,可以强制实施多重身份验证、受信任的设备要求和位置限制等策略 - 这些策略都无法使用 SAS 密钥。

小窍门

禁用本地身份验证之前,请更新所有应用程序,以使用 Microsoft Entra ID 进行身份验证。 请参阅本文后面的 迁移步骤 部分。

使用门户禁用本地身份验证

本部分介绍如何使用Azure门户禁用本地身份验证。

  1. Azure 门户中转到服务总线命名空间。

  2. “概述”页的“概要”部分中,选择“已启用本地身份验证”。

    ```xml 截图显示了启用了本地身份验证的 Service Bus 命名空间的“概述”页面。 ```

  3. 在“本地身份验证”页上,选择“禁用”,然后选择“确定”。

    屏幕截图显示在“本地身份验证”页上选择了“禁用”选项。

使用模板禁用本地身份验证

通过将disableLocalAuth属性设置为true,可以禁用服务总线命名空间的本地身份验证,如下模板所示。

@description('Name of the Service Bus namespace')
param namespaceName string

@description('Location for all resources.')
param location string = resourceGroup().location

resource serviceBusNamespace 'Microsoft.ServiceBus/namespaces@2024-01-01' = {
  name: namespaceName
  location: location
  sku: {
    name: 'Standard'
    tier: 'Standard'
  }
  properties: {
    disableLocalAuth: true
  }
}

使用 Azure CLI 或 PowerShell 禁用本地身份验证

还可以使用现有命名空间的命令行工具禁用本地身份验证。

az servicebus namespace update \
    --resource-group <resource-group-name> \
    --name <namespace-name> \
    --disable-local-auth true

若要重新启用本地身份验证,请执行以下操作:

az servicebus namespace update \
    --resource-group <resource-group-name> \
    --name <namespace-name> \
    --disable-local-auth false

可以通过检查 disableLocalAuth 属性来验证当前状态:

az servicebus namespace show \
    --resource-group <resource-group-name> \
    --name <namespace-name> \
    --query disableLocalAuth

使用 Azure Policy 强制实施

对于租户范围或订阅范围的应用,使用内置的 Azure Policy 服务总线命名空间应禁用本地身份验证方法 (策略 ID:cfb11c26-f069-4c14-8e36-56c394dae5af)。

此策略评估服务总线命名空间并标记已 disableLocalAuth 设置为 false 或未设置的任何命名空间。 可以在管理组、订阅或资源组级别分配它。

策略效果

分配策略时,请选择符合强制要求的效果:

Effect 行为
审核 (默认值) 已启用本地身份验证的现有命名空间在符合性仪表板中显示为 不合规 。 仍允许新命名空间。
拒绝 阻止创建或更新已启用本地身份验证的任何命名空间。 使用此效果以维护新资源的合规性。

分配策略

  1. Azure 门户中,转到 “策略>定义”。
  2. 搜索 服务总线命名空间应禁用本地身份验证方法
  3. 选择策略定义,然后选择“ 分配”。
  4. 选择范围(管理组、订阅或资源组)。
  5. 在“ 参数 ”选项卡上,选择所需的效果(审核拒绝)。
  6. 选择 “查看 + 创建”,然后选择 “创建”。

分配后,不符合的命名空间将显示在 策略>符合性中。 可以为需要更新的命名空间创建修正任务。

Azure 策略禁用位置身份验证的截图。

从 SAS 迁移到 Microsoft Entra ID

禁用本地身份验证之前,请更新连接到服务总线命名空间的所有应用程序,以使用 Microsoft Entra ID,而不是连接字符串或 SAS 令牌。 执行以下步骤:

步骤 1:分配 RBAC 角色

将适当的 Azure 服务总线数据角色分配给需要访问的每个标识(用户、服务主体或托管标识):

角色 许可
Azure Service Bus Data Sender 将消息发送到队列和主题
Azure Service Bus Data Receiver 从队列和订阅接收消息
Azure Service Bus Data Owner 完全访问权限(发送、接收、管理实体)

可以通过 Azure 门户、Azure CLI 或 Azure PowerShell 分配角色。 有关详细说明,请参阅使用 Azure 门户分配 Azure 角色

步骤 2:更新应用程序代码

将基于连接字符串的身份验证替换为来自 Azure 标识库的 DefaultAzureCredential(或其他 Microsoft Entra 凭据)。 以下示例显示了每种语言的更改:

// Before (connection string):
await using ServiceBusClient client = new("<connection-string>");

// After (Microsoft Entra ID):
await using ServiceBusClient client = new(
    "<your-namespace>.servicebus.chinacloudapi.cn",
    new DefaultAzureCredential());

有关每个 SDK 的更多详细信息,请参阅:

步骤 3:启用这两种身份验证方法进行测试

在本地身份验证仍处于启用状态时部署更新的应用程序。 验证:

  • 已成功发送和接收消息。
  • 应用程序日志显示 Microsoft Entra 令牌获取过程(而不是 SAS)。
  • 不会显示与身份验证相关的错误。

步骤 4:禁用本地身份验证

确认所有应用程序都使用 Microsoft Entra ID 后,请使用本文前面所述的任何方法(门户、CLI、PowerShell 或模板)禁用本地身份验证。

步骤 5:清理 SAS 策略(可选)

禁用本地身份验证后,命名空间上的现有 SAS 策略将保持不变,但不能用于生成功能令牌。 你可以将其保留到位,也可以将其删除,以便进行更简洁的配置。 如果有人意外重新启用本地身份验证,则删除未使用的策略会减少攻击面。

若要了解Microsoft Entra ID 和 SAS 身份验证,请参阅以下文章: