教程:使用 Microsoft Entra 登录名进行保护 - Azure SQL 托管实例

适用于:Azure SQL 托管实例

在本文中,了解如何使用 Microsoft Entra ID(以前称为 Azure Active Directory)支持的服务器主体(登录名)来保护 Azure SQL 托管实例

本教程介绍如何执行下列操作:

  • 为 SQL 托管实例创建Microsoft Entra 登录名。
  • 授予对 SQL 托管实例中的登录名的权限。
  • 从登录名创建Microsoft Entra 用户。
  • 向用户分配权限并管理数据库安全性。
  • 对用户使用模拟。
  • 对用户使用跨数据库查询。
  • 了解安全功能,例如威胁防护、审核、数据掩码和加密。

注意

Microsoft Entra ID 以前称为 Azure Active Directory (Azure AD)。

先决条件

若要完成本教程,请确保具备以下先决条件:

限制访问

可以通过专用 IP 地址访问 SQL 托管实例。 与在隔离的 SQL Server 环境中非常类似,应用程序或用户需要访问 SQL 托管实例网络 (VNet) 才能建立连接。 有关详细信息,请参阅将应用程序连接到 SQL 托管实例

还可以在 SQL 托管实例上配置服务终结点,该终结点允许以与 Azure SQL 数据库相同的方式进行公共连接。 有关详细信息,请参阅在 Azure SQL 托管实例中配置公共终结点

使用 SSMS 创建 Microsoft Entra 登录名

SQL 管理员可以创建第一个Microsoft Entra 登录名,也可以创建预配期间创建的 Microsoft Entra 管理员。 有关详细信息,请参阅为 SQL 托管实例预配 Microsoft Entra 管理员

有关如何连接到 SQL 托管实例的示例,请参阅以下文章:

  1. 使用 sysadmin SQL 登录名或 Microsoft Entra 管理员( SSMS)连接到 SQL 托管实例。

  2. 在“对象资源管理器”中右键服务器,然后选择“新建查询”。

  3. 在查询窗口中,使用以下语法为本地 Microsoft Entra 帐户创建登录名:

    USE master
    GO
    CREATE LOGIN login_name FROM EXTERNAL PROVIDER
    GO
    

    此示例为帐户 nativeuser@aadsqlmi.partner.onmschina.cn 创建登录名。

    USE master
    GO
    CREATE LOGIN [nativeuser@aadsqlmi.partner.onmschina.cn] FROM EXTERNAL PROVIDER
    GO
    
  4. 在工具栏上,选择“执行”以创建登录名。

  5. 通过执行以下 T-SQL 命令来检查新添加的登录名:

    SELECT *
    FROM sys.server_principals;
    GO
    

    SSMS 对象资源管理器中“结果”选项卡的屏幕截图,其中显示了新添加的登录名的名称、principal_id、sid、类型和type_desc。

有关详细信息,请参阅 CREATE LOGIN

授予用于创建登录名的权限

现有登录名必须具有适当的权限或属于适当的服务器角色,才能创建其他 Microsoft Entra 登录名。

SQL 身份验证登录名

如果登录名是基于 SQL 身份验证的服务器主体,则必须为其分配 sysadmin 角色,以便为 Microsoft Entra 帐户创建登录名。

Microsoft Entra 身份验证登录名

  • 如果登录名是Microsoft Entra 服务器主体,则必须为其分配 sysadminsecurityadmin 服务器角色,以便为其他 Microsoft Entra 用户、组和应用程序创建登录名。
  • 至少 ALTER ANY LOGIN 必须授予权限才能创建其他Microsoft Entra 登录名。
  • 默认情况下,授予新创建的Microsoft Entra 登录 master 名的标准权限为 CONNECT SQLVIEW ANY DATABASE
  • 可以将 sysadmin 服务器角色授予 SQL 托管实例中的许多Microsoft Entra 登录名。

