如何为 Azure Synapse 工作区设置访问控制

本文介绍如何控制对 Azure Synapse 工作区的访问。 我们将结合使用 Azure 角色、Azure Synapse 角色和 SQL 权限来实现此目的。

在本指南中,你将设置一个工作区并配置基本的访问控制系统。 可以在多种类型的 Synapse 项目中使用此信息。 本指南还将介绍可用于根据需要实现更精细控制的高级选项。

使组织中的角色与安全组保持一致可以简化 Synapse 访问控制。 这样,只需添加和删除用户即可管理对安全组的访问。

在开始本演练之前,请阅读 Azure Synapse 访问控制概述以熟悉 Synapse Analytics 使用的访问控制机制。

访问控制机制

注意

本指南中的方法用于创建安全组。 将角色分配到这些安全组时,只需管理这些组中的成员身份即可控制对工作区的访问。

若要保护 Synapse 工作区,需要配置以下项:

  • 安全组,用于对具有相似访问要求的用户分组。
  • Azure 角色,用于控制谁可以创建和管理 SQL 池、Apache Spark 池和集成运行时,以及访问 ADLS Gen2 存储。
  • Synapse 角色,用于控制对已发布代码项目的访问,以及对 Apache Spark 计算资源和集成运行时的使用。
  • SQL 权限,用于控制对 SQL 池的管理和数据平面访问。

保护 Synapse 工作区的步骤

本文档使用标准名称来简化说明。 请将它们替换为你选择的名称。

设置 标准名称 说明
Synapse 工作区 workspace1 Azure Synapse 工作区的名称。
ADLSGEN2 帐户 storage1 用于工作区的 ADLS 帐户。
容器 container1 Storage1 中的容器,由工作区默认使用。
Microsoft Entra ID 租户 contoso Microsoft Entra ID 租户名称。
服务主体 SERVICEPRINCIPAL Microsoft Entra ID 租户中的服务主体

步骤 1:创建安全组

提示

建议使用精细选项来控制对工作区的访问,向开发人员授予对单个资源(而不是整个工作区)的访问权限。 详细了解 Synapse RBAC。

为工作区创建以下安全组:

  • workspace1_SynapseAdministrators,适用于需要完全控制工作区的用户。 至少在开始的时候将自己添加到此安全组。
  • workspace1_SynapseContributors,适用于需要开发、调试代码并将其发布到服务的开发人员。
  • workspace1_SynapseComputeOperators ,适用于需要管理和监视 Apache Spark 池和集成运行时的用户。
  • workspace1_SynapseCredentialUsers,适用于需要使用工作区 MSI(托管服务标识)凭据来调试和运行业务流程管道以及取消管道运行的用户。

你很快就需要在工作区范围内将 Synapse 角色分配给这些组。

另请创建以下安全组:

  • workspace1_SQLAdmins,在工作区的 SQL 池中需要 SQL Active Directory 管理员权限的用户的组。

workspace1_SQLAdmins 组,用于在创建的 SQL 池时配置 SQL 权限。

对于基本设置,这五个组足够了。 以后可以添加安全组来处理需要更专用化访问权限的用户,或者仅限访问单个资源。

注意

提示

单个 Synapse 用户可以使用 Azure 门户中的 Microsoft Entra ID 来查看其组成员身份。 这样,他们便可以确定为其授予了哪些角色。

步骤 2:准备 ADLS Gen2 存储帐户

Synapse 工作区将默认存储容器用于:

  • 存储 Spark 表的后备数据文件
  • Spark 作业的执行日志
  • 管理你选择安装的库

确定关于存储的以下信息:

  • 用于工作区的 ADLS Gen2 帐户。 本文档将它称为 storage1storage1 被视为工作区的“主”存储帐户。

  • storage1 中的容器,将由 Synapse 工作区默认使用。 本文档将它称为 container1

  • 选择“访问控制 (IAM)”。

  • 选择“添加”>“添加角色分配”,打开“添加角色分配”页面 。

  • 分配以下角色。 有关详细步骤,请参阅使用 Azure 门户分配 Azure 角色

    设置
    角色 存储 Blob 数据参与者
    将访问权限分配到 SERVICEPRINCIPAL
    成员 workspace1_SynapseAdministrators、workspace1_SynapseContributors 和 workspace1_SynapseComputeOperators

    Azure 门户中的“添加角色分配”页。

