对 Azure Synapse Analytics 使用虚拟网络服务终结点和规则

适用于:Azure Synapse Analytics 专用 SQL 池

虚拟网络规则是一种防火墙安全功能,用于控制逻辑服务器是否接受来自虚拟网络中特定子网的、发往Azure Synapse Analytics 中的专用 SQL 池(前称 SQL DW)数据库的通信。 本文解释了为什么虚拟网络规则有时是安全允许与专用SQL池通信的最佳选择。

要创建虚拟网络规则,首先必须有一个 虚拟网络服务端点 供规则引用。

创建虚拟网络规则

如果你只想创建虚拟网络规则,可以直接跳到 本文后面的步骤和说明。

关于虚拟网络规则的详细信息

本节介绍了关于虚拟网络规则的若干细节。

仅有一个地理区域

每个虚拟网络服务端点只适用于一个 Azure 区域。 终结点不允许其他区域接受来自子网的通信。

任何虚拟网络规则都限制在其基础终结点所适用的区域内。

服务器级,不是数据库级

每个虚拟网络规则都适用于整个服务器,而不仅仅是服务器上的某个特定数据库。 换句话说,虚拟网络规则适用于服务器层面,而非数据库层面。

安全管理角色

虚拟网络服务端点的管理中存在安全角色的分离。 以下各角色都需采取行动:

  • 网络管理员(网络参与者角色): 打开端点。
  • 数据库管理员(SQL Server 贡献者角色):更新访问控制列表 (ACL),将给定的子网添加到服务器。

Azure RBAC 替代方案

网络管理员和数据库管理员角色具有比管理虚拟网络规则所需更多的权限。 只需其部分功能即可。

你可以选择在 Azure 中使用基于角色的访问控制(RBAC),创建一个只具备必要子集功能的自定义角色。 自定义角色可以替代网络管理员或数据库管理员。如果你把用户添加到自定义角色,你的安全风险敞口会比把该用户添加到另外两个主要管理员角色要小得多。

Note

在某些情况下,专用的SQL池和虚拟网络子网属于不同的订阅。 在这些情况下,必须确保以下配置:

  • 用户拥有发起操作的权限,例如启用服务端点和向指定服务器添加虚拟网络子网。
  • 两个订阅都必须已注册 Microsoft.Sql 提供程序。

Limitations

对于独立专用 SQL 池,虚拟网络规则功能存在以下限制:

  • 在你的逻辑服务器防火墙中,每个虚拟网络规则都会引用一个子网。 所有被引用的子网必须托管在与专用 SQL 池相同的地理区域内。
  • 每台服务器对任意虚拟网络最多可有128个ACL条目。
  • 虚拟网络规则仅适用于 Azure 资源管理器 虚拟网络,不适用于经典部署模型网络。
  • 在防火墙上,IP地址范围适用于以下网络项目,但虚拟网络规则不适用:
  • 两个订阅必须属于同一个 Microsoft Entra 租户。

使用服务端点时的注意事项

当你为专用 SQL 池使用服务端点时,请考虑以下事项:

  • 需要能够出站访问 Azure Synapse Analytics 的公共 IP。 网络安全组(NSG)必须允许与服务IP的连接。 你可以使用 Sql NSG 服务标签。

ExpressRoute

如果你从本地网络使用 ExpressRoute,无论是公共对等互连还是 Microsoft 对等互连,你需要识别所使用的 NAT IP 地址。 对于公共对等互连,每个 ExpressRoute 线路默认使用两个 NAT IP 地址,当流量进入 Microsoft Azure 网络骨干网时,这些地址会应用于 Azure 服务流量。 对于Microsoft对等连接,使用的NAT IP地址由客户或服务提供商提供。 若要允许访问服务资源,必须在资源 IP 防火墙设置中允许这些公共 IP 地址。 要查找你的公共对等 ExpressRoute 电路 IP 地址,可以通过 Azure 门户向 ExpressRoute 开启支持工单。 想了解更多关于 ExpressRoute 公有对等和 Microsoft 对等的 NAT 信息,请参见 Azure 公有对等的 NAT 要求。

为了允许你的线路与 Azure Synapse Analytics 通信,你必须为 NAT 的公共 IP 地址创建 IP 网络规则。

使用虚拟网络服务端点配合 Azure 存储 的影响

Azure 存储已实现相同的功能,允许限制到 Azure 存储帐户的连接。 如果你用Azure Synapse Analytics使用的Azure 存储账户使用这个功能,可能会遇到问题。

以下章节将讨论受影响的 Azure Synapse Analytics 功能。

Azure Synapse Analytics PolyBase 和 COPY 语句

PolyBase 和 COPY 语句常用于从 Azure 存储 账户加载数据到 Azure Synapse Analytics,实现高吞吐量数据摄取。 如果你要从中加载数据的 Azure 存储 账户仅允许一组虚拟网络子网访问该账户,那么当你使用 PolyBase 和 COPY 语句访问该存储账户时,连接将会中断。 要通过使用 COPY 和 PolyBase,配合 Azure Synapse Analytics 连接到受虚拟网络保护的 Azure 存储 来实现导入和导出场景,请遵循本节中的步骤。