若要将登录名添加到 sysadmin 服务器角色,请执行以下作:

  1. 再次登录到 SQL 托管实例,或使用与作为 sysadmin 的 Microsoft Entra 管理员或 SQL 主体的现有连接。

  2. 在“对象资源管理器”中右键服务器,然后选择“新建查询”。

  3. 使用以下 T-SQL 语法授予 Microsoft Entra 登录 sysadmin 服务器角色:

    ALTER SERVER ROLE sysadmin ADD MEMBER login_name
    GO
    

    以下示例将 sysadmin 服务器角色授予登录 nativeuser@aadsqlmi.partner.onmschina.cn名:

     ALTER SERVER ROLE sysadmin ADD MEMBER [nativeuser@aadsqlmi.partner.onmschina.cn]
    GO
    

使用 SSMS 创建其他 Microsoft Entra 登录名

创建Microsoft Entra 登录名并授予 sysadmin 权限后,该登录名可以使用子句和FROM EXTERNAL PROVIDER子句创建其他登录CREATE LOGIN名。

  1. 通过选择“连接到 SQL Server Management Studio”(SSMS)中的“连接到服务器”,使用 Microsoft Entra 登录 名连接到 SQL 托管实例。

    1. 在“服务器名称”中输入 SQL 托管实例主机名。
    2. 对于 身份验证,请选择 Microsoft Entra MFA 以打开多重身份验证登录窗口。 登录。 有关详细信息,请参阅通用身份验证(SSMS 支持多重身份验证)
  2. 在“对象资源管理器”中右键服务器,然后选择“新建查询”。

  3. 在查询窗口中,使用以下语法为另一个 Microsoft Entra 帐户创建登录名:

    USE master
    GO
    CREATE LOGIN login_name FROM EXTERNAL PROVIDER
    GO
    

    本示例为Microsoft Entra 用户创建登录名,该用户的bob@aadsqlmi.netaadsqlmi.net与 Microsoft Entra aadsqlmi.partner.onmschina.cn

    执行以下 T-SQL 命令。 联合 Microsoft Entra 帐户是本地 Windows 登录名和用户的 SQL 托管实例替代品。

    USE master
    GO
    CREATE LOGIN [bob@aadsqlmi.net] FROM EXTERNAL PROVIDER
    GO
    
  4. 使用 CREATE DATABASE 语法在 SQL 托管实例中创建数据库。 在下一部分,此数据库将用于测试用户登录名。

    1. 在“对象资源管理器”中右键服务器,然后选择“新建查询”。

    2. 在查询窗口中,使用以下语法创建名为 MyMITestDB 的数据库。

      CREATE DATABASE MyMITestDB;
      GO
      
  5. 为 Microsoft Entra ID 中的组创建 SQL 托管实例登录名。 在将登录名添加到 SQL 托管实例之前,该组必须存在于 Microsoft Entra ID 中。 请参阅使用 Microsoft Entra ID 创建基本组并添加成员。 创建组 mygroup,并将成员添加到此组。

  6. 在 SQL Server Management Studio 中打开新的查询窗口。

    本示例假设 Microsoft Entra ID 中存在一个名为 mygroup 的组。 执行以下命令:

    USE master
    GO
    CREATE LOGIN [mygroup] FROM EXTERNAL PROVIDER
    GO
    
  7. 作为测试,使用新创建的登录名或组登录到 SQL 托管实例。 打开与 SQL 托管实例的新连接,并在进行身份验证时使用新登录名。

  8. 在“对象资源管理器”中右键服务器,然后选择新连接对应的“新建查询”。

  9. 执行以下命令,检查新建的 Microsoft Entra 登录名的服务器权限:

    SELECT * FROM sys.fn_my_permissions (NULL, 'DATABASE')
    GO
    

Azure SQL 对 Microsoft Entra 主体作为用户和登录名的支持扩展到 Microsoft Entra 外部 ID 内部和外部来宾用户。 来宾用户(无论是单独使用还是作为组的一部分)都可以像 Azure SQL 中的任何其他 Microsoft Entra 用户一样使用。 如果希望来宾用户能够创建其他 Microsoft Entra 服务器登录名或数据库用户,他们必须有权读取 Microsoft Entra 目录中的其他标识。 此权限在目录级别配置。 有关详细信息,请参阅 Microsoft Entra ID 中的来宾用户访问权限

从 Microsoft Entra 登录名创建 Microsoft Entra 用户

