有关数据库安全性的SQL语句
⽂章⽬录
数据库安全性SQL语句
本篇⽂章记录了第⼗⼀次作业
使⽤的数据库是SQL Server,使⽤的数据库管理软件是SQL Server Management Studio.
 ⼤部分情况下,数据库中的数据是要通过互联⽹进⾏共享的。不共享的数据库可能像《三体》⾥⾯记录⼈类⽂明的墓地,那种为了保存⽽使⽤的数据库。那么既然要共享必然会有许多⽤户能够访问这⼀数据库,为了保护数据库内的数据不被不怀好意的⽤户恶意利⽤,数据库的安全性必然是数据库好坏的⼀个⼗分重要的⽅⾯。
 由于安全对数据库来说⼗分重要,数据库为此提供了层层保护措施。
 ⼀般来说,⼀名⽤户若是要访问数据库,DBMS会⾸先对这名⽤户进⾏⾝份鉴别。通过之后在SQL处理层会进⾏存取控制,也就是对⽤户使⽤数据库的权限的控制,也是这篇⽂章主要记录的内容。同时系统会对这些操作进⾏记录,作为审计的依据。在数据层⾯,系统会对数据以及传输过程进⾏加密,保证数据不会被泄露。还有其他的保护措施在此就不⼀⼀介绍了。
存储控制
 数据库的存储控制的主要功能就是让有资格的⽤户来访问数据库,也就是⼀种资格审查。这个机制主要有两部分,⼀部分是定义记录⽤户权限,另⼀部分是合法权限检查。它同时负责“发证”和检查“证件”。
 这种机制的实现有两种办法:⼀种是⾃主存取控制(Discretionary Access Control,DAC),另⼀种是强制存储控制(Mandatory Access Contrl,MAC).第⼀种⽅式⽐较灵活,⽽第⼆种⽅式⽐较严格,当然安全性也较⾼。
⾃主存取控制⽅法
 ⾃主存取控制⽅法它灵活在哪呢?它主要是靠对⽤户的灵活授权来实现的。⽐如它可以对某⼀⽤户授予查询权限⽽不授予其修改的权限,亦或者是授予其全部权限。根据对象的不同,⾃主存取可以授予其不同的权限。利⽤“⾓⾊”可以实现按照⽤户的类型来分类管理的功能,⼗分⽅便。
 我们⼀般使⽤SQL中的GRANT和REVOKE语句来实现权限的授予于收回。
GRANT语句
 GRANT语句⽤于向⽤户授予权限。其⼀般格式如下:
GRANT<;权限>[,<;权限>]...
ON<;对象类型><;对象名>[,<;对象类型><;对象名>]…
TO<⽤户>[,<⽤户>].../*可以授予PUBLIC,即全体⽤户*/
[WITH GRANT OPTION];
 WITH GRANT OPTION这个语句的意思是授予⽤户再授权的权⼒。⽐如说我给这名⽤户授予了“查询”权限,那么如果我加上了这⼀句话,这名⽤户就可以把“查询”这⼀权限授予其他⽤户。如果没有WITH GRAND OPTION则是不能把权限再授予其他⽤户的。不过这种授权不允许授予其授权者以及授权者的先祖。
[例 4.1] 把查询Student表权限授给⽤户U1
GRANT SELECT
ON TABLE Student
TO U1;
 说来挺尴尬哈,我第⼆⾏在测试的时候少打了个TABLE。然后SQL Server那边是通过的,刚刚检查才发现这个问题。当我把TABLE加上去后直接报错…那么解决办法就是不加TABLE了SQL Server这边应该能⾃动识别(⼤概吧)。
 下图是DBMS中U1的属性,可以看到在选择(SELECT)这⼀栏打上了⼀个勾。第⼀个框表明有这种权限,第⼆框是可以再授予权限,也就是加上WITH GRANT OPTION,第三个框是拒绝。这表明我们成功给U1授予了SELECT权限。
[例 4.2] 把对Student表和Course表的全部权限授予⽤户U2和U3
&emsp;这⾥要新建⽤户U2,U3。于是我按照之前创建U1的步骤那样做,但是报错。批量更新sql语句
这⾥是由于我选择了和U1同样的登录名。那⾏吧,我再创建⼏个呗。
CREATE LOGIN U3
WITH PASSWORD='123';
CREATE USER U3 FROM LOGIN U3;
 这是建⽴了⼀个叫U3的⽤户名,并利⽤它建⽴了⼀个新⽤户U3。⽬前看来好像能⽤,有没有啥隐患我还不知道,先将就着⽤吧…
 回归正题,这个例⼦按标准SQL应该这样写:
GRANT ALL PRIVILEGES
ON TABLE Student,Course
TO U2,U3;
 去掉TABLE之后显⽰:“,”附近有语法错误。⾏吧,你逗号出错是什么⿁?可能是不⽀持⼀块⼉写吧。试试分开写:
