允许通过专用终结点访问 Azure 事件中心命名空间

使用 Azure 专用链接服务,可以通过虚拟网络中的专用终结点访问 Azure 服务(例如 Azure 事件中心、Azure 存储和 Azure Cosmos DB)以及 Azure 托管的客户服务/合作伙伴服务。

专用终结点是一个网络接口,可以将你通过专用且安全的方式连接到 Azure 专用链接支持的服务。 专用终结点使用虚拟网络中的专用 IP 地址将服务有效地接入虚拟网络中。 发往服务的所有流量都可以通过专用终结点路由,因此不需要网关、NAT 设备、ExpressRoute 或 VPN 连接或公共 IP 地址。 虚拟网络与服务之间的流量将通过 Azure 主干网络,因此不会从公共 Internet 泄露。 可以连接到 Azure 资源的实例,从而获得最高级别的访问控制粒度。

有关详细信息,请参阅什么是 Azure 专用链接?

要点

  • 基本层不支持此功能。
  • 启用专用终结点可以防止其他 Azure 服务与事件中心交互。 被阻止的请求包括来自其他 Azure 服务、来自 Azure 门户、来自日志记录和指标服务等的请求。 例外情况是,可以允许从某些受信任的服务访问事件中心资源,即使启用了专用终结点也是如此。 有关受信任服务的列表,请参阅受信任服务
  • 为命名空间指定至少一个 IP 规则或虚拟网络规则,以便仅允许来自虚拟网络的指定 IP 地址或子网的流量。 如果没有 IP 和虚拟网络规则,则可以通过公共 Internet(使用访问密钥)访问命名空间。

使用 Azure 门户添加专用终结点

先决条件

若要将事件中心命名空间与 Azure 专用链接集成,需要以下实体或权限:

  • 事件中心命名空间。
  • 一个 Azure 虚拟网络。
  • 虚拟网络中的子网。 可以使用默认子网。
  • 对命名空间和虚拟网络拥有所有者或参与者权限。

专用终结点和虚拟网络必须位于同一区域。 使用门户选择专用终结点的区域时,只会自动筛选该区域中的虚拟网络。 命名空间可以位于不同的区域中。

专用终结点使用虚拟网络中的专用 IP 地址。

创建命名空间时配置专用访问

创建命名空间时,可以仅允许对该命名空间进行公共访问(从所有网络进行访问),也可以仅允许对命名空间进行专用访问(仅通过专用终结点进行访问)。

如果在命名空间创建向导的“网络”页上选择“专用访问”选项,则可以通过选择“+ 专用终结点”按钮在页面上添加专用终结点。 有关如何添加专用终结点的详细步骤,请参阅下一部分。

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

为现有命名空间配置专用访问

