允许从特定虚拟网络访问 Azure 服务总线命名空间

通过将服务总线与虚拟网络 (VNet) 服务终结点集成可从绑定到虚拟网络的工作负荷(如虚拟机)安全地访问消息传递功能,同时在两端保护网络流量路径。

配置为绑定到至少一个虚拟网络子网服务终结点后,相应的服务总线命名空间将不再接受授权虚拟网络以及特定 Internet IP 地址(可选)以外的任何位置的流量。 从虚拟网络的角度来看,通过将服务总线命名空间绑定到服务终结点,可配置从虚拟网络子网到消息传递服务的独立网络隧道。

然后,绑定到子网的工作负荷与相应的服务总线命名空间之间将存在专用和独立的关系,消息传递服务终结点的可观察网络地址位于公共 IP 范围内对此没有影响。

要点

  • 虚拟网络仅在高级层服务总线命名空间中受支持。 将 VNet 服务终结点用于服务总线时,不应在混合使用标准层和高级层服务总线命名空间的应用程序中启用这些终结点。 原因是标准层不支持 VNet。 此终结点仅限于高级层命名空间。

  • 实现虚拟网络集成可以防止其他 Azure 服务与服务总线交互。 例外情况是,即使启用了网络服务终结点,也可以允许从某些“受信任的服务”访问 Azure 服务总线资源。 有关受信任服务的列表,请参阅受信任服务

    以下 Azure 服务必须在虚拟网络中

    • Azure 应用服务
    • Azure Functions
  • 为命名空间指定至少一个 IP 规则或虚拟网络规则,以便仅允许来自虚拟网络的指定 IP 地址或子网的流量。 如果没有 IP 和虚拟网络规则,则可以通过公共 Internet(使用访问密钥)访问命名空间。

通过 VNet 集成启用的高级安全方案

对于需要严格和隔离安全性的解决方案和虚拟网络子网在其中的隔离服务之间提供分段的解决方案,它们通常仍然需要驻留在这些隔离舱中的服务之间的通信路径。

隔离舱之间的任何即时 IP 路由(包括通过 TCP/IP 承载 HTTPS 的)都存在利用网络层漏洞的风险。 消息传递服务提供完全隔离的通信路径,其中消息在各方之间转换时会以平均方式写入磁盘。 绑定到同一个服务总线实例的两个不同虚拟网络中的工作负荷可通过消息进行高效和可靠的通信,同时保留各自的网络隔离边界完整性。

这意味着安全敏感云解决方案不仅可以访问 Azure 行业领先的可靠且可扩展的异步消息传递功能,而且现在可以使用消息传递在安全解决方案隔离舱之间创建通信路径,这些隔离舱本质上比利用任何对等通信模式(包括 HTTPS 和其他 TLS 安全套接字协议)更加安全。

将服务总线绑定到虚拟网络

虚拟网络规则是一种防火墙安全功能,用于控制是否允许 Azure 服务总线服务器接受来自特定虚拟网络子网的连接。

将服务总线命名空间绑定到虚拟网络的过程分为两步。 首先需要在虚拟网络子网上创建“虚拟网络服务终结点”,并按照服务终结点概述中的说明为“Microsoft.ServiceBus”启用该终结点 。 添加服务终结点后,使用虚拟网络规则将服务总线命名空间绑定到该终结点。

虚拟网络规则是服务总线命名空间与虚拟网络子网的关联。 存在此规则时,绑定到子网的所有工作负荷都有权访问服务总线命名空间。 服务总线本身永远不会建立出站连接,不需要获得访问权限,因此永远不会通过启用此规则来授予对子网的访问权限。

注意

请记住,网络服务终结点为在虚拟网络中运行的应用程序提供对服务总线命名空间的访问权限。 虚拟网络控制终结点的可访问性,但不能控制对服务总线实体(队列、主题或订阅)可以执行的操作。 使用 Microsoft Entra ID 授权应用程序可以在命名空间及其实体上执行的操作。 若要详细了解,请参阅使用 Microsoft Entra ID 对应用程序进行身份验证和授权,使之能够访问服务总线实体

