第六章 【用户】【角色】【权限】
对于数据库来讲,安全性的重要程度不言而喻,今天我们就来聊一聊Oracle的权限体系。
1.账户管理
在此之前,先解释下一个容易混淆的概念:模式。所谓模式,指的是用户账户所拥有的一组对象(比如表,索引,视图,同义词之类的)。
所以严格意义上来讲它跟账户是不同的概念,切莫混淆。
创建一个账户
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
上面列举了在创建账户时的常用属性,用户名和身份验证(上面使用的是口令验证方式)是必须的属性,其他都是非必需的,若用户没有指定,一般会使用默认值。
当然,这些属性在后续也可以通过ALTER USER 命令进行修改,比如:
更新口令
1 |
|
更改表空间
1 |
|
使用户口令失效,强制其更新口令
1 |
|
锁定用户账户
1 |
|
解锁用户账户
1 |
|
删除用户
1 2 3 |
|
配置文件:
前面我们在创建账户时提到的其他账户属性都很容易理解,一些童鞋对于配置文件的作用不是特别明了,这里简单介绍一下:
配置文件主要有两个作用:一是实施口令策略,(比如口令过期天数,口令输入最高连续错误次数),二是控制资源使用(需要RESOURCE_LIMIT实例参数的配合)
示例:
1 2 3 4 5 6 7 8 9 |
|
感兴趣还可以了解下其他的口令策略和控制资源使用配置,此处不再赘述。
2.权限管理
上面的账户kobe创建了之后,是无法直接登入数据库的,因为它没有任何权限,来看看Oracle的权限体系是怎样的:
在Oracle中,权限分为两类,系统权限和对象权限。我们可以通过GRANT 和 REVOKE 命令来对账户进行权限的授予和撤回,一般这些操作会由DBA用户(SYS用户和SYSTEM用户)来执行
grant基本语法:grant privilege [,privilege....] to username;
2.1系统权限:
系统权限通常允许用户执行影响数据字典或是影响数据库和实例的操作,比如创建会话,创建表,创建视图的权利(create table其实就是在数据字典中插入一条相应数据);
Oracle中常用的权限:
CREATE SESSION:创建会话,若账户没有改权限,则无法连接数据库并创建会话;
CREATE TABLE :创建表,并拥有该表的一系列操作,更改表,删除表及DML命令等;
CREATE TABLESPACE:创建表空间,允许用户自行管理表空间,包括创建和删除表空间;
ALTER DATABASE:更改数据库,允许执行一些修改数据库物理结构的命令,eg:alter database datafile 4 offline;
ALTER SYSTEM : 更改系统,允许用户调整实例参数和内存结构,eg:alter system set processes=1500 scope = spfile;
CREATE ANY TABLE : 创建其他表,允许为其他用户建表(create table 只能为自己建表,而create any table可为其他用户建表)
......
示例:
为kobe账户授予创建会话,创建表,创建视图,创建同义词的权限:
1 |
|
权限可以进行级联传递:
1.DBA用户登入
1 |
|
2.为kobe账户授予建表权限:
1 |
|
3.kobe登入
1 |
|
4.kobe可将建表权限授予james
1 |
|
这样,james用户也就有了在自己的模式下建表的权限;
需要注意的是,系统权限的撤销不会级联。
5.以DBA身份登入,撤销kobe的建表权限:
1 |
|
kobe的建表权限被撤销了,但通过它授予给james的建表权限不会被撤销,james依然拥有建表权限。
2.2对象权限
对象权限则是赋予用户可操纵一些数据库对象的权利,insert,delete,update,select ,或者执行PL/SQL对象。
基本语法:
grant privilege on [schema.]object to username [with grant option];
示例
1.kobe账户登入
1 |
|
2.为james账户授予kobe模式下的对象权限:
1 2 3 4 5 |
|
对象权限也可以传递,比如:
1.kobe账户登入
1 |
|
2.为james账户授予其emp表下的所有对象权限 并允许james进行对象权限的传递:
1 |
|
3.james 用户登入
1 |
|
4.james将kobe模式下的emp表中的所有对象权限授予Iverson:
1 |
|
这样,iverson也拥有了对kobe下的emp表的所有对象权限,(select,insert ,update,delete 等等)
注意:对象权限不同于系统权限,撤销会级联撤销:
5.kobe账户撤销授予james表的对象权限:
1 |
|
james在emp表上的所有权限将被撤销,同时,通过james传递给iverson的权限也将被撤销收回。这是因为Oracle保留着对象传递的记录。
3.角色管理:
如果对每一个账户手动一个个的授予权限,太过繁琐了,所以就引入了角色(role)的概念,角色其实就是一组权限的集合(包括系统权限和对象权限),通过为角色分配一组权限,再将角色授予用户以达到授权的目的。同时,为了应付不同场景,还可以临时**和禁用角色。这样会使得权限管理更加的方便和灵活。如图:
Oracle中几个常见的预定义角色:
CONNECT:该角色在Oracle 11g版本中只拥有CREATE SESSSION的系统权限;
RESOURCE : 拥有创建数据库对象(table,view,synonym等)的权限;
DBA: 拥有大多数的系统权限
当然用户也可以自定义角色:
示例:
1 2 3 4 5 6 7 |
|
也可以为角色再分配角色
1 2 3 |
|
同时,角色也可以进行传递,同上面进行权限传递的语法是一致的,这里就不赘述了。
角色控制
默认情况下,为账户分配了角色,则默认就是启用状态,若要禁用,则可以这样做:
1 |
|
若要启用:
1 |
|
需要注意在Oracle中有个预定义的PUBLIC 角色,这个角色会始终分配给每个数据库用户账户,也就是说给public角色授予权限,就相当于将这些权限下放给了所有数据库用户账户,所以若有对于PUBLIC角色的权限,需要意识到这一点。
4.后记
本文详细介绍了Oracle安全模型中的一些相关知识,包括用户账户,系统权限,对象权限,角色等以及一些基本的语法。