如果已有事件中心命名空间,可以执行以下步骤创建专用链接连接:

  1. 登录 Azure 门户

  2. 在搜索栏中键入“事件中心”。

  3. 从列表中选择要将专用终结点添加到的命名空间

  4. 在“网络”页上,对于“公用网络访问”,如果希望仅通过专用终结点访问命名空间,请选择“已禁用”。

  5. 如果要允许受信任的 Azure 服务绕过此防火墙,则对“允许受信任的 Azure 服务绕过此防火墙”选择“”。

    Screenshot of the Networking page with public network access as Disabled.

  6. 切换到“专用终结点连接”选项卡。

  7. 在页面顶部选择“+ 专用终结点”按钮。

    Networking page - Private endpoint connections tab - Add private endpoint link.

  8. 在“基本信息”页上执行以下步骤:

    1. 选择要在其中创建专用终结点的 Azure 订阅。

    2. 选择专用终结点资源的资源组。

    3. 输入专用终结点的名称。

    4. 为网络接口输入一个名称。

    5. 专用终结点选择“区域”。 专用终结点必须与虚拟网络位于同一区域,但可以与你要连接的专用链接资源位于不同的区域。

    6. 选择页面底部的“下一步: 资源 ”。

      Screenshot showing the Basics page of the Create private endpoint wizard.

  9. 在“资源”页上,查看设置,然后选择“下一步: 虚拟网络”。

    Screenshot showing the Resource page of the Create private endpoint wizard.

  10. 在“虚拟网络”页上,选择要在其中部署专用终结点的虚拟网络中的子网。

    1. 选择一个虚拟网络。 下拉列表中仅列出了当前所选订阅和位置中的虚拟网络。
    2. 在所选的虚拟网络中选择一个“子网”。
    3. 请注意,“专用终结点的网络策略”已禁用。 如果要启用它,请选择“编辑”,更新设置,然后选择“保存”。
    4. 对于专用 IP 配置,默认情况下会选中“动态分配 IP 地址”选项。 如果要分配静态 IP 地址,请选择“静态分配 IP 地址”*。
    5. 对于应用程序安全组,选择现有应用程序安全组或创建一个与专用终结点相关联的安全组。
    6. 在“专用 DNS 集成”部分为此专用链接选择“资源组”。
  11. 在“标记”页上,创建要与专用终结点资源关联的任何标记(名称和值)。 然后选择页面底部的“查看 + 创建”按钮。

  12. 在“查看 + 创建”页上查看所有设置,然后选择“创建”以创建专用终结点 。

    Create Private Endpoint - Review and Create page

  13. 确认你创建的专用终结点连接已显示在终结点列表中。 在此示例中,专用终结点会自动获得批准,因为你已连接到自己目录中的 Azure 资源,并且有足够的权限。

    Private endpoint created

受信任的 Azure 服务

启用“允许受信任的 Azure 服务绕过此防火墙”设置时,将授权同一租户内的以下服务访问你的事件中心资源。

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

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

Azure 流分析 允许 Azure 流分析作业在事件中心命名空间中从(输入)读取数据或将数据写入(输出)事件中心。

重要说明:流分析作业应配置为使用托管标识来访问事件中心。 有关详细信息,请参阅使用托管标识通过 Azure 流分析作业访问事件中心(预览版)

Azure IoT 中心 允许 IoT 中心将消息发送到事件中心命名空间中的事件中心。 还需要执行以下步骤:
  • 为 IoT 中心启用系统分配的标识
  • 将标识添加到事件中心命名空间上的 Azure 事件中心数据发送方角色。
  • 然后,将使用事件中心的 IoT 中心配置为自定义终结点,以使用基于标识的身份验证。
Azure API 管理

使用 API 管理服务可将事件发送到你的事件中心命名空间中的事件中心。

Azure Monitor(诊断设置和操作组) 允许 Azure Monitor 将诊断信息和警报通知发送到你的事件中心命名空间中的事件中心。 Azure Monitor 可以从事件中心读取数据,还可以将数据写入事件中心。
Azure Synapse 允许 Azure Synapse 使用 Synapse 工作区托管标识连接到事件中心。 为事件中心命名空间上的标识添加 Azure 事件中心数据发送方、接收方或所有者角色。
Azure 数据资源管理器 允许 Azure 数据资源管理器使用群集的托管标识从事件中心接收事件。 需要执行以下步骤:
  • 在 Azure 数据资源管理器上配置托管标识
  • 向事件中心上的标识授予 Azure 事件中心数据接收者角色。
 

可在下面找到适用于 Azure 事件中心的其他受信任服务:

  • Azure Arc
  • Azure Kubernetes
  • Azure 机器学习
  • Azure Purview

若要允许受信任的服务访问你的命名空间,请切换到“网络”页面上的“公共访问”选项卡,然后针对“是否允许受信任的 Azure 服务跳过此防火墙?”选择“是”。

使用 PowerShell 添加专用终结点

以下示例演示如何使用 Azure PowerShell 创建专用终结点连接。 此过程不会为你创建专用群集。 请遵循此文中的步骤创建专用的事件中心群集。

