Chapter 3 Protecting the Data(1):理解权限

原文出处:http://blog.csdn.net/dba_huangzj/article/details/39548665,专题目录:http://blog.csdn.net/dba_huangzj/article/details/37906349

未经作者同意,任何人不得以“原创”形式发布,也不得已用于商业用途,本人不负责任何法律责任。

前一篇:http://blog.csdn.net/dba_huangzj/article/details/39496517

前言:

关系型数据库管理系统(RDBMS),如SQL Server、Oracle、Mysql等,不仅仅需要负责存取数据,也要负责确保数据的一致性和安全性。类似于其他服务器系统,通过授权给一个用户并维护这个用户的会话来控制数据的访问行为。每当尝试读写数据时,SQL Server都会检查这些权限。首先,先了解一些概念:

Permissions:权限,在安全主体层面授权,这些安全主体包含:登录名、数据库用户、角色等。所有这些对象都可以被grant/deny/revok权限。简称GDR(GRANT,DENY,REVOKE)。接受权限的主体称为接受者(Grantee),设置权限的帐号成为授予者(Grantor)。

权限可以使用GRANT选项授予,权限属于Data Control Language(DCL)命令,独立于DML/DDL。基本语法如下:

<GRANT | REVOKE | DENY> ON <class of securable>::<securable> TO <principal>;

权限的3种状态为:

  • GRANT: 权限被允许
  • DENY:权限被显式拒绝(优先级高于GRANT)
  • REVOKE:消除GRANT/DENY的影响,等于移除权限。

实现:

可以使用下面语句查看可被授予的权限:

-- 所有返回内置权限的完整列表
SELECT * FROM sys.fn_builtin_permissions(DEFAULT);
--返回特定类别,如Schema的权限 :
SELECT * FROM sys.fn_builtin_permissions(‘SCHEMA‘);

本机结果如下:

第一列是安全主体的类别,即权限应用在这个类别上。permission_name和type用于描述权限,type通常是权限的简写。covering_permission_name列,如果不为 NULL,则为该类的权限名称(隐含该类的其他权限)。比如截图中第一行,CREATE TABLE权限意味着需要有ALTER DATABASE权限。parent_class_desc(

如果不为 NULL,则为包含当前类的父类的名称。)和Parent_covering_permission_name(如果不为 NULL,则为父类的权限名称(隐含该类的所有其他权限)。),具体解释可以查看联机丛书。

下面是一些GRANT权限的例子:

-- 授权给bill这个数据库用户,让其拥有对Accounting.Account 表有SELECT的权限
GRANT SELECT ON object::Accounting.Account TO Bill;
-- 授权给bill这个数据库用户,可以执行Accounting架构中的所有存储过程和标量函数
GRANT EXECUTE ON schema::Accounting TO bill;
--授权给用户自定义角色AvailabilityManager,让其拥有修改服务器上可用性组的权限
GRANT ALTER ANY AVAILABILITY GROUP TO AvailabilityManager;

如果需要回收权限,可以使用REVOKE命令:

REVOKE SELECT ON object::Accounting.Account TO Fred;

如果需要显式禁止,可以使用DENY命令:

DENY SELECT ON object::Accounting.Account TO Fred;

当deny之后,如果用户需要运行已被deny的操作,会报出229错误,这个错误是对象上的权限被禁止,但是由于其暴露了信息(如xx对象被禁止,意味着xx对象是存在的),给了攻击者一些感兴趣的信息。而错误208表示尝试访问一个不存在的对象。

原理:

下面是最常用的权限:

权限名 描述
ALTER
修改对象定义的权限

CONNECT 访问数据库或连接端点的权限
DELETE 删除对象的权限
EXECUTE 执行存储过程或函数的权限
IMPERSONATE 等价于EXECUTE AS命令
INSERT 插入数据到表或视图的权限
REFERENCES 在外键定义或者在视图使用了WITH SCHEMABINDING中应用对象的权限
SELECT 能够在对象或者列上执行SELECT命令
TAKE OWNERSHIP 成为对象的拥有者的权限
UPDATE 更新数据的权限
VIEW DEFINITION 查看对象定义的权限