使用 Azure 门户

创建命名空间时,可以仅允许对该命名空间进行公共访问(从所有网络进行访问),也可以仅允许对命名空间进行专用访问(仅通过专用终结点进行访问)。 创建命名空间后,可以允许从特定 IP 地址或特定虚拟网络进行的访问(使用网络服务终结点)。

创建命名空间时配置公共访问

若要启用公共访问,请在命名空间创建向导的“网络”页上选择“公共访问”。

Screenshot showing the Networking page of the Create namespace wizard with Public access option selected.

创建命名空间后,在“服务总线命名空间”页的左侧菜单中选择“网络”。 你会看到“所有网络”选项处于选中状态。 可以选择“所选网络”选项,允许来自特定 IP 地址或特定虚拟网络的访问。 下一部分详细说明了如何指定允许从其进行访问的网络。

为现有命名空间配置所选网络

本部分演示如何使用 Azure 门户添加虚拟网络服务终结点。 若要限制访问,需要集成此事件中心命名空间的虚拟网络服务终结点。

  1. Azure 门户中,导航到“服务总线命名空间”。

  2. 在左侧菜单上,选择“设置”下的“网络”选项 。

    注意

    只会为“高级”命名空间显示“网络”选项卡 。

  3. 在“网络”页上,对于“公共访问”,可以设置以下三个选项之一。 选择“选定网络”选项将只允许从指定 IP 地址进行访问。

    • “禁用”。 此选项禁用对命名空间的任何公共访问。 只能通过专用终结点访问命名空间。

      Screenshot that shows the Networking page of a namespace with public access disabled.

      选择是否想要允许受信任的 Azure 服务绕过此防火墙。 有关 Azure 服务总线的受信任 Azure 服务列表,请参阅受信任的 Azure 服务部分。

    • 选定网络。 此选项允许使用选定网络的访问密钥对命名空间进行公共访问。

      重要

      如果选择“选定网络”,请添加至少一个 IP 防火墙规则或有权访问命名空间的虚拟网络。 如果希望仅通过专用终结点限制流向此命名空间的所有流量,请选择“禁用”。

    • 所有网络(默认)。 此选项允许使用访问密钥从所有网络进行公共访问。 如果选择“所有网络”选项,则服务总线会接受来自任何 IP 地址的连接(使用访问密钥)。 此设置等效于一个接受 0.0.0.0/0 IP 地址范围的规则。

  4. 若要限制对特定虚拟网络的访问,请选择“选定网络”选项(如果尚未选择)。

  5. 在页面的“虚拟网络”部分,选择“+添加现有虚拟网络” 。 如果要创建新的 VNet,请选择“+ 创建新虚拟网络”。

    Image showing the selection of Add existing virtual network button on the toolbar.

    警告

    如果你在此页上选择了“所选网络”选项并且未添加至少一个 IP 防火墙规则或虚拟网络,则可以通过公共 Internet(使用访问密钥)访问该命名空间。

  6. 从虚拟网络列表中选择虚拟网络,然后选择“子网”。 将虚拟网络添加到列表之前,必须启用服务终结点。 如果未启用服务终结点,门户将提示你启用它。

    Image showing the selection of VNet and subnet.

  7. 为 Microsoft.ServiceBus 启用子网的服务终结点后,应显示指示启用成功的以下消息。 选择页面底部的“添加”,添加网络。

    Image showing the success message of enabling the service endpoint.

    注意

    如果无法使用资源管理器模板启用服务终结点,可以忽略有关缺少虚拟网络服务终结点的消息。 此功能在门户中不可用。

  8. 在工具栏上选择“保存”,保存这些设置。 等待几分钟,直到门户通知中显示确认消息。 应禁用“保存”按钮。

    Image showing the network service endpoint saved.

    注意

    有关允许从特定 IP 地址或范围访问的说明,请参阅允许从特定 IP 地址或范围访问