$rgName = "<RESOURCE GROUP NAME>"
$vnetlocation = "<VIRTUAL NETWORK LOCATION>"
$vnetName = "<VIRTUAL NETWORK NAME>"
$subnetName = "<SUBNET NAME>"
$namespaceLocation = "<NAMESPACE LOCATION>"
$namespaceName = "<NAMESPACE NAME>"
$peConnectionName = "<PRIVATE ENDPOINT CONNECTION NAME>"

# create resource group
New-AzResourceGroup -Name $rgName -Location $vnetLocation 

# create virtual network
$virtualNetwork = New-AzVirtualNetwork `
                    -ResourceGroupName $rgName `
                    -Location $vnetlocation `
                    -Name $vnetName `
                    -AddressPrefix 10.0.0.0/16

# create subnet with endpoint network policy disabled
$subnetConfig = Add-AzVirtualNetworkSubnetConfig `
                    -Name $subnetName `
                    -AddressPrefix 10.0.0.0/24 `
                    -PrivateEndpointNetworkPoliciesFlag "Disabled" `
                    -VirtualNetwork $virtualNetwork

# update virtual network
$virtualNetwork | Set-AzVirtualNetwork

# create an event hubs namespace in a dedicated cluster
$namespaceResource = New-AzResource -Location $namespaceLocation `
                                    -ResourceName $namespaceName `
                                    -ResourceGroupName $rgName `
                                    -Sku @{name = "Standard"; capacity = 1} `
                                    -Properties @{clusterArmId = "/subscriptions/<SUBSCRIPTION ID>/resourceGroups/<RESOURCE GROUP NAME>/providers/Microsoft.EventHub/clusters/<EVENT HUBS CLUSTER NAME>"} `
                                    -ResourceType "Microsoft.EventHub/namespaces" -ApiVersion "2018-01-01-preview"

# create private endpoint connection
$privateEndpointConnection = New-AzPrivateLinkServiceConnection `
                                -Name $peConnectionName `
                                -PrivateLinkServiceId $namespaceResource.ResourceId `
                                -GroupId "namespace"

# get subnet object that you'll use later
$virtualNetwork = Get-AzVirtualNetwork -ResourceGroupName  $rgName -Name $vnetName
$subnet = $virtualNetwork | Select -ExpandProperty subnets `
                                | Where-Object  {$_.Name -eq $subnetName}  

# create a private endpoint   
$privateEndpoint = New-AzPrivateEndpoint -ResourceGroupName $rgName  `
                                -Name $vnetName   `
                                -Location $vnetlocation `
                                -Subnet  $subnet   `
                                -PrivateLinkServiceConnection $privateEndpointConnection

(Get-AzResource -ResourceId $namespaceResource.ResourceId -ExpandProperties).Properties

配置专用 DNS 区域

为事件中心域创建专用 DNS 区域,并创建虚拟网络的关联链接:

$zone = New-AzPrivateDnsZone -ResourceGroupName $rgName `
                            -Name "privatelink.servicebus.chinacloudapi.cn" 