例子:

DENY SELECT ON OBJECT::dbo.Contact TO Fred;--禁止Fred查询dbo.contact表的数据
DENY UPDATE ON OBJECT::dbo.Contact TO Fred;--Fred更新dbo.contact表的数据
GRANT SELECT ON OBJECT::dbo.Contact TO Fred;--授权Fred查询dbo.contact表的数据

注意,GRANT ALL虽然存在,但是在后续会被弃用。REVOKE命令可以移除GRANT的效果,不要使用DENY命令来移除命令,除非你确定这个用户不在需要访问这个对象。DENY命令会覆盖所有GRANT命令。

登录名可以被GRANT/DENY在架构或者对象级别,比如

DENY SELECT ON Accounting.Account TO dbo;

CONTROL权限包含了安全实体上的其他权限,如果DENY了SELECT权限,然后又GRANT了CONTROL权限,那么deny权限会被回收。由于SQL Server的权限检查算法和复杂,所以最好保持权限策略的简单性。SQL Server对象权限的层级及传输示意图:

更多:

如果需要测试当前用户的权限,恶意使用HAS_PERMS_BY_NAME函数,如果返回1,则证明权限被授予:

--是否有对dbo架构有select权限?
SELECT HAS_PERMS_BY_NAME(‘dbo‘, ‘SCHEMA‘, ‘SELECT‘);
--检查服务器层面的所有权限
SELECT HAS_PERMS_BY_NAME(null, null, ‘VIEW SERVER STATE‘);

使用下面语句获取已授予的权限列表:

-- 当前用户在dbo架构上有什么权限?
SELECT * FROM sys.fn_my_permissions(‘dbo‘, ‘SCHEMA‘);
--服务器所有权限
SELECT * FROM sys.fn_my_permissions(null, null);

服务器权限记录在sys.server_permissions系统视图,数据库权限存放在每个数据库的sys.database_permissions系统视图。可以查看dbo.prospect表上的权限集合:

SELECT  grantee.name AS grantee ,
        grantor.name ,
        dp.permission_name AS permission ,
        dp.state_desc AS state
FROM    sys.database_permissions dp
        JOIN sys.database_principals grantee ON dp.grantee_principal_id = grantee.principal_id
        JOIN sys.database_principals grantor ON dp.grantor_principal_id = grantor.principal_id
WHERE   dp.major_id = OBJECT_ID(‘dbo.prospect‘);

WITH GRANT OPTION工作原理:

意味着被授权的主体能把相同或者少于当前权限的权限授予给其他主体。比如

GRANT SELECT ON OBJECT::dbo.contact TO fred WITH GRANT OPTION;

这个授予了Fred有两个权限,一个是SELECT,一个是GRANT SELECT,可以回收除了SELECT之外的其他权限:

REVOKE SELECT ON OBJECT::dbo.contact TO fred CASCADE;
GRANT SELECT ON OBJECT::dbo.contact TO fred;

这两个语句就是先回收所有权限,然后仅赋予SELECT,加上CASCADE的含义是把Fred曾经授权给其他主体的SELECT权限一并收回。

REFERENCE权限:

这个权限不仅仅作用域表,还可以作用于数据库、架构等主体。REFERENCE在表中允许创建外键约束,在视图中可以用于WITH SCHEMABINDING 所影响的表的引用。

下一篇:

时间: 2024-10-20 10:26:16

Chapter 3 Protecting the Data(1):理解权限的相关文章

Chapter 3 Protecting the Data(2):分配列级权限

原文出处:http://blog.csdn.net/dba_huangzj/article/details/39577861,专题目录:http://blog.csdn.net/dba_huangzj/article/details/37906349 未经作者同意,任何人不得以"原创"形式发布,也不得已用于商业用途,本人不负责任何法律责任. 前一篇:http://blog.csdn.net/dba_huangzj/article/details/39548665 前言: SQL Ser