受信任的 Microsoft 服务

启用“允许受信任的 Microsoft 服务绕过此防火墙”设置时,将授权以下服务访问你的服务总线资源。

受信服务 支持的使用方案
Azure 事件网格 允许 Azure 事件网格将事件发送到服务总线命名空间中的队列或主题。 还需要执行以下步骤:
  • 为主题或域启用系统分配的标识
  • 为服务总线命名空间中的“Azure 服务总线数据发送方”角色添加标识
  • 然后,将使用服务总线队列或主题的事件订阅配置为终结点,以使用系统分配的标识。

有关详细信息,请参阅使用托管标识进行事件传递

Azure 流分析 允许 Azure 流分析作业将数据输出到服务总线队列主题

重要说明:流分析作业应配置为使用“托管标识”来访问服务总线命名空间。 为服务总线命名空间中的“Azure 服务总线数据发送方”角色添加标识。

Azure IoT 中心 允许 IoT 中心将消息发送到服务总线命名空间中的队列或主题。 还需要执行以下步骤:
Azure API 管理

API 管理服务允许你向服务总线命名空间中的服务总线队列/主题发送消息。

Azure Monitor(诊断设置和操作组) 允许 Azure Monitor 将诊断信息和警报通知发送到服务总线命名空间中的服务总线。 Azure Monitor 可以从 Azure 服务总线命名空间读取和向其写入数据。
Azure Synapse 允许 Azure Synapse 使用 Synapse 工作区托管标识连接到服务总线。 将 Azure 服务总线数据发送方、接收方或所有者角色添加到 Azure 服务总线命名空间的标识中。

可在下面找到适用于 Azure 服务总线的其他受信任服务:

  • Azure 数据资源管理器
  • Azure 运行状况数据服务
  • Azure Arc
  • Azure Kubernetes
  • Azure 机器学习
  • Azure Purview

使用 Resource Manager 模板

以下示例资源管理器模板会向现有服务总线命名空间添加虚拟网络规则。 对于网络规则,该模板指定虚拟网络中子网的 ID。

ID 是虚拟网络子网的完全限定资源管理器路径。 例如,/subscriptions/{id}/resourceGroups/{rg}/providers/Microsoft.Network/virtualNetworks/{vnet}/subnets/default 表示虚拟网络的默认子网。

备注

defaultAction 的默认值为 Allow。 添加虚拟网络或防火墙规则时,请确保将 defaultAction 的值设置为 Deny

模板:

{
	"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
	"contentVersion": "1.0.0.0",
	"parameters": {
		"servicebusNamespaceName": {
			"type": "string",
			"metadata": {
				"description": "Name of the Service Bus namespace"
			}
		},
		"virtualNetworkName": {
			"type": "string",
			"metadata": {
				"description": "Name of the Virtual Network Rule"
			}
		},
		"subnetName": {
			"type": "string",
			"metadata": {
				"description": "Name of the Virtual Network Sub Net"
			}
		},
		"location": {
			"type": "string",
			"metadata": {
				"description": "Location for Namespace"
			}
		}
	},
	"variables": {
		"namespaceNetworkRuleSetName": "[concat(parameters('servicebusNamespaceName'), concat('/', 'default'))]",
		"subNetId": "[resourceId('Microsoft.Network/virtualNetworks/subnets/', parameters('virtualNetworkName'), parameters('subnetName'))]"
	},
	"resources": [{
			"apiVersion": "2022-10-01-preview",
			"name": "[parameters('servicebusNamespaceName')]",
			"type": "Microsoft.ServiceBus/namespaces",
			"location": "[parameters('location')]",
			"sku": {
				"name": "Premium",
				"tier": "Premium",
				"capacity": 1
			},
			"properties": {
				"premiumMessagingPartitions": 1,
				"minimumTlsVersion": "1.2",
				"publicNetworkAccess": "Enabled",
				"disableLocalAuth": false,
				"zoneRedundant": true
			}
		},
		{
			"apiVersion": "2022-07-01",
			"name": "[parameters('virtualNetworkName')]",
			"location": "[parameters('location')]",
			"type": "Microsoft.Network/virtualNetworks",
			"properties": {
				"addressSpace": {
					"addressPrefixes": [
						"10.0.0.0/23"
					]
				},
				"subnets": [{
					"name": "[parameters('subnetName')]",
					"properties": {
						"addressPrefix": "10.0.0.0/23",
						"serviceEndpoints": [{
							"service": "Microsoft.ServiceBus"
						}]
					}
				}]
			}
		},
		{
			"apiVersion": "2022-10-01-preview",
			"name": "[variables('namespaceNetworkRuleSetName')]",
			"type": "Microsoft.ServiceBus/namespaces/networkruleset",
			"dependsOn": [
				"[concat('Microsoft.ServiceBus/namespaces/', parameters('servicebusNamespaceName'))]"
			],
			"properties": {
				"publicNetworkAccess": "Enabled",
				"defaultAction": "Deny",
				"virtualNetworkRules": [{
					"subnet": {
						"id": "[variables('subNetId')]"
					},
					"ignoreMissingVnetServiceEndpoint": false
				}],
				"ipRules": [],
				"trustedServiceAccessEnabled": false
			}
		}
	],
	"outputs": {}
}

