对于数据库来说,安全性的重要程度不言而喻,今天咱们就来聊一聊Oracle的权限体系。sql
在此以前,先解释下一个容易混淆的概念:模式。所谓模式,指的是用户帐户所拥有的一组对象(好比表,索引,视图,同义词之类的)。数据库
因此严格意义上来说它跟帐户是不一样的概念,切莫混淆。 安全
建立一个帐户session
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表空间上使用的空间为100m SQL> profile my_profile --为该帐户指定一个配置文件,配置文件的做用会在后面提到 SQL> password expire ;--强制用户当即更改口令
上面列举了在建立帐户时的经常使用属性,用户名和身份验证(上面使用的是口令验证方式)是必须的属性,其余都是非必需的,若用户没有指定,通常会使用默认值。并发
固然,这些属性在后续也能够经过ALTER USER 命令进行修改,好比:ide
更新口令spa
SQL> alter user kobe identified by kobe321;
更改表空间 操作系统
SQL> alter user kobe default tablespace mytb;
使用户口令失效,强制其更新口令 对象
SQL> alter user kobe password expire;
锁定用户帐户 blog
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;--最高连续输错口令次数,以后帐户会被锁定
感兴趣还能够了解下其余的口令策略和控制资源使用配置,此处再也不赘述。
上面的帐户kobe建立了以后,是没法直接登入数据库的,由于它没有任何权限,来看看Oracle的权限体系是怎样的:
在Oracle中,权限分为两类,系统权限和对象权限。咱们能够经过GRANT 和 REVOKE 命令来对帐户进行权限的授予和撤回,通常这些操做会由DBA用户(SYS用户和SYSTEM用户)来执行
grant基本语法:grant privilege [,privilege....] to username;
系统权限一般容许用户执行影响数据字典或是影响数据库和实例的操做,好比建立会话,建立表,建立视图的权利(create table其实就是在数据字典中插入一条相应数据);
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依然拥有建表权限。
对象权限则是赋予用户可操纵一些数据库对象的权利,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保留着对象传递的记录。
若是对每个帐户手动一个个的授予权限,太过繁琐了,因此就引入了角色(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角色的权限,须要意识到这一点。
本文详细介绍了Oracle安全模型中的一些相关知识,包括用户帐户,系统权限,对象权限,角色等以及一些基本的语法。但愿能够帮到有须要的童鞋,谢谢支持。