所有权链(Ownership Chain)是特殊的权限评估方式,常见拥有所有权的数据库对象是:数据库对象,数据库角色(Role),和架构(Schema),在创建数据库角色,或架构时,SQL Server自动创建所有权:

CREATE ROLE role_name [ AUTHORIZATION owner_name ]
CREATE SCHEMA schema_name [AUTHORIZATION owner_name]

数据库对象,例如,数据表(Table),存储过程(SP),视图(View)等,也有所有者(Owner),从系统视图 sys.objects 中查看数据库对象的所有者,字段principal_id 指定数据库对象的所有者,如果该对象的principal_id为null,并且包含在架构中,那么该对象(schema-contained object)的所有者是其数据库架构的所有者(Schema Owner)。

一,所有权链的权限评估方式

SQL Server保证只有被授予权限的安全主体(Principal)才能访问安全对象(Securable)。当多个数据库对象相互访问时,访问的对象序列称作链(chain),链中的每个节点都是一个数据库对象。当遍历链中的各个节点时,SQL Server会采用特殊的方式来评估权限,这跟分别访问单个对象时的权限评估方式不同。

当通过链访问对象时,SQL Server首先把对象的所有者与调用对象的所有者(链中的上一个链接)进行比较。 如果两个对象拥有相同的所有者,则不会检查被引用对象的权限。每当一个对象访问具有不同所有者的另一个对象时,所有者链被中断,并且SQL Server必须检查调用者的安全上下文。这意味着,当一个对象的所有者把权限授予其他用户时,该用户能够访问该所有者拥有的所有数据库对象。

所有权链是一种特殊的权限评估方式:只检查链中对象的所有者,如果所有者相同,那么有权限访问该对象。这就是说,在所有权链中,SQL Server完全信任数据库对象的所有者(Owner),不会检查用户是否具有该对象的访问权限,只比较链中相邻的两个对象的所有者是否相同,如果相同,那么就有权限访问该对象;只在所有者不同时,才会执行权限检查。这在数据库管理上非常有用,但也会带来潜在的风险。

假设存在一个存储过程,用于从一个数据表中读取数据,用户被授予对存储过程的执行权限。如果存储过程和表具有相同的所有者,那么不需要被授予对该表的任何权限(甚至被授予拒绝权限),用户都可以访问该数据表。 但是,如果存储过程和表具有不同的所有者,那么SQL Server必须在允许访问数据之前检查用户在表上的权限。

二,修改所有者

所有权实际上是一种特殊的权限验证(AUTHORIZATION),修改所有权链的语法如下:

ALTER AUTHORIZATION
ON [ <class_type>:: ] entity_name
TO { principal_name | SCHEMA OWNER }

常见的class_type是:OBJECT、ROLE、SCHEMA

<class_type> ::=
{
OBJECT | ASSEMBLY | ASYMMETRIC KEY | AVAILABILITY GROUP | CERTIFICATE
| CONTRACT | TYPE | DATABASE | ENDPOINT | FULLTEXT CATALOG
| FULLTEXT STOPLIST | MESSAGE TYPE | REMOTE SERVICE BINDING
| ROLE | ROUTE | SCHEMA | SEARCH PROPERTY LIST | SERVER ROLE
| SERVICE | SYMMETRIC KEY | XML SCHEMA COLLECTION
}

三,所有权链关系不适用的情况

所有权链不适用于动态SQL语句,要调用执行动态TSQL语句的存储过程,调用者(caller)必须被授予访问基础表的权限,这使得应用程序更容易受到SQL注入攻击。 SQL Server提供了新的安全机制,例如,模拟和认证得签名模块,不需要授予对基础表的权限。

引文1,出自《The Ownership Chain – How the Securable Owner affects Permission Enforcement in SQL Server》:

When SQL Server executes a query, it checks the permissions of the executing principal on every object that is touched on the way. Therefore, if you run a select statement against a view that in turn selects form a table, you need to have access to both the view and the underlying table.

However, before checking the permissions on the underlying securable, SQL Server checks if the accessing object (the view) and the accessed securable (the table) have the same owner. If they have the same owner, permission checking on the accessed securable is completely skipped and access is granted.

引文2,出自《【译】第七篇 SQL Server安全跨数据库所有权链接》:

所有数据库对象都有一个所有者,并且所有者控制谁在对象上有权限。对象访问其他对象,比如存储过程在SELECT语句把多张表联接起来,形成一个连续的所有权链接,只要一个所有者拥有所有对象。
这种情况下用户只要有顶层对象(比如存储过程、视图)的权限,访问其他对象并不需要对底层对象有权限,只要存在一个连续的所有权链接就行。SQL Server一旦证实用户对顶层对象有权限就会停止检查底层对象的权限。这种设计为用户提供了更多更好的控制权,因为用户只需要直接访问对象的权限。
提示:所有权链接只适用于对象的权限,如SELECT、UPDATE和EXECUTE操作。SQL Server总是检查数据定义语言语句的权限,因为这些权限应用于语句而不是对象。

