對於數據庫來講,安全性的重要程度不言而喻,今天我們就來聊一聊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表空間上使用的空間為100m SQL> 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安全模型中的一些相關知識,包括用戶賬戶,系統權限,對象權限,角色等以及一些基本的語法。希望可以幫到有需要的童鞋,謝謝支持。