细粒度权限架构的一个优点就是 SQL Server不仅保护元数据,也保护数据。在 SQL Server 2005之前,能够访问数据库的用户可以看到数据库中所有对象的元数据,无论该用户是否可以访问其中的数据或是否能够执行存储过程。
SQL Server 2008 仔细检查数据库中主体所拥有的各种权限,仅当主体具有所有者身份或拥有对象的某些权限时,才会显示该对象的元数据。还有一种 VIEW DEFINITION 权限,即使没有该对象的其他权限,利用它也能查看元数据信息。
这种保护扩展到了某些操作返回的出错消息,这些操作试图访问或更新用户无权访问的对象。SQL Server 不会确认确实存在一份名为 Address 的表,使攻击者确信自己的方向是正确的,而是返回提示各种可能性的出错消息。例如,假如用户无权访问数据库中的对象,并且试图访问 Address 表,则 SQL Server 将显示下列出错消息:
Msg 3701, Level 14, state 20, Line 1
执行上下文
一直以来,SQL Server 都支持所有权链的概念,它可确保管理员和应用程序开发人员能够在数据库的入口点提前检查权限,而不是用来提供所有被访问对象的权限。只要调用模块(存储过程或函数)或视图的用户拥有模块的执行权限或视图的选择权限,而且模块或视图的所有者曾是被访问对象的所有者(所有权链),则不会检查基本对象的任何权限,而且调用者将收到请求的数据。
假如因为代码的所有者没有被引用对象的所有权,而导致所有权链被打断,SQL Server 将按照调用者的安全上下文检查权限。假如调用者拥有访问对象的权限,SQL Server 将返回数据。假如没有此权限,SQL Server 将提示出错。
所有权链有一些局限性:它只适用于数据操作,而不适用于动态 SQL。而且,如要跨越所有权边界访问对象,就不可能实现所有权链。因此,权限提前检查行为只适用于某些场合。
SQL Server 2008 能够利用执行上下文标记模块,这样模块中的语句即可供与调用用户并列的特殊用户执行。通过这种方式,调用用户仍然需要模块的执行权限,而SQL Server 将按照模块的执行上下文检查模块中语句的权限。可以利用此行为 *** 所有权链的某些缺陷,因为它适用于模块中的所有语句。想要执行权限提前检查的管理员可以利用执行上下文达到这一目的。
在定义用户定义函数(除了内联的表值)、存储过程和触发器时,可以利用 EXECUTE AS 子句指定SQL Server 要使用哪个用户的权限验证对对象以及过程引用数据的访问:
CREATE PROCEDURE GetData(@Table varchar(40))
SQL Server Management Studio 完全支持凭证和 *** 的创建,如图8所示。这将创建与上一段代码相同的 *** 。
图3:SQL Server Management Studio 中的SQL Server Agent 新 *** *** 不只是操作系统中杜绝安全问题的一种方式。假如与 *** 一起使用的凭证没有 Windows 权限,如通过 *** 写入目录的权限,则该 *** 也不会有此权限。也可利用 *** 为xp_cmdshell 授予有限的执行权限,因为它是黑客最喜欢利用的工具,只要他们能够成功威胁到 SQL Server 计算机的安全,就会进一步利用该工具将其威胁范围扩展到 *** 空间。 *** 提供了该领域的保护机制,因为纵使主体在 *** 上不受任何限制,例如域管理员主体,通过 *** 执行的任何命令也只拥有凭证帐户的有限权限。 执行上下文 一直以来,SQL Server 都支持所有权链的概念,它可确保管理员和应用程序开发人员能够在数据库的入口点提前检查权限,而不是用来提供所有被访问对象的权限。只要调用模块(存储过程或函数)或视图的用户拥有模块的执行权限或视图的选择权限,而且模块或视图的所有者曾是被访问对象的所有者(所有权链),则不会检查基本对象的任何权限,而且调用者将收到请求的数据。 假如因为代码的所有者没有被引用对象的所有权,而导致所有权链被打断,SQL Server 将按照调用者的安全上下文检查权限。假如调用者拥有访问对象的权限,SQL Server 将返回数据。假如没有此权限,SQL Server 将提示出错。 所有权链有一些局限性:它只适用于数据操作,而不适用于动态 SQL。而且,如要跨越所有权边界访问对象,就不可能实现所有权链。因此,权限提前检查行为只适用于某些场合。 SQL Server 2008 能够利用执行上下文标记模块,这样模块中的语句即可供与调用用户并列的特殊用户执行。通过这种方式,调用用户仍然需要模块的执行权限,而SQL Server 将按照模块的执行上下文检查模块中语句的权限。可以利用此行为 *** 所有权链的某些缺陷,因为它适用于模块中的所有语句。想要执行权限提前检查的管理员可以利用执行上下文达到这一目的。 在定义用户定义函数(除了内联的表值)、存储过程和触发器时,可以利用 EXECUTE AS 子句指定SQL Server 要使用哪个用户的权限验证对对象以及过程引用数据的访问:
SQL Server 2008 提供了4种 EXECUTE AS 选项。 EXECUTE AS CALLER 指定代码在模块调用者的安全上下文中执行。不会出现假冒的现象。调用者必须拥有所有被引用对象的访问权限。但是,SQL Server 只检查被打断的所有权链的权限,假如代码的所有者也拥有基本对象的所有权,则只检查该模块的执行权限。这就是向后兼容性的默认执行上下文。 EXECUTE AS 'user_name' 指定代码在指定用户的安全上下文中执行。假如不想使用所有权链,这就是一个不错的选项。否则,可以创建拥有运行代码以及创建定制权限集所需权限的用户。 EXECUTE AS SELF 是一个快捷符号,用于为创建或更改模块的用户指定安全上下文。在内部,SQL Server 将保存与模块关联的实际用户名,而不是保存“SELF”。 EXECUTE AS OWNER 指定安全上下文就是模块执行时模块当前所有者的安全上下文。假如模块没有所有者,则将使用包含架构所有者的上下文。如想修改模块的所有者,而且不想修改模块本身,这就是一个绝佳选项。 利用 EXECUTE AS 选项更改用户上下文时,模块的创建者和更改者必须拥有指定用户的IMPERSONATE 权限。不能从数据库中删除指定用户,除非将所有模块的执行上下文更改为其他用户。 用户/架构分离 SQL Server 2000 没有架构的概念,而 ANSI SQL-99 规范将架构定义为单个主体所拥有的所有数据库对象 *** ,而且该主体形成了对象的一个命名空间。架构就是数据库对象的容器(如表、视图、存储过程、函数、类型和触发器等)。它的功能与.NTE Framework 和 XML 中的命名空间函数非常类似,该函数可将对象进行分组,以便数据库能够重用对象名称,如允许在一个数据库中同时存在 dbo.Customer 和 Fred.Customer,也可对不同所有者的对象进行分组。 注意:需要用到目录视图,如 sys.database_sys.principals、sys.schemas 和sys.objects 等。原因在于 sysobjects 旧系统表不支持架构,因此不支持U/S分离。此外,不赞成使用旧目录视图,在 SQL Server 的未来版本中它们将被删除。 图9的顶端就是 SQL Server 2000中的架构工作原理。当管理员在数据库中创建 Alice 用户时, SQL Server 将自动创建 Alice 架构,它隐藏于 Alice 用户后面。假如 Alice 登录了正在运行 SQL Server 但没有数据库所有权的服务器,而且创建了表1,则该表单实际名称为 Alice.Table1。这也适用于 Alice 创建的其他对象,如 Alice.StoredProcedure1 和 Alice.View1。假如 Alice 是数据库所有者或 sysadmin,她创建的对象将成为 dbo 架构的一部分。虽然我们习惯说 dbo 拥有对象,但这是同一码事。
图4:SQL Server 2000 and 2008中的用户/架构/对象 需要修改对象的所有权时,例如 Alice 离开公司而 Lucinda 接手了 Alice 的工作,此时SQL Server 2000 中用户和架构的融合会产生一个问题。系统管理员必须将 Alice 拥有的所有对象的所有者改为Lucinda。更成问题的是,则 Lucinda 拥有了表的所有权后,还必须将任何引用 Alice.Table1 的Transact-SQL 或客户端应用程序代码改为引用 Lucinda.Table1。根据 Alice 拥有的对象数量以及内部嵌有该名称的应用程序数量,这可能是一项繁重的工作。Microsoft 公司一直建议内置的 dbo 用户要拥有所有的数据库对象,以避免产生这些问题。与修改许多对象和客户端应用程序相比,修改数据库的所有权要容易得多。 注意:不要被 SQL Server 2000 CREATE SCHEMA 语句迷惑。它只是一种简单的 *** ,用以创建特殊用户拥有的表和视图,以及授予权限。可以利用该语句命名架构的所有者,但不能命名架构。SQL Server 仍不可避免地将所有者链接到架构,这要面对修改所有权带来的所有问题。 SQL Server 2008 通过分离用户和架构克服了这些问题,并实施了 SQL-99 架构,如图9底部所示。利用新增的 CREATE USER DDL 创建 Alice 新用户时,SQL Server 不再自动创建使用相同名称的架构。反之,必须显式创建架构,并将其所有权分配用户。由于图示的所有的数据库对象都包含于 Schema1 架构中,就是 Alice 最初拥有的架构,因此只须将架构的所有者改为 Lucinda,就可以方便地修改所有架构对象的所有权。每位用户也都被分配默认架构,这样 SQL Server 将假定没有架构引用且按照名称引用的任何对象都位于默认架构中。在图9的底部,假如 Alice 使用 Schema1 作为默认架构,她就可将该表命名为 Schema1.Table1 或Table1。Carol 用户可能没有与其名字关联的默认架构,必须将该表命名为 Schema1.Table1。没有默认预定义架构的任何用户都使用 dbo 作为默认架构。 在 SQL Server 2008 中,完全合格的对象名称由4部分组成,这与旧版SQL Server 中的对象名称类似:
与旧版类似,假如对象所在服务器与运行代码的服务器同名,则可忽略服务器名称。假如连接打开了同名数据库,则可忽略数据库名称。假如使用当前用户的默认架构或架构为 dbo 所拥有,则可忽略架构名称,因为这是 SQL Server 尝试消除对象名称歧义时最后用过的架构。 可以利用 CREATE USER 语句而非 sp_adduser 语句创建新用户。此系统存储过程仍然是为了实现向后兼容性,但已进行了少许修改,以遵循用户与架构分离的新原则。sp_adduser 创建的架构与新用户名或应用程序角色同名,并将该架构作为用户的默认架构,这与 SQL Server 2000 的行为类似,但提供了分离的架构。 注意:使用 ALTER AUTHORIZATION 语句时,可能会产生这种情况:“您”拥有“我的”架构中的表(或反之)。这个问题具有重大的隐含意义。例如,谁拥有该表的触发器,您还是我?底部的代码行可以设计得非常巧妙,以发现架构范围对象或类型的真正所有者。有两种方式可以避开此问题: 利用 OBJECTPROPERTY(id,”OwnerId”)发现对象的真正所有者。 利用 TYPEPROPERTY(type,”OwnerId”)发现类型的真正所有者。 SQL Server 2008 利用同义词帮助减少击键次数。可以利用两部分、三部分或四部分完整对象名为任何对象创建同义词。SQL Server 使用同义词访问已定义的对象。在下列代码中,“History”同义词表示在AdventureWorks 数据库中指定的 schema.table。SELECT 语句返回EmployeeDepartmentHistory 表的内容。
注意:假如其他人准备使用同义词,则管理员或所有者必须为其授予权限。针对视图、表或表值函数,可对同义词应用GRANT SELECT。针对过程或标量函数,可对同义词应用 GRANT EXECUTE,诸如此类。 也可通过以下代码,为完整的四部分名称定义“History”同义词:
假设当前的用户拥有使用同义词的权限以及读取表的权限,则使用类似的四部分全名即可在其他数据库上下文中使用同义词:
还要注意,假如不提供架构名称作为新同义词名称的一部分,它将成为默认架构的一部分。 上一篇 返回首页 下一篇声明: 此文观点不代表本站立场;转载务必保留本文链接;版权疑问请联系我们。 别人在看电脑屏幕不小心竖起来了?别慌,快捷键搞定Destoon 模板存放规则及语法参考Destoon系统常量与变量Destoon系统目录文件结构说明Destoon 系统安装指南Destoon会员公司主页模板风格添加 ***Destoon 二次开发入门Microsoft 将于 2026 年 10 月终止对 Windows 11 SE 的支持Windows 11 存储感知如何设置?了解Windows 11 存储感知开启的好处Windows 11 24H2 更新灾难:系统升级了,SSD固态盘不见了...IT头条
Synology 更新 ActiveProtect Manager 1.1 以增强企业 *** 弹性和合规性00:43
新的 Rubrik Agent Cloud 加速了可信的企业 AI *** 部署00:34
宇树科技 G1人形机器人,拉动一辆重达1.4吨的汽车00:21
Cloudera 调查发现,96% 的企业已将 AI 集成到核心业务流程中,这表明 AI 已从竞争优势转变为强制性实践02:05
投资者反对马斯克 1 万亿美元薪酬方案,要求重组特斯拉董事会01:18技术热点大型网站的 HTTPS 实践(三):基于协议和配置的优化ubuntu下右键菜单添加新建word、excel文档等快捷方式Sublime Text 简明教程用户定义SQL Server函数的描述怎么在windows 7开始菜单中添加下载选项?SQL Server 2016将有哪些功能改进?IT技术网 版权所有 © 2020-2025, 京ICP备14047533号-20,Power by OK设计网在上方输入关键词后,回车键 开始搜索。Esc键 取消该搜索窗口。 |
在某些电脑中,机器内部蜂鸣器与系统的声音输出方案是相关联的,这样一来会导致当系统输出声音时,即使电脑没有连接外部音响或耳机,也会通过内置蜂鸣器发出“嘟嘟哔哔”的声音。这个问题主要出现在Windows 7电脑中,假如你的电脑恰好遇到了这样的问题,可参考下面的方法来解决: 1、在桌面“计算机”图标上右...
北京时间1月13日消息,根据计划,微软将于2015年1月13日正式结束对Windows 7SP1的“主流支持”,而这也标志着“扩展支持”阶段的开始,这个阶段将于2020年1月14日结束。 2013年10月份,微软终止销售独立的Windows 7系统安装包,并要求制造商于2014年10月份停止生...
一些用户的Windows 7系统开机后出现黑屏,代码为 Windows无法启动: WindowsSystem32ConfigSystem”。这个问题该如何修复呢?现在小编就给大家分析一下吧。 其实这个代码的意思是引导文件丢失了,引导文件(NTLDR)一般存放于C盘根目录下,是一个具有隐藏和只读属性...
假如你想要在Ubuntu上使用Windows应用,就需要用到Wine了,除了支持Linux系统外,Wine还可运行于其他系统,是个非常使用的软件,下面小编就以Ubuntu 14.04为例,给大家介绍下Ubuntu 14.04安装Wine的步骤。 Ubuntu 14.04安装Wine的步骤 1...
每一位用户的Windows 7系统上,或多或少都会有一到两个自己常用的文件夹,那么如何将这些常用的文件夹添加到任务栏上,增加我们的工作效率呢 许多用户只知道移动exe程序文件到任务栏,却不知道文件夹怎么移,下面小编通过图文教程来告诉大家方法。 操作方法: 1、首先将你使用频率最高的那个文件夹重命...
我们都知道连续按 Shift 五次可以启用或关闭粘滞键,但是假如我们不需要粘滞键,想要将它禁用该怎么设置呢?现在小编就教你解决这个问题的方法吧。 具体操作步骤如下: 1、首先依次点击“开始—控制面板—轻松访问中心—使键盘更容易进行使用”项; 2、在弹出来的界面中,取消勾选“启用粘滞键”...