先看下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;
(第十二章完)