若要部署模板,请按照 Azure 资源管理器的说明进行操作。

重要

如果没有 IP 和虚拟网络规则,则所有流量都将流向命名空间,即使你将 defaultAction 设置为 deny。 可以通过公共 Internet(使用访问密钥)访问命名空间。 为命名空间指定至少一个 IP 规则或虚拟网络规则,以便仅允许来自虚拟网络的指定 IP 地址或子网的流量。

使用 Azure CLI

使用 az servicebus namespace network-rule-set 添加、列出、更新和删除命令来管理服务总线命名空间的虚拟网络规则。

使用 Azure PowerShell

使用以下 Azure PowerShell 命令添加、列出、移除、更新和删除服务总线命名空间的网络规则。

默认操作和公用网络访问

REST API

API 为 2021-01-01-preview 版本及更早版本时,defaultAction 属性的默认值为 Deny。 但是,除非已设置 IP 筛选器或虚拟网络 (VNet) 规则,否则不会强制实施拒绝规则。 即,如果没有任何 IP 筛选器或 VNet 规则,系统会将该属性值视为 Allow

从 2021-06-01-preview 及之后的 API 版本开始,defaultAction 属性的默认值为 Allow,以准确反映服务端强制要求。 如果将默认操作设置为 Deny,则系统会强制执行 IP 筛选器和 VNet 规则。 如果将默认操作设置为 Allow,则系统不会强制执行 IP 筛选器和 VNet 规则。 关闭这些规则并重新打开后,服务会记住这些规则。

2021-06-01-preview 及之后的 API 版本还引入了一个名为 publicNetworkAccess 的新属性。 如果将其设置为 Disabled,则操作仅限于专用链接。 如果将其设置为 Enabled,则可通过公共 Internet 执行操作。

有关这些属性的详细信息,请参阅创建或更新网络规则集创建或更新专用终结点连接

注意

以上设置都不会绕过通过 SAS 或 Microsoft Entra 身份验证对声明进行的验证。 身份验证检查始终在服务验证由 defaultActionpublicNetworkAccessprivateEndpointConnections 设置配置的网络检查后运行。

Azure 门户

Azure 门户始终使用最新的 API 版本来获取和设置属性。 如果以前已使用 2021-01-01-preview 及更早版本配置了命名空间,并且将 defaultAction 设置为 Deny,并且指定了零 IP 筛选器和 VNet 规则,则 Azure 门户之前应已在命名空间的“网络”页上检查“所选网络”。 现在,Azure 门户将检查“所有网络”选项。

Screenshot of the Azure portal Networking page. The option to allow access from All networks is selected on the Firewalls and virtual networks tab.

后续步骤

有关虚拟网络的详细信息,请参阅以下链接: