Chapter 3 Protecting the Data(1):理解权限
未经作者同意,任何人不得以“原创”形式发布,也不得已用于商业用途,本人不负责任何法律责任。
前一篇: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 所影响的表的引用。
下一篇:http://blog.csdn.net/dba_huangzj/article/details/39577861
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 ...
- Chapter 3 Protecting the Data(3):创建和使用数据库角色
原版的:http://blog.csdn.net/dba_huangzj/article/details/39639365.专题文件夹:http://blog.csdn.net/dba_huangzj ...
- Chapter 3 Protecting the Data(4):创建和使用应用程序角色
原文出处:http://blog.csdn.net/dba_huangzj/article/details/39927713,专题目录:http://blog.csdn.net/dba_huangzj ...
- 织梦在服务器上面安装的时候一直提示data文件没有权限,可我已经写了权限,还是提示
1.进入服务器,打开IIS,点击相应无权限的文件夹data,然后点击右上角的编辑权限. 2.勾选写入,然后确定即可. 3.织梦一直收到黑客的攻击,这里建议站长朋友设置下权限,来降低织梦系统的危险系数. ...
- Clean Code – Chapter 6 Objects and Data Structures
Data Abstraction Hiding implementation Data/Object Anti-Symmetry Objects hide their data behind abst ...
- spring data redis 理解
前言 Spring Data Redis project,应用了Spring概念来开发使用键值形式的数据存储的解决方案.我们(官方)提供了一个 "template" ,这是一个高级 ...
- Redis(八):spring data redis 理解
前言 Spring Data Redis project,应用了Spring概念来开发使用键值形式的数据存储的解决方案.我们(官方)提供了一个 "template" ,这是一个高级 ...
- Spring data JPA 理解(默认查询 自定义查询 分页查询)及no session 三种处理方法
简介:Spring Data JPA 其实就是JDK方式(还有一种cglib的方式需要Class)的动态代理 (需要一个接口 有一大堆接口最上边的是Repository接口来自org.springfr ...
- SQL Server扫盲系列——安全性专题——SQL Server 2012 Security Cookbook
由于工作需要,最近研究这本书:<Microsoft SQL Server 2012 Security Cookbook>,为了总结及分享给有需要的人,所以把译文公布.预计每周最少3篇.如有 ...
随机推荐
- Python小代码_13_生成两个参数的最小公倍数和最大公因数
def demo(m, n): if m > n: m, n = n, m p = m * n while m != 0: r = n % m n = m m = r return (int(p ...
- 吴恩达深度学习第2课第2周编程作业 的坑(Optimization Methods)
我python2.7, 做吴恩达深度学习第2课第2周编程作业 Optimization Methods 时有2个坑: 第一坑 需将辅助文件 opt_utils.py 的 nitialize_param ...
- python读取文本文件数据
本文要点刚要: (一)读文本文件格式的数据函数:read_csv,read_table 1.读不同分隔符的文本文件,用参数sep 2.读无字段名(表头)的文本文件 ,用参数names 3.为文本文件制 ...
- python 类属性.方法 实例的基本用法
class man(): classify = "people"# 全局属性 def __init__(self,name,age,value,):#类方法 self.name = ...
- Response ServletContext 中文乱码 Request 编码 请求行 共享数据 转发重定向
Day35 Response 1.1.1 ServletContext概念 u 项目的管理者(上下文对象),服务器启动时,会为每一个项目创建一个对应的ServletContext对象. 1.1.2 ...
- 分享一个二维码图片识别控制台程序Demo
怎么用NuGet和配置log4net就不介绍了,直接上代码(QRDecodeDemo.zip). (Visual Studio 2015 下的项目,用的.NET Framework 4.5.2) 吐槽 ...
- Docker基本架构
Docker 采用了 C/S架构,包括客户端和服务端. Docker daemon 作为服务端接受来自客户的请求,并处理这些请求(创建.运行.分发容器). 客户端和服务端既可以运行在一个机器上,也可通 ...
- [Angular2]eclipse中angular2开发环境的搭建
本文作者:苏生米沿 本文地址:http://blog.csdn.net/sushengmiyan 环境准备 1.eclipse neon 2.网络连接 插件地址 eclipse的插件市场地址: htt ...
- 这一次,VR离我们真的很近
从高考作文开始 今年号称是VR元年,虽然目前VR还没能像手机一样走进千家万户,但关于VR设备的关讨论是层出不穷.而今年高考,浙江省的作文题就与VR相关.网上购物.视频聊天等在 ...
- 集成JPA+springmvc+spring+EJB中的Java EE应用
EJB是sun的JavaEE服务器端组件模型,设计目标与核心应用是部署分布式应用程序.凭借java跨平台的优势,用EJB技术部署的分布式系统可以不限于特定的平台.EJB (Enterprise Jav ...