Chapter 3 Protecting the Data(3):创建和使用数据库角色

原版的:http://blog.csdn.net/dba_huangzj/article/details/39639365.专题文件夹:http://blog.csdn.net/dba_huangzj/article/details/37906349 未经作者同意,不论什么人不得以"原创"形式公布,也不得已用于商业用途.本人不负责不论什么法律责任. 前一篇:http://blog.csdn.net/dba_huangzj/article/details/39577861 前言: 数据库

Chapter 3 Protecting the Data(4):创建和使用应用程序角色

原文出处:http://blog.csdn.net/dba_huangzj/article/details/39927713,专题目录:http://blog.csdn.net/dba_huangzj/article/details/37906349 未经作者同意,任何人不得以"原创"形式发布,也不得已用于商业用途,本人不负责任何法律责任. 前一篇:http://blog.csdn.net/dba_huangzj/article/details/39639365 前言: 数据库角色用于

data文件夹权限修改

程序用FileOutputStream以及xml格式的ShardPreference生成的文件会存储在data文件夹下,可以AS顶部栏的Tools->Android->Android Device Monitor工具的file explore可以方便查看 但是,默认情况下data文件夹的权限是771,这个工具只有最后的1权限,也就是仅执行,这是个很蛋疼的权限,意味着你可以进入该文件夹下,但是既不能看该文件夹下有什么,也不能在这个文件夹下创建文件,因此我们不能在这样的情况下用此工具查看程序运行生

Spring data JPA 理解(默认查询 自定义查询 分页查询)及no session 两种处理方法

简介:Spring Data JPA 其实就是JDK方式的动态代理 (需要一个接口 有一大堆最上边的是Repository接口来自org.springframework.data.repository,还有CrudRepository接口及一个实现类SimpleJpaRepository),只要有接口就可以查询数据库了,实际上就是proxy的方法,具体查询的方法有两种一种是简单式就是方法名为findBy+属性名+(AndOrIsEquals等)另一种是自定义的方法就是属性名是瞎起的向abc xy

角色、权限、账户的概念理解-非常全的理论讲解权限控制

组织模型   资源模型  操作模型 谁能够执行哪些操作    执行资源的范围 资源概念资源就是想要的到的最终物质,我们可以给每一个资源定义一个权限,也可以给某一类资源定义一个权限 权限概念权限是对资源的一种保护访问.用户要访问A资源前提是用户必须有A资源的访问权限. 角色概念实事上我们不会直接把权限赋予给用户,而是通过角色来赋予给用户,因为用户拥有某一种权限是因为用户扮演着某一种角色.A 是 个经理,他管理着B公司,他拥有b,c,d的权限.实际是不是A有这个权限,而是因为Abo是经理.因为经理拥

android apk的签名和权限问题

一. android apk的签名问题(http://blog.csdn.net/lyq8479/article/details/6401093) 1.为什么要给Android应用程序签名?      如果只能用一句简单的话语来回答这个问题的话,我会说:“这是Android系统所要求的”.      Android系统要求每一个Android应用程序必须要经过数字签名才能够安装到系统中,也就是说如果一个Android应用程序没有经过数字签名,是没有办法安装到系统中的!Android通过数字签名来

《CS:APP》 chapter 2 Representing and Manipulating Information 笔记

Representing and Manipulating Information 首先,普及一下历史知识,原来十进制数都使用1000多年了...其实我真不知道...斐波拉契(Fibonacci)很屌的说(废话....) The familiar decimal, or base-10, representation has been in use for over 1000 years, having been developed in India, improved by Arab math

笔记 – SAP 用户权限学习

SAP 用户权限学习 一.SAP用户权限架构 SAP用户权限是通过Role(角色)来定义的, 从Role到最低层的最小控制单元Authorization field总共有4层,结构示意图如下. 涉及的常用T-code如下: SU20 维护authorization field SU21 维护authorization object(object按object class分类显示) PFCG 维护role SU02 / OOPR 维护authorization profile, 这2个code功能