步骤 3:创建并配置 Synapse 工作区

在 Azure 门户中创建 Synapse 工作区:

  • 选择订阅

  • 选择或创建一个你对其拥有 Azure“所有者”角色的资源组。

  • 将工作区命名为 workspace1

  • 选择“storage1”作为“存储帐户”

  • 选择“container1”作为要用作“文件系统”的容器。

  • 在 Synapse Studio 中打开 workspace1

  • 在Synapse Studio 中,导航到“管理”>“访问控制”。 在“工作区范围”中,将 Synapse 角色分配到安全组,如下所示:

    • 将“Synapse 管理员”角色分配给 workspace1_SynapseAdministrators
    • 将“Synapse 参与者”角色分配给 workspace1_SynapseContributors
    • 将“Synapse 计算操作员”角色分配给 workspace1_SynapseComputeOperators

步骤 4:向工作区 MSI 授予对默认存储容器的访问权限

若要运行管道和执行系统任务,Azure Synapse 要求托管服务标识 (MSI) 有权访问默认 ADLS Gen2 帐户中工作区的 container1。 有关详细信息,请参阅 Azure Synapse 工作区托管标识

  • 打开 Azure 门户

  • 找到存储帐户 storage1,然后找到 container1

  • 选择“访问控制 (IAM)”。

  • 若要打开“添加角色分配”页,请选择“添加”>“添加角色分配”。

  • 分配以下角色。 有关详细步骤,请参阅使用 Azure 门户分配 Azure 角色

    设置
    角色 存储 Blob 数据参与者
    将访问权限分配到 MANAGEDIDENTITY
    成员 托管标识名称

    注意

    托管标识名称也是工作区名称。

    Azure 门户中的“添加角色分配”页。

步骤 5:向 Synapse 管理员授予工作区的 Azure 参与者角色

若要创建 SQL 池、Apache Spark 池和集成运行时,用户至少需要具有工作区的 Azure 参与者角色。 参与者角色还允许用户管理资源,包括执行暂停和缩放操作。 若要使用 Azure 门户或 Synapse Studio 来创建 SQL 池、Apache Spark 池和集成运行时,需要资源组级别的参与者角色。

  • 打开 Azure 门户

  • 找到工作区 workspace1

  • 选择“访问控制 (IAM)”。

  • 若要打开“添加角色分配”页,请选择“添加”>“添加角色分配”。

  • 分配以下角色。 有关详细步骤,请参阅使用 Azure 门户分配 Azure 角色

    设置
    角色 参与者(在“特权管理员角色”下列出)
    将访问权限分配到 SERVICEPRINCIPAL
    成员 workspace1_SynapseAdministrators

    Azure 门户中的“添加角色分配”页。

步骤 6:分配 SQL Active Directory 管理员角色

工作区创建者将自动分配为工作区的 SQL Active Directory 管理员。 只能为单个用户或组授予此角色。 在此步骤中,你将工作区的 SQL Active Directory 管理员分配到 workspace1_SQLAdmins 安全组。 这会向此组授予对工作区中的所有 SQL 池和数据库的高特权管理访问权限。

  • 打开 Azure 门户
  • 导航到 workspace1
  • 在“设置”下,选择“Microsoft Entra ID
  • 选择“设置管理员”,然后选择“workspace1_SQLAdmins

注意

步骤 6 是可选的。 你可以选择向 workspace1_SQLAdmins 组授予特权较低的角色。 若要分配 db_owner 或其他 SQL 角色,必须在每个 SQL 数据库上运行脚本。

步骤 7:授予对 SQL 池的访问权限

默认情况下,还会为 Synapse 管理员分配工作区中无服务器 SQL 池的 SQL db_owner 角色。

其他用户对 SQL 池的访问是通过 SQL 权限控制的。 分配 SQL 权限需要对创建后的每个 SQL 数据库运行 SQL 脚本。 对于以下示例情况需要运行这些脚本:

  1. 向其他用户授予对“Built-in”无服务器 SQL 池及其数据库的访问权限。

  2. 向任何用户授予对专用 SQL 池数据库的访问权限。 本文稍后将提供示例 SQL 脚本。

  3. 若要授予对专用 SQL 池数据库的访问权限,可以让工作区创建者或 workspace1_SynapseAdministrators 组的任何成员运行这些脚本。

  4. 若要授予对“Built-in”无服务器 SQL 池的访问权限,可以让 workspace1_SQLAdmins 组或 workspace1_SynapseAdministrators 组的任何成员运行这些脚本。

