對於數據庫來說,安全性的重要程度不言而喻,今天咱們就來聊一聊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安全模型中的一些相關知識,包括用戶帳戶,系統權限,對象權限,角色等以及一些基本的語法。但願能夠幫到有須要的童鞋,謝謝支持。