使用 “版本 ”下拉列表切换服务。 了解有关导航的详细信息。
适用于:✅ Azure Data Explorer
本文介绍如何使用 SQL 外部表应用行级安全性(RLS)解决方案。 行级别安全性 在用户级别实现数据隔离,基于当前用户凭据限制对数据的访问。 但是,Kusto 外部表不支持 RLS 策略定义,因此外部 SQL 表上的数据隔离需要不同的方法。 以下解决方案在 SQL Server 中使用行级安全性,并在 SQL Server 连接字符串中使用 Microsoft Entra ID 模拟身份。 根据源数据库中定义的行级安全策略,此组合提供与通过 RLS 将用户访问控制应用于标准 Kusto 表相同的行为,因此查询 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将 Security 功能上的 SELECT 权限授予 Microsoft Entra ID 用户:
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' )Connection String:
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 外部表的查询来访问完整表内容。