对于数据库来讲,安全性的重要程度不言而喻,今天我们就来聊一聊Oracle的权限体系。
1.账户管理
在此之前,先解释下一个容易混淆的概念:模式。所谓模式,指的是用户账户所拥有的一组对象(比如表,索引,视图,同义词之类的)。
所以严格意义上来讲它跟账户是不同的概念,切莫混淆。
创建一个账户
SQL> create user kobe --用户名必须,不区分大小写SQL> identified by kobe123 --指定口令,除口令验证之外,还会有其他身份验证方式,如我们常用的操作系统身份验证:conn / as sysdba; 或者通过外部口令文件验证,或是委托给外部身份验证SQL> default tablespace users --为用户指定一个表空间,非必需,如果不指定,则为数据库默认表空间SQL> temporary tablespace temp --为用户指定临时表空间,非必需SQL> quota 100m on users --指定配额,意味着该账户可在users表空间上使用的空间为100mSQL> profile my_profile --为该账户指定一个配置文件,配置文件的作用会在后面提到SQL> password expire ;--强制用户立即更改口令
上面列举了在创建账户时的常用属性,用户名和身份验证(上面使用的是口令验证方式)是必须的属性,其他都是非必需的,若用户没有指定,一般会使用默认值。
当然,这些属性在后续也可以通过ALTER USER 命令进行修改,比如:
更新口令
SQL> alter user kobe identified by kobe321;
更改表空间
SQL> alter user kobe default tablespace mytb;
使用户口令失效,强制其更新口令
SQL> alter user kobe password expire;
锁定用户账户
SQL> alter user kobe account lock;
解锁用户账户
SQL> alter user kobe account unlock;
删除用户
SQL> drop user kobe; --该命令只有该账户下没有任何模式对象(表,视图等)才可删除成功,否则,可进行级联删除:SQL> drop user kobe cascade; --级联删除
配置文件:
前面我们在创建账户时提到的其他账户属性都很容易理解,一些童鞋对于配置文件的作用不是特别明了,这里简单介绍一下:
配置文件主要有两个作用:一是实施口令策略,(比如口令过期天数,口令输入最高连续错误次数),二是控制资源使用(需要RESOURCE_LIMIT实例参数的配合)
示例:
SQL> create profile my_profile --指定配置文件名称 SQL> limit session_per_user 10 --指定并发登录数,超过10个会阻塞新登录会话(要使该设置起作用,必须将RESOURCE_LIMIT设置为true)SQL> password_lift_time 7 --口令过期天数,过期后还可以使用,SQL> password_grace_time 1 --口令过期后仍可登录的天数,会提示用户更新口令SQL> failed_login_attempts 5;--最高连续输错口令次数,之后账户会被锁定
感兴趣还可以了解下其他的口令策略和控制资源使用配置,此处不再赘述。
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账户授予创建会话,创建表,创建视图,创建同义词的权限:
SQL> grant create session,create table,create view,create synonym to kobe;
权限可以进行级联传递:
1.DBA用户登入
SQL>conn / as sysdba;
2.为kobe账户授予建表权限:
SQL> grant create table to kobe with admin option;
3.kobe登入
SQL> conn kobe/kobe123;
4.kobe可将建表权限授予james
SQL> grant create table to james;
这样,james用户也就有了在自己的模式下建表的权限;
需要注意的是,系统权限的撤销不会级联。
5.以DBA身份登入,撤销kobe的建表权限:
SQL> revoke create table from kobe;
kobe的建表权限被撤销了,但通过它授予给james的建表权限不会被撤销,james依然拥有建表权限。
2.2对象权限
对象权限则是赋予用户可操纵一些数据库对象的权利,insert,delete,update,select ,或者执行PL/SQL对象。
基本语法:
grant privilege on [schema.]object to username [with grant option];
示例
1.kobe账户登入
SQL> conn kobe/kobe123;
2.为james账户授予kobe模式下的对象权限:
SQL> grant select on kobe.emp to james; --授予james在emp表的select权限;SQL> grant update(ename) on kobe.emp to james;--授予james对ename字段的更新权限;SQL> grant all on kobe.emp to james; --授予james在emp表上的所有对象权限;
对象权限也可以传递,比如:
1.kobe账户登入
SQL> conn kobe/kobe123;
2.为james账户授予其emp表下的所有对象权限 并允许james进行对象权限的传递:
SQL> grant all on kobe.emp to james with grant option;
3.james 用户登入
SQL> conn james/james123;
4.james将kobe模式下的emp表中的所有对象权限授予Iverson:
SQL> grant all on kobe.emp to iverson;
这样,iverson也拥有了对kobe下的emp表的所有对象权限,(select,insert ,update,delete 等等)
注意:对象权限不同于系统权限,撤销会级联撤销:
5.kobe账户撤销授予james表的对象权限:
SQL> revoke all on kobe.emp from james;
james在emp表上的所有权限将被撤销,同时,通过james传递给iverson的权限也将被撤销收回。这是因为Oracle保留着对象传递的记录。
3.角色管理:
如果对每一个账户手动一个个的授予权限,太过繁琐了,所以就引入了角色(role)的概念,角色其实就是一组权限的集合(包括系统权限和对象权限),通过为角色分配一组权限,再将角色授予用户以达到授权的目的。同时,为了应付不同场景,还可以临时激活和禁用角色。这样会使得权限管理更加的方便和灵活。如图:
Oracle中几个常见的预定义角色:
CONNECT:该角色在Oracle 11g版本中只拥有CREATE SESSSION的系统权限;
RESOURCE : 拥有创建数据库对象(table,view,synonym等)的权限;
DBA: 拥有大多数的系统权限
当然用户也可以自定义角色:
示例:
SQL> create role base_role; --创建角色SQL> grant create session,create table ,create view to base_role;--为该角色分配一些基础的系统权限SQL> grant all on kobe.emp to base_role; --赋予对象权限SQL> grant base_role to james;--将该角色赋予james
也可以为角色再分配角色
SQL> create role admin_role;SQL> grant dba to admin_role;
同时,角色也可以进行传递,同上面进行权限传递的语法是一致的,这里就不赘述了。
角色控制
默认情况下,为账户分配了角色,则默认就是启用状态,若要禁用,则可以这样做:
SQL> alter user james default role none;
若要启用:
SQL> alter user james default role base_role;
需要注意在Oracle中有个预定义的PUBLIC 角色,这个角色会始终分配给每个数据库用户账户,也就是说给public角色授予权限,就相当于将这些权限下放给了所有数据库用户账户,所以若有对于PUBLIC角色的权限,需要意识到这一点。
4.后记
本文详细介绍了Oracle安全模型中的一些相关知识,包括用户账户,系统权限,对象权限,角色等以及一些基本的语法。希望可以帮到有需要的童鞋,谢谢支持。