提示

可以通过对每个 SQL 池执行以下步骤来授予对所有 SQL 数据库的访问权限。 配置工作区范围的权限部分中所述的操作是例外,它允许为用户分配工作区级别的 sysadmin 角色。

步骤 7a:无服务器 SQL 池,内置

可以使用本部分提供的脚本示例向用户授予对 Built-in 无服务器 SQL 池中单个数据库或所有数据库的访问权限。

注意

在脚本示例中,请将 alias 替换为要向其授予访问权限的用户或组的别名。 将 domain 替换为你要使用的公司域。

配置数据库范围的权限

可以使用此示例中所述的步骤向用户授予对单个无服务器 SQL 数据库的访问权限:

  1. 创建一个登录名。 更改为 master 数据库上下文。

    --In the master database
    CREATE LOGIN [alias@domain.com] FROM EXTERNAL PROVIDER;
    
  2. 在你的数据库中创建用户。 将上下文更改为你的数据库。

    -- In your database
    CREATE USER alias FROM LOGIN [alias@domain.com];
    
  3. 将用户添加为数据库中指定角色的成员(在本例中为 db_owner 角色)。

    ALTER ROLE db_owner ADD member alias; -- Type USER name from step 2
    

配置工作区范围的权限

可以授予对工作区中所有无服务器 SQL 池的完全访问权限。 在 master 数据库中运行此示例中的脚本:

CREATE LOGIN [alias@domain.com] FROM EXTERNAL PROVIDER;
ALTER SERVER ROLE sysadmin ADD MEMBER [alias@domain.com];

步骤 7b:配置专用 SQL 池

可以授予对单个专用 SQL 池数据库的访问权限。 在 Azure Synapse SQL 脚本编辑器中使用以下步骤:

  1. 运行以下命令,在数据库中创建用户。 在“连接到”下拉列表中选择目标数据库:

    --Create user in the database
    CREATE USER [<alias@domain.com>] FROM EXTERNAL PROVIDER;
    -- For Service Principals you would need just the display name and @domain.com is not required
    
  2. 向用户授予有权访问数据库的角色:

    --Grant role to the user in the database
    EXEC sp_addrolemember 'db_owner', '<alias@domain.com>';
    

重要

如果你不想要授予 db_owner 权限,db_datareader 和 db_datawriter 数据库角色可以提供读/写权限。 但是,Spark 用户需要拥有 db_owner 权限才能直接从 Spark 在 SQL 池中进行读取和写入。

创建用户后,可以运行查询来确认无服务器 SQL 池是否可以查询存储帐户。

步骤 8:向安全组添加用户

访问控制系统的初始配置现已完成。

现在可以在设置的安全组中添加和删除用户,以管理其访问权限。 可以手动将用户分配到 Azure Synapse 角色,但这会以不一致的方式设置权限。 请仅在安全组中添加或删除用户。

步骤 9:网络安全

作为保护工作区的最后一步,应该使用工作区防火墙保护网络访问。

步骤 10:完成

你的工作区现在已完全配置并受到保护。

支持更高级的方案

本指南重点介绍了如何设置基本的访问控制系统。 你可以通过创建更多的安全组并在更具体的范围内为这些组分配更细化的角色,来支持更高级的方案。 请考虑以下情况:

限制开发人员对特定资源的访问权限。 为只需访问特定资源的开发人员创建其他更细化的安全组。 为这些组分配适当的、权利范围为特定 Azure Spark 池、集成运行时或凭据的 Synapse 角色。

限制操作员访问代码项目。 为需要监视 Synapse 计算资源的运行状态和查看日志但不需要访问代码或将更新发布到服务的操作员创建安全组。 将权力范围为特定 Spark 池和集成运行时的“计算操作员”角色分配给这些组。

禁用本地身份验证。 通过仅允许 Microsoft Entra 身份验证,可以集中管理对 Azure Synapse 资源(如 SQL 池)的访问。 可以在创建工作区期间或之后禁用对工作区中所有资源的本地身份验证。 有关仅 Microsoft Entra 的身份验证的详细信息,请参阅在 Azure Synapse Analytics 中禁用本地身份验证