Prerequisites

  • 安装Azure PowerShell。 有关详细信息,请查看安装 Azure Az PowerShell 模块。
  • 如果你有通用 v1 或 Azure Blob 存储 账户,必须先按照“升级到通用 v2 存储账户”中的步骤升级到通用 v2。
  • 您必须在 Azure 存储 账户的防火墙和虚拟网络设置菜单中开启允许受信任的 Microsoft 服务访问此存储账户。 启用此配置将允许PolyBase和COPY语句通过强认证连接到存储账户,而网络流量仍留在Azure骨干网上。 更多信息请参见 本指南。

Important

PowerShell Azure 资源管理器(AzureRM)模块已于 2024 年 2 月 29 日弃用。 所有未来的开发都应使用 Az.Sql 模块。 建议用户从 AzureRM 迁移到 Az PowerShell 模块,以确保持续支持和更新。 不再维护或支持 AzureRM 模块。 Az PowerShell 模块和 AzureRM 模块中命令的参数基本相同。 有关兼容性的详细信息,请参阅 新的 Az PowerShell 模块简介。

步骤

  1. 如果你有一个独立的专用 SQL 池(以前称为 SQL DW),请使用 PowerShell 将 SQL 服务器注册到 Microsoft Entra ID:

    Connect-AzAccount -Environment AzureChinaCloud
    Select-AzSubscription -SubscriptionId <subscriptionId>
    Set-AzSqlServer -ResourceGroupName your-database-server-resourceGroup -ServerName your-SQL-servername -AssignIdentity
    

    对于 Azure Synapse Analytics 工作空间内的专用 SQL 池,这一步并非必需。 工作区的系统分配的托管标识 (SA-MI) 是 Synapse 管理员角色的成员,因此对工作区的专用 SQL 池具有提升的特权。

  2. 按照创建存储帐户中的步骤创建通用 v2 存储帐户。

  3. 在你的存储账户页面,选择访问控制(IAM)。

  4. 选择“添加”>“添加角色分配”以打开“添加角色分配”页面。

  5. 分配以下角色。 有关详细步骤,请参阅在 Azure 门户中分配 Azure 角色。

    设置 Value
    Role Storage Blob 数据贡献者
    将访问权限分配到 用户、组或服务主体
    Members 已向 Microsoft Entra ID 注册的托管专用 SQL 池的服务器或工作区

    显示 Azure 门户中“添加角色分配”页面的屏幕截图。

    Note

    只有拥有存储账户所有者权限的成员才能执行此步骤。 关于各种 Azure 内置角色,请参见 Azure 内置角色。

  6. 要启用 PolyBase 与 Azure 存储 账户的连接:

    1. 如果之前尚未创建,请创建数据库主密钥。

      CREATE MASTER KEY [ENCRYPTION BY PASSWORD = '<password>'];
      
    2. 创建一个数据库范围的凭证, IDENTITY = 'Managed Service Identity'。

      CREATE DATABASE SCOPED CREDENTIAL msi_cred WITH IDENTITY = 'Managed Service Identity';
      
      • 不需要用 Azure 存储 访问密钥指定 SECRET,因为此机制在后台使用 Managed Identity。 对于 Azure Synapse Analytics 工作空间内的专用 SQL 池,这一步并非必需。 工作区的系统分配的托管标识 (SA-MI) 是 Synapse 管理员角色的成员,因此对工作区的专用 SQL 池具有提升的特权。

      • IDENTITY 名称必须为 “Managed Service Identity”,以使 PolyBase 能够与受虚拟网络保护的 Azure 存储 帐户正常连接。

    3. 创建一个外部数据源,使用 abfss:// 方案通过 PolyBase 连接到你的通用 v2 存储账户。

      CREATE EXTERNAL DATA SOURCE ext_datasource_with_abfss WITH (TYPE = hadoop, LOCATION = 'abfss://myfile@mystorageaccount.dfs.core.chinacloudapi.cn', CREDENTIAL = msi_cred);
      
      • 如果你已经有与通用 v1 或 Blob 存储 账户关联的外部表,应该先删除这些外部表。 然后删除对应的外部数据源。 接下来,创建一个方案为 abfss:// 的外部数据源,连接到一个通用的 v2 存储账户,如之前所示。 然后用这个新的外部数据源重新创建所有外部表。 你可以使用“生成和发布脚本向导”来为所有外部表生成创建脚本,方便使用。
      • 有关该abfss://URI 方案的更多信息,请参见使用 Azure Data Lake Storage Gen2 URI。
      • 有关 T-SQL 命令的更多信息,请参见 创建外部数据源。
    4. 通过使用 外部表正常查询。

Azure Synapse Analytics 审计到 Blob 存储

Azure Synapse Analytics 审计可以为你自己的存储账户写入 SQL 审计日志。 如果这个存储账户使用了虚拟网络服务端点功能,请查看如何将审核日志写入位于 VNet 和防火墙后面的存储账户。

在你的专用 SQL 池 SQL 服务器上添加一个虚拟网络防火墙规则

