详解Azure SQL数据库行级安全

日期: 2015-07-29 作者:Rick Heiges翻译:曾少宁 来源:TechTarget中国 英文

微软已经在Azure SQL数据库推出了预览版行级安全性(RLS)。行级安全性使客户能够根据执行查询的用户特征(用户组成员属性或执行环境)对数据库表启用访问控制。 本文将介绍如何实现RLS。这个简单的示例扩展了微软RLS在线文档。

这个例子可以帮助用户理解它的基本概念。更详细信息请参见微软开发者网络网站中关于创建安全策略的文档。 首先,我们将在Azure SQL数据库中创建一些表,并且添加一些数据。我们将创建一个“Order”(订单)表和“Mapper”(映射器)表(如图1所示)。

Mapper表的作用是将特定类型的订单与特定的用户相关联。 图1:Order(订单)与Mapper(映射器)表 接下……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

微软已经在Azure SQL数据库推出了预览版行级安全性(RLS)。行级安全性使客户能够根据执行查询的用户特征(用户组成员属性或执行环境)对数据库表启用访问控制。

本文将介绍如何实现RLS。这个简单的示例扩展了微软RLS在线文档。这个例子可以帮助用户理解它的基本概念。更详细信息请参见微软开发者网络网站中关于创建安全策略的文档。

首先,我们将在Azure SQL数据库中创建一些表,并且添加一些数据。我们将创建一个“Order”(订单)表和“Mapper”(映射器)表(如图1所示)。Mapper表的作用是将特定类型的订单与特定的用户相关联。

图1:Order(订单)与Mapper(映射器)表

接下来,我们将创建几个用户,然后给他们分配读取这些表的访问权限(如图2所示)。

图2:给用户分配表的访问权限

我们将在一个单独的模式中创建一个内联表赋值函数(如图3所示)。如果表中附加的安全字段(这里是“User”)与规定的USER_NAME相同,或者USER_NAME为特定的用户名“Manager”,那么这个函数将返回“True”。注意,我们定义了一个泛型条件,它没有引用一个具体的表。

图3:内联表赋值函数

接下来,我们将新建一条安全策略,它使用前面创建的函数,并且将这个过滤器添加到Mapper表上(如图4所示)。命令中的“STATE = ON”的作用就是启用这个安全策略。在这段代码中,这个策略将应用于一个指定的表上。如果有多个表(这里使用了“User”字段)使用了相同的过滤条件,那么它们都会受到同一个策略影响。最好的做法是将函数和策略保存在不同的模式中,一是为了组织方便的考虑,二是限制用户在安全环境中所能看到的数据。

图4:创建一条安全策略

我们来测试一下。(如图5所示)。

图5:运行这个安全策略

现在,我们禁用这个安全策略。这实际上会禁用这个表的RLS。第一个SELECT *语句将会返回所有行,因为这时策略已经禁用。再执行第二个语句只会返回头信息(如图6所示)。

图6:禁用安全策略

在我们创建的Order表中,可以增加一个User字段,但是我们想利用Mapper表中已有的数据。所以,如果联合这两个表,那么结果就是经过过滤的(如图7所示)。另外,还可以尝试查询“Sales2”和“Manager”。

图7:联合Order和Mapper表

这种方法的主要问题是,它要求修改应用程序代码才能保证将Order表与Mapper表联合。如果不联合Order和Mapper表,我们就不能使用RLS。为了避免这个问题,下一步就是添加一个视图,从Order和Mapper表中选择一些行(如图8所示)。

图8:添加一个视图

我们现在可以使用一个视图来替代RLS的表格(如图9所示)。它同样适用于Sales2和Manager用户。

图9:使用一个视图

在启用RLS的过程中,与联合Mapper表相比,使用视图在编码上会更自然一些。然而,使用视图替代表的一般做法也同样适用。

在这一点上,显然RLS仍然需要很多的工作。当然,这种实现需要一定的工作;然而,上面介绍的视图方法很可能是我们应该考虑的首选方法。微软的RLS实现还提供了另一个更高效的方法。

接下来,我们将基于“辅助”表来建立安全性(如图10所示)。这时,辅助表就是Mapper表。我们要根据这个表来创建一个安全函数。

图10:使用Mapper表来创建安全性

然后,我们通过策略来将这个安全函数应用到Order表中(如图11所示)。

图11:将一个安全函数应用到Order表上

在实现RLS及相应的安全函数和策略之后,我们就可以在不需要视图的前提下查询Order表。换而言之,即使不直接联合Order表和Mapper表,我们仍然能够使用RLS安全性。

图12:在不使用视图的前提下查询Order表


作者

Rick Heiges
Rick Heiges

SQL Server MVP以及DB Best技术公司的首席解决方案架构师。

翻译

曾少宁
曾少宁

TechTarget中国特约技术编辑,某高校计算机科学专业教师和网络实验室负责人,曾任职某网络国际厂商,关注数据中心、开发运维、数据库及软件开发技术。有多本关于思科数据中心和虚拟化技术的译著,如《思科绿色数据中心建设与管理》和《基于IP的能源管理》等。

相关推荐