$link  = New-AzPrivateDnsVirtualNetworkLink -ResourceGroupName $rgName `
                                            -ZoneName "privatelink.servicebus.chinacloudapi.cn" `
                                            -Name "mylink" `
                                            -VirtualNetworkId $virtualNetwork.Id  

$networkInterface = Get-AzResource -ResourceId $privateEndpoint.NetworkInterfaces[0].Id -ApiVersion "2019-04-01" 

foreach ($ipconfig in $networkInterface.properties.ipConfigurations) { 
    foreach ($fqdn in $ipconfig.properties.privateLinkConnectionProperties.fqdns) { 
        Write-Host "$($ipconfig.properties.privateIPAddress) $($fqdn)"  
        $recordName = $fqdn.split('.',2)[0] 
        $dnsZone = $fqdn.split('.',2)[1] 
        New-AzPrivateDnsRecordSet -Name $recordName -RecordType A -ZoneName "privatelink.servicebus.chinacloudapi.cn"  `
                                -ResourceGroupName $rgName -Ttl 600 `
                                -PrivateDnsRecords (New-AzPrivateDnsRecordConfig -IPv4Address $ipconfig.properties.privateIPAddress)  
    } 
}

使用 Azure 门户管理专用终结点

创建专用终结点时,必须批准连接。 如果要为其创建专用终结点的资源位于你的目录中,在拥有足够权限的前提下,你可以批准连接请求。 如果要连接到另一个目录中的 Azure 资源,必须等待该资源的所有者批准你的连接请求。

有四种预配状态:

服务操作 服务使用者专用终结点状态 说明
挂起的 连接是手动创建的,正等待专用链接资源所有者批准。
审批 已批准 连接已自动或手动批准,随时可供使用。
拒绝 已拒绝 连接已被专用链接资源所有者拒绝。
删除 已断开连接 连接已被专用链接资源所有者删除,专用终结点仅供参考,应将其删除以清理资源。

批准、拒绝或删除专用终结点连接

  1. 登录到 Azure 门户。
  2. 在搜索栏中键入“事件中心”。
  3. 选择要管理的命名空间
  4. 选择“网络”选项卡。
  5. 根据要执行的操作(批准、拒绝或移除),转到下面的相应部分。

批准专用终结点连接

  1. 如果有任何挂起的连接,则会列出预配状态为“挂起”的连接。

  2. 选择要批准的专用终结点

  3. 选择“批准”按钮。

    Approve private endpoint

  4. 在“批准连接”页上添加注释(可选),然后选择“是”。 如果选择“否”,则不会执行任何操作。

  5. 应会看到,列表中专用终结点连接的状态已更改为“已批准”。

拒绝专用终结点连接

  1. 如果存在任何要拒绝的专用终结点连接(不管是挂起的请求还是现有的连接),请选择该连接并选择“拒绝”按钮。

    Reject private endpoint

  2. 在“拒绝连接”页上输入注释(可选),然后选择“是”。 如果选择“否”,则不会执行任何操作。

  3. 应会看到,列表中专用终结点连接的状态已更改为“已拒绝”。

删除专用终结点连接

  1. 若要删除某个专用终结点连接,请在列表中选择它,然后在工具栏上选择“删除”。
  2. 在“删除连接”页上,选择“是”以确认删除该专用终结点。 如果选择“否”,则不会执行任何操作。
  3. 应会看到,状态已更改为“已断开连接”。 然后,该终结点就会从列表中消失。

应验证专用终结点的虚拟网络中的资源是否可以通过专用 IP 地址连接到事件中心命名空间,以及它们是否具有正确的专用 DNS 区域集成。

首先,遵循在 Azure 门户中创建 Windows 虚拟机中的步骤创建一个虚拟机。

在“网络”选项卡中:

  1. 指定虚拟网络和子网 。 必须选择已将专用终结点部署到的虚拟网络。
  2. 指定一个公共 IP 资源。
  3. 对于“NIC 网络安全组”,请选择“无” 。
  4. 对于“负载均衡”,请选择“否”。

连接到 VM,打开命令行并运行以下命令:

nslookup <event-hubs-namespace-name>.servicebus.chinacloudapi.cn

应会看到如下所示的结果。

Non-authoritative answer:
Name:    <event-hubs-namespace-name>.privatelink.servicebus.chinacloudapi.cn
Address:  10.0.0.4 (private IP address associated with the private endpoint)
Aliases:  <event-hubs-namespace-name>.servicebus.chinacloudapi.cn

限制和设计注意事项

  • 有关定价信息,请参阅 Azure 专用链接定价
  • 此功能可在所有 Azure 公共区域中使用。
  • 每个事件中心命名空间的最大专用终结点数目:120。
  • 流量在应用程序层被阻止,而不是在 TCP 层被阻止。 因此,即使公共访问已禁用,也会看到针对公共终结点的 TCP 连接或 nslookup 操作成功。

有关详细信息,请参阅 Azure 专用链接服务:限制

后续步骤