Oracle角色管理
oracle的安全管理不仅可以通过对不同用户进行权限授予与撤销(revoke命令),但是在涉及到多张表和多个用户时,这样操作会造成工具量剧增;此外,一旦为用户授予某一权限则该用户在所有环境中均具有该权限,无法限制在特定环境中授予用户活动状态的权限。因此,oracle还提供了角色管理,角色是一组系统权限和对象权限,可以对一个用户进行批量权限授予。
使用以下命令可以创建一个角色:
SQL> create role db_mgr1; 角色已创建。
可以通过以下命令为角色授予特定的对象权限(即对某一些用户所拥有模式对象的CRUD操作权限):
SQL> grant select on scott.emp to db_mgr1; 授权成功。
表明db_mgr1角色将具有scott.emp表对象的select权限,随后将这个角色授予给一个特定的用户:yanh;
SQL> grant db_mgr1 to yanh; 授权成功。 SQL> conn yanh/oracle@orcl; 已连接。 SQL> select * from scott.emp; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- ---------- --------- ---------- -------------- ---------- ---------- ---------- 7369 SMITH CLERK 7902 17-12月-80 3388 20
此时,使用yanh账户连接数据库将可以对scott.emp表进行查询操作,若执行insert、update、delete(DML)操作,则会出现权限不足的情况:
SQL> edit; 已写入 file afiedt.buf 1 insert into scott.emp(empno,ename,job,sal,hiredate) 2* values('1234','helen','Mgr','8000',sysdate) SQL> / insert into scott.emp(empno,ename,job,sal,hiredate) * 第 1 行出现错误: ORA-01031: 权限不足
在oracle数据库中,拥有很多预先定义的角色,常见的有:
1)connect,在oracle11g中,这个角色只拥有Create session权限,其存在仅仅是为了向后兼容,先前版本中还具有创建数据存储对象的系统权限。
2)resource,这个角色具有创建数据对象(表、视图、索引等)和过程对象(PL/SQL程序片段),还具有unlimited tablespace权限。
3)dba,拥有大多数系统权限,包含多个对象权限和角色,授予dba角色的用户可以管理数据库的大部分功能。
4)select_catalog_role,拥有针对数据字典对象的多个对象权限,没有系统权限也没有针对用户数据的权限。
5)schedule_admin,拥有用于管理调度服务的调度程序作业所需的系统权限。
6)public,数据库预定义的角色,在每一个用户创建时都会授予该权限。如果将某一个对象的对象权限授予给public角色,如:
SQL> grant select on scott.dept to public; 授权成功。
则所有用户都能查询到scott.dept表。
可以使用以下SQL查询某个用户具有的角色权限:
SQL> select * from dba_role_privs where grantee='YANH'; GRANTEE GRANTED_ROLE ADM DEF ------------------------------ ------------------------------ --- --- YANH DB_MGR1 NO YES
以上结果表明,用户yanh在登录数据库服务器时即启用db_mgr1角色,拥有该角色的一切管理职能。可以使用alter命令来更改特定用户的登录启用角色:
SQL> grant connect to yanh; 授权成功。 SQL> alter user yanh default role connect; 用户已更改。 SQL> select * from dba_role_privs where grantee='YANH'; GRANTEE GRANTED_ROLE ADM DEF ------------------------------ ------------------------------ --- --- YANH DB_MGR1 NO NO YANH CONNECT NO YES
此时,用户yanh在登录时会启用connect角色,并不具有db_mgr1角色下的表数据管理职能。通过set role命令可以指定用户的角色,这样还不算安全,因为用户可以选择手动执行该命令:
SQL> select * from scott.emp; select * from scott.emp * 第 1 行出现错误: ORA-00942: 表或视图不存在 SQL> set role db_mgr1; 角色集 SQL> select * from scott.emp; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- ---------- --------- ---------- -------------- ---------- ---------- ---------- 7369 SMITH CLERK 7902 17-12月-80 3388 20
若使用以下语法来创建角色:
SQL> create role db_mgr identified using time_chk; 角色已创建。
这表明db_mgr角色在启动时,必须调用time_chk存储过程,在这个过程调用中可以执行多次安全检查:例如时间合法性校验、网段校验等等,示例的存储过程代码如下:
create or replace procedure time_chk(errcd out varchar2) is invalid_time exception; begin if to_char(sysdate,'HH24') not in('08','09','10','11','12','13','14','15','16','17','18') then errcd:='not work time!'; raise invalid_time; end if; exception when invalid_time then RAISE_APPLICATION_ERROR(-20001,errcd); when others then RAISE_APPLICATION_ERROR(-20001,'other error'); end time_chk;