在 SQL 托管实例中,单个数据库的授权方式与 SQL Server 中数据库的授权方式大致相同。 可以从数据库中的现有登录名创建用户,该登录名授予该数据库或添加到数据库角色的权限。

创建名为 MyMITestDB 的数据库和仅具有默认权限的登录名后,下一步是从该登录名创建用户。 目前,登录名可以连接到 SQL 托管实例并查看所有数据库,但无法与数据库交互。 如果使用具有默认权限的 Microsoft Entra 帐户登录并尝试展开新创建的数据库,将看到以下错误:

SSMS 对象资源管理器中错误消息的屏幕截图,其中显示了“无法访问数据库 MyMITestDB”。(ObjectExplorer)“ 。

有关授予数据库权限的详细信息,请参阅数据库引擎权限入门

创建 Microsoft Entra 用户并创建示例表

注意

当用户作为 Microsoft Entra 组的一部分登录时,存在一些限制。 例如,调用 SUSER_SID 返回 NULL,因为给定的 Microsoft Entra 用户不是 sys.server_principals 表的一部分。 因此,在这种情况下,对某些存储过程或已授予权限列表的访问可能会受到限制。

  1. 使用 SQL Server Management Studio 中的 sysadmin 帐户登录到 SQL 托管实例。

  2. 在“对象资源管理器”中右键服务器,然后选择“新建查询”。

  3. 在查询窗口中,使用以下语法基于 Microsoft Entra 登录名创建用户:

    USE <Database Name> -- provide your database name
    GO
    CREATE USER user_name FROM LOGIN login_name
    GO
    

    以下示例基于登录名 bob@aadsqlmi.net 创建用户 bob@aadsqlmi.net

    USE MyMITestDB
    GO
    CREATE USER [bob@aadsqlmi.net] FROM LOGIN [bob@aadsqlmi.net]
    GO
    
  4. 还支持从作为组的 Microsoft Entra 登录名创建 Microsoft Entra 用户。

    以下示例为Microsoft Entra 租户中存在的 Microsoft Entra 组 mygroup 创建登录名:

    USE MyMITestDB
    GO
    CREATE USER [mygroup] FROM LOGIN [mygroup]
    GO
    

    属于 mygroup 的所有用户都可以访问 MyMITestDB 数据库。

    重要

    从 Microsoft Entra 登录名创建 USER 时,请指定user_name与来自 LOGIN的相同login_name。

    有关详细信息,请参阅 CREATE USER

  5. 在新查询窗口中,使用以下 T-SQL 命令创建测试表:

    USE MyMITestDB
    GO
    CREATE TABLE TestTable
    (
    AccountNum varchar(10),
    City varchar(255),
    Name varchar(255),
    State varchar(2)
    );
    
  6. 使用创建的用户在 SSMS 中创建连接。 你会注意到,你看不到之前由 sysadmin 创建的表 TestTable。 我们需要向该用户提供读取数据库中的数据的权限。

  7. 可以执行以下命令来检查用户当前拥有的权限:

    SELECT * FROM sys.fn_my_permissions('MyMITestDB','DATABASE')
    GO
    

将用户添加到数据库级角色

要使用户能够查看数据库中的数据,我们可以向该用户提供数据库级角色

  1. 使用 SQL Server Management Studio 使用 sysadmin 帐户登录到 SQL 托管实例。

  2. 在“对象资源管理器”中右键服务器,然后选择“新建查询”。

  3. 使用以下 T-SQL 语法授予 Microsoft Entra 用户 db_datareader 数据库角色:

    Use <Database Name> -- provide your database name
    ALTER ROLE db_datareader ADD MEMBER user_name
    GO
    

    以下示例为 bob@aadsqlmi.net 数据库的用户和提供db_datareader权限:

    USE MyMITestDB
    GO
    ALTER ROLE db_datareader ADD MEMBER [bob@aadsqlmi.net]
    GO
    ALTER ROLE db_datareader ADD MEMBER [mygroup]
    GO
    
  4. 执行以下命令检查数据库中创建的 Microsoft Entra 用户是否存在:

    SELECT * FROM sys.database_principals
    GO
    
  5. 使用已添加到 db_datareader 角色的用户创建与 SQL 托管实例的新连接。

  6. 在“对象资源管理器”中展开数据库,以查看表。

    SSMS 中对象资源管理器的屏幕截图,其中显示了 MyMITestDB 中表的文件夹结构。dbo。TestTable 文件夹突出显示。

  7. 打开新的查询窗口并执行以下 SELECT 语句:

    SELECT *
    FROM TestTable
    

    是否能够看到表中的数据? 应会看到返回的列,如以下屏幕截图所示:

    SSMS 对象资源管理器中“结果”选项卡的屏幕截图,其中显示了表列标题 AccountNum、City、Name 和 State。

