先看下Oracle数据库的安全保护是怎么做的:
首先,用户向DB提供身份识别信息(也就是账号/密码),在确定该信息是正确的前提下、DB再判断该用户所拥有的权限,给予其相应的操作权限。
其次,Oracle采用了传统的权限->角色->用户模式来给最终用户授予权限,也就是先把权限集定义为一个角色,再把角色赋给用户;这样既方便了维护,也一定程度上提高了安全性。Oracle也允许直接把某些权限赋给最终用户,但除非是测试环境,否则不推荐这样做。
这里的权限,大体可以分为系统权限(如connect、ALTER SYSTEM等)和对象权限(也就是具体操作表、视图的权限,如select,update等)。
一、角色管理
1. 角色相关的数据字典:
数据库列上的所有权限:DBA_COL_PRIVS
数据库对象上的所有权限:DBA_TAB_PRIVS
已经授予用户或其他角色的角色:DBA_ROLE_PRIVS
已授予用户或角色的系统权限,或者查看某个角色包含哪些权限:DBA_SYS_PRIVS
系统特权数据目录:system_privilege_map
查看当前连接用户的所有有效角色:
select * from session_roles;
查看某个角色包含哪些权限:
select * from dba_sys_privs where grantee = 'ROLE_NAME';--ROLE_NAME要大写
2. Oracle 11g的预置角色:
(1)connect包含的权限:
alter session,create cluster,create database link,create sequence,create session,create synonym,create table,create view
(2)resource包含的权限:
create cluster,create indextype,create operator,create procedure,create sequence,create table,create trigger,create type
(3)DBA包含所有权限
(4)EXP_FULL_DATABASE包含的权限:
select any table,backup any table,execute any procedure,execute any type,administer resource manager
(5)IMP_FULL_DATABASE包含的权限:
execute_catalog_role,select_catalog_role
此外还有很多,可以通过查询DBA_ROLES知道该版本的Oracle中包含哪些预置角色
3. 创建自定义角色和授权
(1)创建角色:
create role role_name [ not identified | identified by [ password | exeternally | globally] ]
·identified by password:使用该角色时需提供密码验证
·identified by exeternally:OS验证
·identified by globally:Oracle安全域中心服务器验证
例:
create role designer identified by exeternally;
(2)将权限赋给角色:
grant right1,right2,... to role_name;
例:
grant create view,create table to designer;
4. 管理角色
(1)取消角色使用时的密码:
alter role role_name not identified;
修改角色密码:
alter role role_name identified by new_password;
(2)角色的生效:
假如某个用户同时具备了若干个角色r1,r2,r3.那么如果r1不生效的话,则该用户同样无法使用r1包含的权限。
最大可生效的角色数有MAX_ENABLED_ROLES决定:
show parameter MAX_ENABLED_ROLES;
设置角色生效并带有密码:
set role role_name identified by password;
(3)修改角色中的权限:
继续像已存在的角色添加新的权限:
grant new_right1,new_right2,... to exist_rolename;
回收某角色中的权限:
revoke exist_r1,exist_r2,... on schema.object from role_name;
(4)设置当前用户要生效的角色:假如不使用户具有的角色生效,那么用户同样不能使用这些权限
set role role_name [identified by passwd];
(5)删除角色:
drop role role_name;
二、用户管理
1. 创建用户:
create user user_name identified by passwd--用户名和密码尽量用字母数字和#_号,使用其他符号的话,在写sql脚本时容易和shell、C++、java等语法冲突
[or identified exeternally]
[or identified globally as 'CN=user']
[default tablespace tablespace_name]] --指定该用户所在的默认表空间
[temporary tablespace tablespace_name] --指定该用户使用的临时表空间
[quota [integer k[m] [unlimited] on tablespace_1]--指定在tablespace_1上允许占用的最大空间
[,quota [integer k[m] [unlimited] ] on tablespace_2]--以此类推
...
[profiles profile_name] --该用户使用的资源文件的名称,不指定的话默认为default,一般默认即可
[account lock or account unlock] --该用户是否加锁,不常用,一般默认不加;如果想用这个功能,需要事先在PROFILE文件里设置该功能,详见下文
例:
create user xk identified by xkdefault tablespace tb_3
temporary tablespace TEMP_TEST
quota 10m on tb_3;
*注意,如果不适用quota语句,那么 该用户在此表空间上的配额为0,虽然它是可选的...
2. 修改用户:
(1)修改磁盘限额:
当oracle报错ORA-01536时,表示该用户在磁盘上的限额已满,需要扩充
alter user user_name quota 20m on tablespace_name;
(2)修改用户密码:
alter user user_name identified by 123456;
(3)解锁用户:
alter user ORACLE_OCM account unlock;
(4)删除用户:
drop user user_name cascade;--将用户下面的对象也一并删除
(5)给用户授权:与给角色授权类似
grant role_name, right_name to user_name [with admin option];
*with admin option:表示被授权的用户A有权把自己得到的角色二次授权给自己新建的用户B(如果它可以新建用户的话),即使A的某项权限被收回,B仍然可以使用这种权限
(6)回收用户权限:与回收角色权限类似
revoke role_name, right_name from user_name;
三、profile(资源配置文件,又叫用户配置文件)管理
profile文件,可以理解成是密码限制、资源限制等规则的集合;管理员可以通过它来为用户配置解锁/锁定条件、设置密码过期时间等安全策略,它是Oracle安全策略的重要组成部分。
1. 显示PROFILE信息:
显示资源配置文件的资源配置信息:select * from dba_profile where profile='(select profile from dba_users where username='user_name')';
如果查不出来,表示没有为该用户配置安全策略
2. 使用PROFILE管理密码:
(1)账户锁定:
--设置一个连续登陆失败5次、将被锁定7天的配置名lock_account(也就是profile名,地位相当于default)
failed_login_attempts 5
password_lock_time 7;
--将这个配置分配给某个用户
alter user user_name profile lock_account;
(2)密码过期时间:
create profile password_lift_time limit
password_life_time 30 --密码有效期为30天
password_grace_time 3; --表示到期前3天提醒
alter user user_name profile password_lift_time;
(3)密码历史:有两个参数可以实现
PASSWORD_REUSE_TIME:指定密码可重用的时间,单位为天
PASSWORD_REUSE_MAX:旧口令在可以重用前、必须改变的次数
如:超过一分钟,并且密码变更次数超过三后,密码可以重用
CREATE PROFILE sec_profile LIMIT
PASSWORD_REUSE_TIME 1/1440
PASSWORD_REUSE_MAX 3;
又如:PASSWORD_REUSE_TIME设置为unlimited,不做限制,PASSWORD_REUSE_MAX为3
ALTER PROFILE sec_profile LIMIT
PASSWORD_REUSE_TIME unlimited
PASSWORD_REUSE_MAX 3;
(4)密码复杂度:PASSWORD_VERIFY_FUNCTION
这里需要用到验证码复杂度的规则函数,Oracle 11g默认的规则校验函数(verify_function_11G)在下面位置:
app\Administrator\product\11.2.0\client_1\RDBMS\ADMIN\utlpwdmg.sql
我们只需要把这个函数配给PASSWORD_VERIFY_FUNCTION即可
ALTER PROFILEprofile_name LIMIT
PASSWORD_VERIFY_FUNCTION verify_function_11G;
当然,我们也可以自己改写这个函数。(但是记得备份文件/(ㄒoㄒ)/~~)
3. 使用PROFILE管理资源
首先要将下面参数置为true
show parameter resource_limit;
alter system set resource_limit=true;
创建和修改此类 profile文件的语法和上面完全一致
(1)某个用户可以同时连接的会话数:
SESSION_PER_USER
(2)某用户一次可以使用的CPU时间,单位是1/100秒:
CPU_PER_SESSION
(3)每条sql语句能使用的CPU时间,单位是1/100秒:
CPU_PER_CALL
(4)限制每个回话所能读取的数据块数量,单位为“个”
LOGICAL_READS_PER_SESSION
(5)限制每个用户所能连接到数据库的最长时间
CONNECT_TIME
(6)限制每个用户回话所能连接到数据库的最长时间
IDLE_TIME
4. 删除profile文件
drop profile profile_name cascade;
(第十二章完)