GRANT ALL PRIVILEGES
ON Student
TO U2,U3;
GRANT ALL PRIVILEGES
ON Course
TO U2,U3;
 这⾥的提⽰表⽰微软不推荐再使⽤ALL来授权,这⾥只有便于兼容。那么⽤户是否被授予了全部权限呢?我打开属性⼀看,授予了⽤户更新、删除、选择、插⼊和引⽤的权限,还有⼀些权限并有授予,⽐如更改权限。所以这应该称不上是ALL,顶多算个“BASIC”吧(笑。
[例 4.3] 把对表SC的查询权限授予所有⽤户
GRANT SELECT
ON TABLE SC /*T-SQL请去掉TABLE*/
TO PUBLIC;
 这题告诉我们了全体⽤户是PUBLIC,⽐较简单,也很给我⾯⼦没有报错,hh.
[例 4.4] 把查询Student表和修改学⽣学号的权限授给⽤户U4
GRANT UPDATE(Sno),SELECT/*对属性列授权时必须明确相应的属性列名*/
ON TABLE Student /*去掉TABLE*/
TO U4;
 很给⼒,直接成功_(:з」∠)_
[例 4.5] 把对表SC的INSERT权限授予U5⽤户,并允许他再将此权限授予其他⽤户
 这明显就是说的我们之前讲的WITH GRANT OPTION嘛,直接加上就完事⼉了。
GRANT INSERT
ON TABLE SC
TO U5
WITH GRANT OPTION;
[例 4.6]-[例 4.7] 传播权限
GRANT INSERT/*U5将权限授予U6*/
ON TABLE SC
TO U6
WITH GRANT OPTION;
GRANT INSERT/*U6将权限授予U7,U7不可再授予*/
ON TABLE SC
TO U7;
 这两题就是展⽰WITH GRANT OPTION的实例,不过实际上如果你直接再SQL Server中输⼊的话,还是dbo(默认的⽤户)授予的权限。这⾥需要使⽤到AS语句。
也就是这样:
GRANT INSERT/*U5将权限授予U6*/
ON SC
TO U6
WITH GRANT OPTION AS U5;
GRANT INSERT/*U6将权限授予U7,U7不可再授予*/
ON SC
TO U7 AS U6;
 可以看到这⾥U7的权限授予者变为了U6,否则就是默认的dbo。
REVOKE语句
 授予了权限当然也可以收回,我们⽤REVOKE语句来收回权限。语句的⼀般格式如下:
REVOKE<;权限>[,<;权限>]...
ON<;对象类型><;对象名>[,<;对象类型><;对象名>]…
FROM<⽤户>[,<⽤户>]...[CASCADE|RESTRICT];
 ⼤体上跟GRANT语句类似,不过把TO改成了FROM,另外后⾯可能会加上CASCADE or RESTRICT,这俩怎么⽤我们碰到具体题⽬再说。
[例 4.8] 把⽤户U4修改学⽣学号的权限收回
REVOKE UPDATE(Sno)/*注意这⾥要加上具体属性名*/
ON TABLE Student
FROM U4;
[例 4.9] 收回所有⽤户对表SC的查询权限
REVOKE SELECT
ON TABLE SC
FROM PUBLIC;
 同授予全部⽤户SC表查询权限操作类似。
[例 4.10] 把⽤户U5对SC表的INSERT权限收回
 这⾥要注意的是U5对SC表的INSERT权限不仅仅只有U5,还有他授予的U6以及U6授予的U7,这时候就要使⽤CASCADE了。
REVOKE INSERT
ON TABLE SC
FROM U5 CASCADE;
 经过测试,所有相关的权限都收回了。
 可见,⽤户可以“⾃主”地决定将数据的存取权限授予何⼈、决定是否也将“授权”的权限授予别⼈因此称这样的存取控制是⾃主存取控制。
数据库⾓⾊
 数据库⾓⾊是被命名的⼀组与数据库操作相关的权限,⾓⾊是权限的集合。因此可以为⼀组具有相同权限的⽤户创建⼀个⾓⾊,使⽤⾓⾊来管理数据库权限可以简化授权的过程。整体上我觉得这⼀块就像⾯向对象程序设计⾥⾯的class,可以批量授予或者收回权限,⽐较⽅便。
1、⾓⾊创建
 创建⾓⾊的SQL语句格式是:
CREATE  ROLE  <⾓⾊名>
 但是这样的⾓⾊是空的,没有任何内容,所以我们需要⽤GRANT来为⾓⾊授权。
2、给⾓⾊授权
 语句格式如下:
GRANT<;权限>[,<;权限>]…
ON<;对象类型>对象名
TO<⾓⾊>[,<⾓⾊>]…
 只是把⽤户改成了⾓⾊,其他基本⼀样。
3、将⼀个⾓⾊授予其他的⾓⾊或⽤户
格式如下:
GRANT<⾓⾊1>[,<⾓⾊2>]…
TO<⾓⾊3>[,<⽤户1>]…
[WITH ADMIN OPTION]

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。