参考文档:

Ownership Chains

Security Through Ownership Chains

The Ownership Chain – How the Securable Owner affects Permission Enforcement in SQL Server

Ownership chaining in SQL Server security feature or security risk

【译】第七篇 SQL Server安全跨数据库所有权链接

所有权链(Ownership Chain)的更多相关文章

  1. 责任链模式/chain of responsibility/行为型模式

    职责链模式 chain of responsibility 意图 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处 ...

  2. atitit.设计模式(1)--—职责链模式(chain of responsibility)最佳实践O7 日期转换

    atitit.设计模式(1)---职责链模式(chain of responsibility)最佳实践O7 日期转换 1. 需求:::日期转换 1 2. 可以选择的模式: 表格模式,责任链模式 1 3 ...

  3. 二十四种设计模式:责任链模式(Chain of Responsibility Pattern)

    责任链模式(Chain of Responsibility Pattern) 介绍为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求.将这些对象连成一条链,并沿着这条链传递该请求,直 ...

  4. 设计模式(十二)职责链模式(Chain of Responsibility)(对象行为型)

     设计模式(十二)职责链模式(Chain of Responsibility)(对象行为型) 1.概述 你去政府部门求人办事过吗?有时候你会遇到过官员踢球推责,你的问题在我这里能解决就解决,不能解决就 ...

  5. 乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern)

    原文:乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 责任链模式(Chain of R ...

  6. 职责链模式(Chain of Responsibility)(对象行为型)

    1.概述 你去政府部门求人办事过吗?有时候你会遇到过官员踢球推责,你的问题在我这里能解决就解决,不能解决就推卸给另外个一个部门(对象).至于到底谁来解决这个问题呢?政府部门就是为了可以避免屁民的请求与 ...

  7. 设计模式的征途—14.职责链(Chain of Responsibility)模式

    相信大家都玩过类似于“斗地主”的纸牌游戏,某人出牌给他的下家,下家看看手中的牌,如果要不起,则将出牌请求转发给他的下家,其下家再进行判断.一个循环下来,如果其他人都要不起该牌,则最初的出牌者可以打出新 ...

  8. 责任链模式 职责链模式 Chain of Responsibility Pattern 行为型 设计模式(十七)

    责任链模式(Chain of Responsibility Pattern) 职责链模式 意图 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系 将这些对象连接成一条链,并沿着这 ...

  9. 责任链模式-Chain of Responsibility(Java实现), 例2

    责任链模式-Chain of Responsibility 在这种模式中,通常每个接收者都包含对另一个接收者的引用.如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推. 咱们在 ...

随机推荐

  1. Spring 如何在 WEB 应用中使用

    1. Spring 如何在 WEB 应用中使用 ? 1). 需要额外加入的 jar 包: spring-web-4.0.0.RELEASE.jar spring-webmvc-4.0.0.RELEAS ...

  2. mysqlDOS命令

    MySQL : 1.安装mysql服务:mysqld install 2.删除mysql服务:sc delete mysql 3.启动mysql服务:net start mysql 4.初始化设置密码 ...

  3. Centos下防止ssh暴力破解密码

    参考文章地址:https://yq.aliyun.com/ziliao/48446 https://www.cnblogs.com/lsdb/p/7095288.html 1.收集 /var/log/ ...

  4. fountion 的调用 和 打印返回值 + 占位符

    结果: (2) 结果

  5. C++11新特性之十:enable_shared_from_this

    enable_shared_from_this是一个模板类,定义于头文件<memory>,其原型为: template< class T > class enable_shar ...

  6. Gsoap在QT工程里如何调用

    Qt并没有SOAP的官方实现,都是借助三方库来实现,不过似乎有个QtSoap,不过这个不是太会用,所以还是用Gsoap 这里生成纯C文件, 1.下载gSOAP(http://sourceforge.n ...

  7. php 中使用cURL发送get/post请求,上传图片,批处理

    cURL是利用url语法规定传输文件和数据的工具.php中有curl拓展,一般用来实现网络抓取,模拟发送get   post请求,文件上传. 在php中建立curl的基本步骤如下: 1 初始化     ...

  8. 【原创】uWSGI http和http-socket说明

    http 和 http-socket的使用上有一些区别: http: 自己会产生一个http进程(可以认为与nginx同一层)负责路由http请求给worker, http进程和worker之间使用的 ...

  9. UVa 11440 - Help Tomisu(欧拉函数 + 问题转换)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  10. Install Weblogic12C

    1. 安装JDK软件 1.1)jdk版本选择 由于jdk编译出class文件是一个二进制文件,其中前四个字节是magic位,第五到第六个字节对应于minor和major.class文件的minor和m ...