你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
教程:使用 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)。
先决条件
若要完成本教程,请确保具备以下先决条件:
- SQL Server Management Studio (SSMS)
- 托管实例
- 遵循以下文章:快速入门:创建托管实例
- 能够访问托管实例,并为托管实例预配 Microsoft Entra 管理员。 若要了解更多信息,请参阅以下文章:
限制访问
可以通过专用 IP 地址访问托管实例。 与在隔离的 SQL Server 环境中非常类似,应用程序或用户需要访问 SQL 托管实例网络 (VNet) 才能建立连接。 有关详细信息,请参阅将应用程序连接到 SQL 托管实例。
还可以在托管实例上配置服务终结点,该终结点允许使用与 Azure SQL 数据库相同的方式进行公共连接。 有关详细信息,请参阅在 Azure SQL 托管实例中配置公共终结点。
使用 SSMS 创建 Microsoft Entra 登录名
第一个 Microsoft Entra 登录名可以由 SQL 管理员创建,也可以由预配期间创建的 Microsoft Entra 管理员创建。 有关详细信息,请参阅为 SQL 托管实例预配 Microsoft Entra 管理员。
有关如何连接到 SQL 托管实例的示例,请参阅以下文章:
使用 SQL Server Management Studio (SSMS) 通过
sysadmin
SQL 登录名或 Microsoft Entra 管理员连接到托管实例。在“对象资源管理器”中右键服务器,然后选择“新建查询”。
在查询窗口中,使用以下语法为本地 Microsoft Entra 帐户创建登录名:
USE master GO CREATE LOGIN login_name FROM EXTERNAL PROVIDER GO
此示例为帐户 nativeuser@aadsqlmi.onmicrosoft.com 创建登录名。
USE master GO CREATE LOGIN [nativeuser@aadsqlmi.onmicrosoft.com] FROM EXTERNAL PROVIDER GO
在工具栏上,选择“执行”以创建登录名。
执行以下 T-SQL 命令检查新添加的登录名:
SELECT * FROM sys.server_principals; GO
有关详细信息,请参阅 CREATE LOGIN。
授予用于创建登录名的权限
现有登录名必须具有适当的权限或属于适当的服务器角色,才能创建其他 Microsoft Entra 登录名。
SQL 身份验证登录名
- 如果登录名是基于 SQL 身份验证的服务器主体,则必须为其分配
sysadmin
角色,才能为 Microsoft Entra 帐户创建登录名。
Microsoft Entra 身份验证登录名
- 如果登录名是 Microsoft Entra 服务器主体,则必须为其分配
sysadmin
或securityadmin
服务器角色,才能为其他 Microsoft Entra 用户、组和应用程序创建登录名。 - 至少必须授予 ALTER ANY LOGIN 权限,才能创建其他 Microsoft Entra 登录名。
- 默认情况下,在
master
中授予新建 Microsoft Entra 登录名的标准权限为:CONNECT SQL 和 VIEW ANY DATABASE。 - 可以将
sysadmin
服务器角色授予托管实例中的许多 Microsoft Entra 登录名。
将登录名添加到 sysadmin
服务器角色:
再次登录到托管实例,或通过充当
sysadmin
的 Microsoft Entra 管理员或 SQL 主体使用现有连接。在“对象资源管理器”中右键服务器,然后选择“新建查询”。
使用以下 T-SQL 语法向 Microsoft Entra 登录名授予
sysadmin
服务器角色:ALTER SERVER ROLE sysadmin ADD MEMBER login_name GO
以下示例向登录名 nativeuser@aadsqlmi.onmicrosoft.com 授予
sysadmin
服务器角色ALTER SERVER ROLE sysadmin ADD MEMBER [nativeuser@aadsqlmi.onmicrosoft.com] GO
使用 SSMS 创建其他 Microsoft Entra 登录名
创建 Microsoft Entra 登录名并授予 sysadmin
特权后,该登录名可以使用 FROM EXTERNAL PROVIDER 子句并结合 CREATE LOGIN 创建其他登录名。
通过在 SQL Server Management Studio (SSMS) 中选择“连接到服务器”,使用 Microsoft Entra 登录名连接到托管实例。
- 在“服务器名称”中输入 SQL 托管实例主机名。
- 对于身份验证,选择“Active Directory - 支持 MFA 的通用方法”,以显示多重身份验证登录窗口。 登录。 有关详细信息,请参阅通用身份验证(SSMS 支持多重身份验证)。
在“对象资源管理器”中右键服务器,然后选择“新建查询”。
在查询窗口中,使用以下语法为另一个 Microsoft Entra 帐户创建登录名:
USE master GO CREATE LOGIN login_name FROM EXTERNAL PROVIDER GO
此示例为 Microsoft Entra 用户 bob@aadsqlmi.net 创建登录名,其域 aadsqlmi.net 与 Microsoft Entra aadsqlmi.onmicrosoft.com 域联合。
执行以下 T-SQL 命令。 联合 Microsoft Entra 帐户是本地 Windows 登录名和用户的 SQL 托管实例替代品。
USE master GO CREATE LOGIN [bob@aadsqlmi.net] FROM EXTERNAL PROVIDER GO
使用 CREATE DATABASE 语法在托管实例中创建数据库。 在下一部分,此数据库将用于测试用户登录名。
在“对象资源管理器”中右键服务器,然后选择“新建查询”。
在查询窗口中,使用以下语法创建名为 MyMITestDB 的数据库。
CREATE DATABASE MyMITestDB; GO
为 Microsoft Entra ID 中的组创建 SQL 托管实例登录名。 在将登录名添加到 SQL 托管实例之前,该组必须存在于 Microsoft Entra ID 中。 请参阅使用 Microsoft Entra ID 创建基本组并添加成员。 创建组 mygroup 并在其中添加成员。
在 SQL Server Management Studio 中打开新的查询窗口。
本示例假设 Microsoft Entra ID 中存在一个名为 mygroup 的组。 执行以下命令:
USE master GO CREATE LOGIN [mygroup] FROM EXTERNAL PROVIDER GO
为了进行测试,请使用新建的登录名或组登录到托管实例。 与托管实例建立新的连接,并在身份验证时使用新登录名。
在“对象资源管理器”中右键服务器,然后选择新连接对应的“新建查询”。
执行以下命令,检查新建的 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 帐户登录,并尝试展开新建的数据库,将会看到以下错误:
有关授予数据库权限的详细信息,请参阅数据库引擎权限入门。
创建 Microsoft Entra 用户并创建示例表
注意
当用户作为 Microsoft Entra 组的一部分登录时,存在一些限制。
例如,由于给定的 Microsoft Entra 用户不在 sys.server_principals
表中,调用 SUSER_SID
将返回 NULL
。
因此,在这种情况下,对某些存储过程或授予的权限列表的访问可能会受到限制。
在 SQL Server Management Studio 中使用
sysadmin
帐户登录到托管实例。在“对象资源管理器”中右键服务器,然后选择“新建查询”。
在查询窗口中,使用以下语法基于 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
还支持从作为组的 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。
在新查询窗口中,使用以下 T-SQL 命令创建测试表:
USE MyMITestDB GO CREATE TABLE TestTable ( AccountNum varchar(10), City varchar(255), Name varchar(255), State varchar(2) );
使用创建的用户在 SSMS 中创建连接。 你会注意到,无法看到
sysadmin
在以前创建的表 TestTable。 我们需要向该用户提供读取数据库中的数据的权限。可以执行以下命令来检查用户当前拥有的权限:
SELECT * FROM sys.fn_my_permissions('MyMITestDB','DATABASE') GO
将用户添加到数据库级角色
要使用户能够查看数据库中的数据,我们可以向该用户提供数据库级角色。
在 SQL Server Management Studio 中使用
sysadmin
帐户登录到托管实例。在“对象资源管理器”中右键服务器,然后选择“新建查询”。
使用以下 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
执行以下命令,检查在数据库中创建的 Microsoft Entra 用户是否存在:
SELECT * FROM sys.database_principals GO
使用已添加到
db_datareader
角色的用户身份与托管实例建立新的连接。在“对象资源管理器”中展开数据库,以查看表。
打开新查询窗口并执行以下 SELECT 语句:
SELECT * FROM TestTable
是否能够看到表中的数据? 应会看到返回的列。
模拟 Microsoft Entra 登录名
SQL 托管实例支持模拟 Microsoft Entra 登录名。
测试模拟
在 SQL Server Management Studio 中使用
sysadmin
帐户登录到托管实例。在“对象资源管理器”中右键服务器,然后选择“新建查询”。
在查询窗口中,使用以下命令创建新的存储过程:
USE MyMITestDB GO CREATE PROCEDURE dbo.usp_Demo WITH EXECUTE AS 'bob@aadsqlmi.net' AS SELECT user_name(); GO
使用以下命令来查看执行该存储过程时模拟的用户是否为 bob@aadsqlmi.net。
Exec dbo.usp_Demo
使用 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 组测试跨数据库查询,需要创建另一个数据库和表。 如果已存在一个数据库和表,则无需额外创建。
在 SQL Server Management Studio 中使用
sysadmin
帐户登录到托管实例。在“对象资源管理器”中右键服务器,然后选择“新建查询”。
在查询窗口中,使用以下命令创建名为 MyMITestDB2 的数据库和名为 TestTable2 的表。
CREATE DATABASE MyMITestDB2; GO USE MyMITestDB2 GO CREATE TABLE TestTable2 ( EmpId varchar(10), FirstName varchar(255), LastName varchar(255), Status varchar(10) );
在新查询窗口中执行以下命令,在新数据库 MyMITestDB2 中创建用户 mygroup,并向 mygroup 授予对该数据库的 SELECT 权限:
USE MyMITestDB2 GO CREATE USER [mygroup] FROM LOGIN [mygroup] GO GRANT SELECT TO [mygroup] GO
使用 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 托管实例功能的完整概述,请参阅: