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

适用于:Azure SQL 托管实例

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

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

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

注意

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

先决条件

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

限制访问

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

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

使用 SSMS 创建 Microsoft Entra 登录名

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

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

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

  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 登录名。
  • 默认情况下,在 master 中授予新建 Microsoft Entra 登录名的标准权限为:CONNECT SQLVIEW ANY DATABASE
  • 可以将 sysadmin 服务器角色授予托管实例中的许多 Microsoft Entra 登录名。

将登录名添加到 sysadmin 服务器角色:

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

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

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

    ALTER SERVER ROLE sysadmin ADD MEMBER login_name
    GO
    

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

    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 登录名连接到托管实例。

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

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

    USE master
    GO
    CREATE LOGIN login_name FROM EXTERNAL PROVIDER
    GO
    

    此示例为 Microsoft Entra 用户 bob@aadsqlmi.net 创建登录名。该用户的 aadsqlmi.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 语法在托管实例中创建数据库。 在下一部分,此数据库将用于测试用户登录名。

    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. 为了进行测试,请使用新建的登录名或组登录到托管实例。 与托管实例建立新的连接,并在身份验证时使用新登录名。

  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 的数据库以及一个只有默认权限的登录名后,下一步是基于该登录名创建用户。 目前,该登录名可以连接到托管实例和查看所有数据库,但无法与数据库交互。 如果使用具有默认权限的 Microsoft Entra 帐户登录,并尝试展开新建的数据库,将会看到以下错误:

来自 S S M S 对象资源管理器的错误消息的屏幕截图,该消息显示“数据库 MyMITestDB 不可访问。(对象资源管理器)”。

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

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

注意

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

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

  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 帐户登录到托管实例。

  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 和组 mygroup 提供对 MyMITestDB 数据库的 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 角色的用户身份与托管实例建立新的连接。

  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 帐户登录到托管实例。

  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 服务器级别登录名才能针对 Microsoft Entra 主体执行以下操作:

  • EXECUTE AS USER
  • EXECUTE AS LOGIN

使用跨数据库查询

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

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

  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,并向 mygroup 授予对该数据库的 SELECT 权限:

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

    USE MyMITestDB
    SELECT * FROM MyMITestDB2..TestTable2
    GO
    

    应会看到 TestTable2 的表结果。

其他受支持方案

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

后续步骤

启用安全功能

请参阅 SQL 托管实例安全功能一文,全面了解保护数据库的各种方式。 此文介绍了以下安全功能:

SQL 托管实例功能

有关 SQL 托管实例功能的完整概述,请参阅: