对 Azure SQL 外部表应用行级安全性
适用于:✅Azure 数据资源管理器
本文档介绍如何对 SQL 外部表应用行级安全性 (RLS) 解决方案。 行级安全性在用户级别实现数据隔离,根据当前用户凭据限制对数据的访问。 但是,Kusto 外部表不支持 RLS 策略定义,因此外部 SQL 表上的数据隔离需要采用不同的方法。 以下解决方案在 SQL Server 中使用行级安全性,并在 SQL Server 连接字符串中使用 Microsoft Entra ID 模拟。 此组合提供与在标准 Kusto 表上使用 RLS 应用用户访问控制相同的行为,以便根据源数据库中定义的行级安全策略,查询 SQL 外部表的用户只能看到发送给他们的记录。
先决条件
- 对 SQL Server 具有
ALTER ANY SECURITY POLICY
权限 - Kusto 端 SQL 外部表的表管理员级别权限
示例表
示例源是一个名为 SourceTable
的 SQL Server 表,具有以下架构。 systemuser
列包含数据记录所属的用户电子邮件。 这是应有权访问此数据的同一用户。
CREATE TABLE SourceTable (
id INT,
region VARCHAR(5),
central VARCHAR(5),
systemuser VARCHAR(200)
)
在源 SQL Server - SQL Server 端配置行级安全性
有关 SQL Server 行级安全性的一般信息,请参阅 SQL Server 中的行级安全性。
使用数据访问策略的逻辑创建一个 SQL 函数。 在此示例中,行级安全性基于与
systemuser
列匹配的当前用户的电子邮件。 可以修改此逻辑以满足任何其他业务要求。CREATE SCHEMA Security; GO CREATE FUNCTION Security.mySecurityPredicate(@CheckColumn AS nvarchar(100)) RETURNS TABLE WITH SCHEMABINDING AS RETURN SELECT 1 AS mySecurityPredicate_result WHERE @CheckColumn = ORIGINAL_LOGIN() OR USER_NAME() = 'Manager'; GO
针对表
SourceTable
创建安全策略,然后将列名作为参数传递:CREATE SECURITY POLICY SourceTableFilter ADD FILTER PREDICATE Security.mySecurityPredicate(systemuser) ON dbo.SourceTable WITH (STATE = ON) GO
注意
此时,数据已受到
mySecurityPredicate
函数逻辑限制。
允许用户访问 SQL Server - SQL Server 端
以下步骤取决于你使用的 SQL Server 版本。
为每个要访问 SQL Server 中存储的数据的 Microsoft Entra ID 凭据创建登录和用户:
CREATE LOGIN [user@domain.com] FROM EXTERNAL PROVIDER --MASTER CREATE USER [user@domain.com] FROM EXTERNAL PROVIDER --DATABASE
向 Microsoft Entra ID 用户授予安全性函数上的 SELECT 权限:
GRANT SELECT ON Security.mySecurityPredicate to [user@domain.com]
向 Microsoft Entra ID 用户授予
SourceTable
上的 SELECT 权限:GRANT SELECT ON dbo.SourceTable to [user@domain.com]
定义 SQL 外部表连接字符串 - Kusto 端
有关连接字符串的详细信息,请参阅 SQL 外部表连接字符串。
使用连接字符串和
Active Directory Integrated
身份验证类型创建 SQL 外部表。 有关详细信息,请参阅 Microsoft Entra 集成(模拟)。.create external table SQLSourceTable (id:long, region:string, central:string, systemser:string) kind=sql table=SourceTable ( h@'Server=tcp:[sql server endpoint],1433;Authentication=Active Directory Integrated;Initial Catalog=[database name];' ) with ( docstring = "Docs", folder = "ExternalTables", createifnotexists = false, primarykey = 'id' )
连接字符串:
Server=tcp:[sql server endpoint],1433;Authentication=Active Directory Integrated;Initial Catalog=[database name];
根据 Microsoft Entra ID 验证数据隔离,就像在 Kusto 中使用行级安全性一样。 在这种情况下,将根据 SourceTable 的
systemuser
列筛选数据,与 Kusto 模拟中的 Microsoft Entra ID 用户(电子邮件地址)匹配:external_table('SQLSourceTable')
注意
出于测试目的,可以在 SQL Server 端禁用然后再启用策略。
若要禁用和启用策略,请使用以下 SQL 命令:
ALTER SECURITY POLICY SourceTableFilter
WITH (STATE = OFF);
ALTER SECURITY POLICY SourceTableFilter
WITH (STATE = ON);
在 SQL Server 端启用安全策略后,Kusto 用户只能看到与其 Microsoft Entra ID 匹配的记录,作为针对 SQL 外部表的查询结果。 禁用安全策略后,所有用户都可以通过针对 SQL 外部表的查询来访问完整表内容。