模拟 Microsoft Entra 登录名

SQL 托管实例支持模拟 Microsoft Entra 登录名。

测试模拟

  1. 使用 SQL Server Management Studio 使用 sysadmin 帐户登录到 SQL 托管实例。

  2. 在“对象资源管理器”中右键服务器,然后选择“新建查询”。

  3. 在查询窗口中,使用以下命令创建新的存储过程:

    USE MyMITestDB
    GO
    CREATE PROCEDURE dbo.usp_Demo
    WITH EXECUTE AS 'bob@aadsqlmi.net'
    AS
    SELECT user_name();
    GO
    
  4. 使用以下命令来查看执行该存储过程时模拟的用户是否为 bob@aadsqlmi.net

    Exec dbo.usp_Demo
    
  5. 使用 EXECUTE AS LOGIN 语句测试模拟:

    EXECUTE AS LOGIN = 'bob@aadsqlmi.net'
    GO
    SELECT SUSER_SNAME()
    REVERT
    GO
    

注意

只有属于 sysadmin 角色的 SQL Server 级登录才能执行以下针对Microsoft Entra 主体的作:

  • EXECUTE AS USER
  • EXECUTE AS LOGIN

使用跨数据库查询

使用 Microsoft Entra 登录名的 Microsoft Entra 帐户支持跨数据库查询。 若要使用 Microsoft Entra 组测试跨数据库查询,需要创建另一个数据库和表。 如果已存在一个数据库和表,则无需额外创建。

  1. 使用 SQL Server Management Studio 使用 sysadmin 帐户登录到 SQL 托管实例。

  2. 在“对象资源管理器”中右键服务器,然后选择“新建查询”。

  3. 在查询窗口中,使用以下命令创建名为 MyMITestDB2 的数据库和名为 TestTable2 的表。

    CREATE DATABASE MyMITestDB2;
    GO
    USE MyMITestDB2
    GO
    CREATE TABLE TestTable2
    (
    EmpId varchar(10),
    FirstName varchar(255),
    LastName varchar(255),
    Status varchar(10)
    );
    
  4. 在新查询窗口中,执行以下命令,在新数据库 MyMITestDB2 中创建用户 mygroup,并向 SELECT 授予对该数据库的权限:

    USE MyMITestDB2
    GO
    CREATE USER [mygroup] FROM LOGIN [mygroup]
    GO
    GRANT SELECT TO [mygroup]
    GO
    
  5. 使用 SQL Server Management Studio 作为 mygroup Microsoft Entra 组的成员登录到 SQL 托管实例。 打开新的查询窗口并执行跨数据库 SELECT 语句:

    USE MyMITestDB
    SELECT * FROM MyMITestDB2..TestTable2
    GO
    

    应会看到 TestTable2 的表结果。

其他受支持方案

  • Microsoft Entra 登录名支持 SQL 代理管理和作业执行。
  • Microsoft Entra 登录名可以执行数据库备份和还原作。
  • 审核与 Microsoft Entra 登录名和身份验证事件相关的所有语句。
  • Microsoft Entra 登录名的专用管理员连接,这些登录名是 sysadmin 服务器角色的成员。
  • Microsoft Entra 登录名支持使用 sqlcmd 实用工具SQL Server Management Studio 工具。
  • 来自 Microsoft Entra 登录名的登录事件支持登录触发器。
  • 可以使用 Microsoft Entra 登录名设置 Service Broker 和数据库邮件。