很久以前,在此功能增强之前,你必须先开启虚拟网络服务端点,才能在防火墙中实施已启用的虚拟网络规则。 端点将给定的虚拟网络子网关联到专用的SQL池。 截至2018年1月,您可以通过设置 IgnoreMissingVNetServiceEndpoint 标志来绕过此要求。 现在,你可以在不开启虚拟网络服务端点的情况下,给服务器添加虚拟网络防火墙规则。

仅仅设置防火墙规则并不能帮助保护服务器安全。 你还必须开启虚拟网络服务端点,以确保安全措施生效。 当你开启服务端点时,你的虚拟网络子网会经历停机,直到完成从关闭到开启的转换。 这段停机期在大型虚拟网络中尤为明显。 你可以使用 IgnoreMissingVNetServiceEndpoint 标志来减少或消除过渡期间的停机时间。

你可以使用 PowerShell 设置 IgnoreMissingVNetServiceEndpoint 标志。 更多信息请参见 New-AzSqlServerVirtualNetworkRule。

使用 Azure 门户创建虚拟网络规则

Note

这些虚拟网络规则指令适用于独立专用的SQL池。 关于工作空间网络配置,请参见 Azure Synapse Analytics IP 防火墙规则。

在本节中,学习如何使用 Azure 门户创建独立专用 SQL 池的虚拟网络规则。 该规则告诉逻辑服务器接受来自被标记为 虚拟网络服务端点的特定子网的通信。

Note

如果你打算在服务器的虚拟网络防火墙规则中添加服务端点,首先确保该子网的服务端点已开启。

如果子网没有开启服务端点,门户会要求你启用它们。 在添加规则的同一个面板上选择“启用”按钮。

Prerequisites

你必须已经有一个子网,标记了 Azure Synapse Analytics 所使用的虚拟网络服务端点 类型名称。

Azure 门户操作步骤

  1. 登录到 Azure 门户。

  2. 搜索并选择 SQL服务器,然后选择你的服务器。 在“安全性”下,选择“网络”。

  3. 在 “公共访问 ”标签下,确保 公共网络访问 设置为 “选择网络”,否则 虚拟网络 设置将被隐藏。 在虚拟网络部分选择 + 添加现有虚拟网络。

  4. 在新的创建/更新面板中,在框中填写你的 Azure 资源名称。

    Tip

    您必须为子网添加正确的地址前缀。 你可以在门户网站上找到 地址前缀 值。 访问 所有资源>所有类型的>虚拟网络。 过滤器会显示你的虚拟网络。 选择你的虚拟网络,然后选择 子网。 地址范围列包含你需要的地址前缀。

  5. 请查看防 火墙 面板上的虚拟网络规则。

  6. 将允许 Azure 服务和资源访问此服务器设置为“否”。

    Important

    如果你保留“允许 Azure 服务和资源访问此服务器”处于选中状态,你的服务器将接受来自 Azure 边界内任意子网的通信。 也就是说,这些通信来自被识别为属于为 Azure 数据中心定义的范围内的 IP 地址之一。 从安全角度看,保持控制开启可能会导致权限过大。 Azure 虚拟网络 服务终结点功能以及 Azure Synapse Analytics 虚拟网络规则可以减少安全外围。

  7. 选择面板底部附近的 确定 按钮。

Note

以下状态或情形适用于规则:

  • 就绪:表示您启动的操作已成功。
  • 失败:表示你启动的操作失败。
  • 删除:仅适用于 Delete 操作,表示该规则已被删除且不再适用。
  • 进行中:表示操作正在进行中。 旧规则在操作处于此状态时适用。

使用 PowerShell 创建虚拟网络规则

脚本也可以通过使用 PowerShell cmdlet New-AzSqlServerVirtualNetworkRule 或 az network vnet create 来创建虚拟网络规则。 更多信息请参见 New-AzSqlServerVirtualNetworkRule。

使用 REST API 创建虚拟网络规则

在内部,Synapse SQL 虚拟网络操作的 PowerShell cmdlet 调用了 REST API。 你可以直接调用REST API。 更多信息请参见 虚拟网络规则:操作。

排查错误 40914 和 40615

连接错误 40914 与虚拟网络规则有关,如 Azure 门户中防火墙窗格所示。
错误40615类似,但它与防火墙上的 IP地址规则 有关。

错误40914

消息文本:“无法打开登录所请求的服务器 '[server-name]'。” 不允许客户端访问服务器。”

错误描述: 客户端位于一个包含虚拟网络服务器端点的子网中。 但服务器没有虚拟网络规则赋予子网与数据库通信的权利。

错误解决:在 Azure 门户的防火墙面板上,使用虚拟网络规则控制为子网添加虚拟网络规则。

错误 40615

消息文本: “无法打开登录所请求的服务器‘{0}’。” 不允许 IP 地址为 ‘{1}’ 的客户端访问此服务器。”

错误描述: 客户端正尝试从一个未获授权连接到该服务器的 IP 地址进行连接。 服务器防火墙没有允许客户端从指定IP地址与数据库通信的IP地址规则。

错误解决: 输入客户端的IP地址作为IP规则。 在 Azure 门户中使用防火墙面板来完成这一步。