1)權限,角色和用戶的關係
權限(privilege):Oracle數據庫預先定義好的、執行某些操作的能力。
角色(role):一組相關權限的集合。可以利用角色來簡化權限的管理。
用戶(user):通過給用戶授予適當的權限或角色,用戶就能夠登錄數據庫,在數據庫中執行特定的DDL和DML操作。通過回收權限或角色,就能減少用戶對數據庫的操作能力。
按照權限所針對的控制對象,可以將其分爲系統權限、對象權限。
系統權限(system privilege):指在系統級控制數據庫的存取和使用的機制,即執行某種SQL語句的能力。如,是否能啓動、停止數據庫,是否能修改數據庫參數,是否能連接到數據庫,是否能創建、刪除、更改方案對象(如表、索引、視圖、過程)等。它一般是針對某一類方案對象或非方案對象的某種操作的全局性能力。
例如,擁有SELECT ANY DICTIONARY權限,則可以查詢數據字典中的以"DBA_"開頭的數據字典視圖。
GRANT SELECT ANY DICTIONARY TO SCOTT;
REVOKE SELECT ANY DICTIONARY FROM SCOTT;
擁有CREATE SESSION權限,才能夠登陸數據庫。
對象權限(object privilege):指在對象級控制數據庫的存取和使用的機制,即訪問其他用戶的方案對象的能力。如,用戶可以存取哪個用戶的方案中的哪個對象,是否能對該對象進行查詢、插入、更新等。對象權限一般是針對其他用戶的某個特定的方案對象的某種操作的局部性能力。
例如,一般一個用戶不能訪問其他用戶的對象,例如,MYUSER用戶不能查詢用戶SCOTT用戶的A表
GRANT SELECT ON A TO MYUSER;
但如果SCOTT用戶將A表的SELECT對象權限授予MYUSER後,MYUSER用戶就可以查詢SCOTT用戶的A表,但還是不能做任何更改操作。
應用程序、用戶、權限、角色、數據庫之間的關係如圖所示。
可以用GRANT語句將系統權限、對象權限授予指定的用戶、角色或者PUBLIC公共用戶組。(PUBLIC公共用戶組是一個在創建數據庫時,就被自動創建的用戶組。該用戶組有什麼權限,數據庫中所有用戶就有什麼權限。可以利用這個特點,將公共權限授予數據庫中所有的用戶。)
權限的授予是可以傳遞的,已經具有某種權限的用戶可以將他們的權限或其中一部份權限再授予或傳遞給其他用戶。(在獲取該權限時使用了WITH ADMIN OPTION選項(對於系統權限),或使用了WITH GRANT OPTION選項(對於對象權限),或該用戶本身就具有GRANT ANY PRIVILEGE系統權限。)
可以使用REVOKE語句來回收系統權限和對象權限。
用戶的權限信息被保存在數據字典中。
2)系統權限
可以通過SYSTEM_PRIVILEGE_MAP數據字典視圖來查詢Oracle數據庫中的所有系統權限。
SELECT * FROM SYSTEM_PRIVILEGE_MAP; --所有系統權限,包括sysdba或sysoper系統權限
如果要授予系統權限,則用戶必須具有此權限並且得到該系統權限時也得到了WITH ADMIN OPTION選項。
用戶回收別的用戶的系統權限時候,必須本身具有此係統權限,並且該系統權限上,得到了WITH ADMIN OPTION選項。
回收系統權限不會級聯。
系統權限總的來說,一類是針對方案對象的,一類是針對非方案對象的。
針對方案對象的系統權限分爲具有ANY關鍵字的(如 CREATE ANY TABLE)和不具有ANY關鍵字的(如CREATE TABLE)。
具有ANY關鍵字的系統權限表示可以在任何用戶方案中進行操作(如在任何用戶方案中都可以創建表);
不具有ANY關鍵字的系統權限表示只在自己的方案中進行操作(如在自己的方案中可以創建表)。
一般地,應該給數據庫管理員授予帶有ANY關鍵字的系統權限,以便其管理所有用戶的方案對象。但不應該將其授予普通用戶,以防其影響其他用戶的工作。
針對非方案對象的系統權限都沒有ANY關鍵字,如CREATE TABLESPACE。因爲它們只與數據庫管理中全局的、唯一的數據庫維護操作有關,而與局部的、非唯一的方案對象操作無關,如表空間是針對數據庫的全局的概念,不是針對哪個用戶的局部的概念。
爲了保護數據字典基礎表的安全,Oracle提供了數據字典基礎表的保護機制。對數據字典基礎表的訪問只侷限於擁有SYSOPER或SYSDBA系統權限的用戶。並提供了一個初始化參數 O7_DICTIONARY_ACCESSIBILITY來控制普通用戶對數據字典基礎表的訪問。
ALTER SYSTEM SET O7_DICTIONARY_ACCESSIBILITY=TRUE SCOPE=SPFILE; --需重啓數據庫使生效
O7_DICTIONARY_ACCESSIBILITY=TRUE時,一個具有ANY TABLE系統權限的用戶可以訪問sys用戶的對象,包括數據字典基礎表。O7_DICTIONARY_ACCESSIBILITY=FALSE時,一個具有ANY TABLE系統權限的用戶就只能訪問除sys用戶之外的其他用戶的對象,也就無權訪問數據字典基礎表。
通過設置O7_DICTIONARY_ACCESSIBILITY=FALSE,並將SELECT ANY DICTIONARY系統權限授予非sys用戶,既可以使其能查詢數據字典視圖和動態性能視圖,又可以使其不能訪問數據字典基礎表。(此時,sys用戶連接到數據庫時必須指定AS SYSOPER或AS SYSDBA選項,否則不需要)
查看系統權限:
SELECT * FROM DBA_SYS_PRIVS; --授予給所有用戶和角色的系統權限
SELECT * FROM USER_SYS_PRIVS; --授予給當前用戶的系統權限
SELECT * FROM USER_ROLE_PRIVS; --授予給當前用戶的角色(或FROM DBA_ROLE_PRIVS WHERE GRANTEE=...)
SELECT * FROM ROLE_SYS_PRIVS; --此視圖包含了授予給當前用戶的角色的系統權限的信息
SELECT * FROM SESSION_PRIVS; --當前會話可以使用的系統權限(包括直接授予的和通過角色授予的系統權限)
SELECT * FROM SESSION_ROLES;--當前會話可以使用的角色。包括嵌套授權的角色。例如將DBA角色授予了一個用戶,DBA角色已經被授予的角色(例如SELECT_CATALOG_ROLE等)也會被查詢出來
--一般情況下,下面2條語句執行結果是等價的
1. SELECT DISTINCT(PRIVILEGE) FROM ROLE_SYS_PRIVS UNION SELECT DISTINCT(PRIVILEGE) FROM USER_SYS_PRIVS;
2. SELECT PRIVILEGE FROM SESSION_PRIVS;
SELECT * FROM SYSTEM_PRIVILEGE_MAP; --所有系統權限,包括sysdba或sysoper系統權限
SELECT * FROM V$PWFILE_USERS; --所有被授予sysdba或sysoper系統權限的用戶信息
3)對象權限
Oracle數據庫中總共有9種不同的對象權限。不同類型的對象有不同的對象權限。有些對象(如集羣、索引、觸發器、數據庫連接)沒有對應的對象權限,即他們是通過系統權限來控制的,例如,如要修改集羣,用戶必須要具有ALTER ANY CLUSTER系統權限。
如果是自己創建的對象,則具有該對象的所有對象權限。
如果要授予對象權限,則該對象必須是自己方案中的對象,或得到該對象權限時也得到了WITH GRANT OPTION選項。
WITH GRANT OPTION選項不能被授予角色。
授權者只能從自己授權的用戶那裏回收對象權限。
用戶不能有選擇性地回收列權限,必須首先回收該對象權限,然後再將合適的列權限授予用戶。
假如基於一個對象權限創建了過程、視圖,那麼回收該對象權限後,這些過程、視圖將變爲無效。
回收對象權限會級聯。
1. Alter(更改)
表上的ALTER權限保證在相關的表上執行ALTER TABLE或LOCK TABLE語句。可以重命名錶、添加列、刪除列、更改數據類型和列的長度,以及把錶轉換成一個分區(partitioned)表。
序列上的ALTER權限可以保證能夠在相關序列上執行ALTER SEQUENCE語句,可以重設授權序列對象的最小值、增量和緩衝區大小
2. Delete(刪除)
允許在授權對象上執行DELETE語句,以便從表或者視圖中刪除行。SELECT權限必須隨同DELETE權限授予,否則被授權的人將不能夠選擇行,因此也就無法刪除行。DELETE權限還允許被授權者鎖定相應的表
3. Execute(運行)
包上的EXECUTE權限允許被授權者執行或者使用在相應的包規定中聲明的任何程序或者程序對象。
操作符(operator)或者類型(type)上的EXECUTE權限允許在SQL或者PL/SQL中使用該操作符。
數據庫對象上的EXECUTE權限允許被授權者使用相關的數據庫對象並且調用其方法。
4. Index(索引)
允許被授權者在相關的表上創建索引或者鎖定該表。
當一個方案(schema)擁有一個表而另一個方案擁有其索引的時候,會出現混亂。在授予這種權限時要小心。
5. Insert(插入)
允許被授權者在相關的表或視圖中創建行。
如果該INSERT權限建立在相關表或者視圖的特定列上,則只能在具有INSERT權限的列上插入數據。
INSERT權限還隱含地給被授權者以鎖定該表的能力
6. Read(讀)
只能在目錄上授予。
允許被授權者讀取指定目錄中的BFILE。
Read權限與SELECT權限有區別,後者允許用戶讀取一個表或者視圖。
7. Reference(引用)
只能在表上授予用戶,而不能授予角色。
允許被授權者創建引用該表的參照完整性約束。被授權者可以鎖定該表。
8. Select(選擇)
允許被授權者在表或者視圖上執行SELECT語句。
允許被授權者讀取表或者視圖的內容。
SELECT權限只能授予整個表,不能授予表中的列。因此,如果希望用戶只能查詢表中的部分列,就需要在該表上創建視圖,然後將該視圖的SELECT權限授予用戶。
序列上的SELECT權限允許被授權者獲取當前值(CURRVAL)或者通過選擇NEXTVAL增大該值。
9. Update(更新)
允許被授權者更改表或者視圖中的數據值。SELECT權限必須隨同UPDATE權限一起授予,這樣就使被授權者隱含具有了鎖定表的能力。
10. All(所有)
對於可以具有多項權限的對象,可以授予或者撤消專門的權限ALL。
例如,對於表而言,ALL中包含了SELECT、INSERT、UPDATE和DELETE以及INDEX、ALTER和REFERENCE。所以,在表上授予AIL權限時要小心,因爲可能並不想授予INDEX、ALTER和REFERENCE權限。
對象、對象權限的對應關係如下:
對象 |
對象權限 |
||||||||
Alter 更改 |
Delete 刪除 |
Execute 運行 |
Index 索引 |
Insert 插入 |
Read 讀 |
Reference 引用 |
Select 選擇 |
Update 更新 |
|
Directory目錄 |
√ | ||||||||
Function函數 |
√ |
||||||||
Procedure子程序 |
√ |
||||||||
Package包 |
√ |
||||||||
DB Object數據庫對象 |
√ |
||||||||
Library庫 |
√ |
||||||||
Operator操作符 |
√ |
||||||||
Sequence序列 |
√ |
√ |
|||||||
Table表 |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
||
Type類型 |
√ |
||||||||
View視圖 |
√ |
√ |
√ |
查看用戶對象權限:
視圖 |
說明 |
DBA_TAB_PRIVS ALL_TAB_PRIVS USER_TAB_PRIVS |
DBA視圖包含了數據庫中所有用戶或角色的對象權限 ALL視圖包含了當前用戶或PUBLIC的對象權限 USER視圖列出當前用戶的對象權限 |
DAB_COL_PRIVS ALL_COL_PRIVS USER_COL_PRIVS |
DBA視圖描述了數據庫中的所有用戶或角色的列對象權限 ALL視圖描述了當前用戶或PUBLIC是其所有者、授予者或被授予者的,所有的列對象權限 USER視圖描述了當前用戶是其所有者、授予者或被授予者的,所有的列對象的權限 |
ALL_COL_PRIVS_MADE USER_COL_PRIVS_MADE |
ALL視圖列出了當前用戶是其所有者、授予者的,所有的列對象權限 USER視圖描述了當前用戶是其授予者的,所有的列對象權限 |
ALL_COL_PRIVS_RECD USER_COL_PRIVS_RECD |
ALL視圖描述了當前用戶或PUBLIC是其被授予者的,所有的列對象的權限 USER視圖描述了當前用戶是其被授予者的所有的列對象的權限 |
ALL_TAB_PRIVS_MADE USER_TAB_PRIVS_MADE |
ALL視圖列出了當前用戶所做的所有的對象授權或者是在當前用戶所擁有的對象上的授權 USER視圖列出了當前用戶所做的所有對象上的授權 |
ALL_TAB_PRIVS_RECD USER_TAB_PRIVS_RECD |
ALL視圖列出了當前用戶或PUBLIC是被授予者的對象權限 USER視圖列出了當前用戶是被授予者的對象權限 |
ROLE_TAB_PRIVS |
包含了授予角色的對象權限。它提供的只是該用戶可以訪問的角色的信息 |
4)用戶
可以通過以下數據字典視圖來查詢用戶信息。
SELECT * FROM DBA_USER;
SELECT * FROM ALL_USERS;
SELECT * FROM USER_USERS;
5)安全策略
Oracle 8i中引入了虛擬專用數據庫(Virtual Private Database,VPD)的概念。只要將這個概念與安全應用環境(application context)(也稱爲應用上下文)相結合,就能實現精細訪問控制。只需制定出相應的安全策略(security policy),就能對每個用戶所能訪問的數據進行控制。只需要在數據庫服務器上創建一次安全策略就可以了。無論用戶採用何種連接方式(如通過應用程序、通過SQL*Plus),安全策略都會起作用,並且安全策略對用戶是透明的。
可以利用數據字典視圖查詢安全策略:
DBA_POLICIES,ALL_POLICIES,USER_POLICIES
可以啓用/禁用、刪除安全策略(利用DBMS_RLS包)。