用戶和許可權是Oracle資料庫系統最基本的安全管理機制。 用戶通過SQL*Plus或者應用程式登錄Oracle時,必須提供一個脹號,即用戶名和口令。登錄後還必須有一定的許可權才能完成相應的操作。用戶具有什麼樣的許可權,才能完成什麼樣的操作。 如果用戶希望訪問資料庫,首先應該由資料庫管理員為其分配一個賬號 ...
用戶和許可權是Oracle資料庫系統最基本的安全管理機制。
用戶通過SQL*Plus或者應用程式登錄Oracle時,必須提供一個脹號,即用戶名和口令。
登錄後還必須有一定的許可權才能完成相應的操作。
用戶具有什麼樣的許可權,才能完成什麼樣的操作。
如果用戶希望訪問資料庫,首先應該由資料庫管理員為其分配一個賬號,然後再為它指定一定的許可權,這樣用戶才能完成相應的操作。
資料庫管理員還可以通過PROFILE對用戶使用口令及系統資源的情況進行控制。
用戶管理
用戶是一個資料庫對象,是一系列資料庫對象和許可權的統稱。
用戶所有的操作預設在自己的模式下進行,模式是一個用戶所擁有的資料庫對象的集合,每個用戶都有自己的模式,用戶與模式之間是一一對應的,模式的名字與用戶名相同。
例如, SCOTT 用戶的模式為SCOTT,
在這個模式中包含了用戶SCOTT擁有的所有資料庫對象,包括表、視圖、索引、存儲程式等。
用戶的資料庫對象和數據分佈在表空間中,每個用戶都有預設的表空間。
預設的表空間在創建用戶時指定,如果不指定,那麼SYSTEM表空間將被指定為該用戶的預設表空間。
資料庫中有哪些用戶
在Oracle資料庫中有三類用戶,一類是sysdba ,一類是sysoper ,第三類是普通用戶。
其中
前兩類用戶稱之為特權用戶,它們擁有對所有資料庫對象的一切許可權,包括資料庫本身。
sys 用戶同時具有sysdba和sysoper兩種許可權,它在創建資料庫時自動產生,不需要手工創建。
特權用戶的口令一方面存放在資料庫中,另一方面存儲在口令文件中。
如果為一個普通用戶指定了sysdba或sysoper許可權,那麼這個用戶也將成為特權用戶。
特權用戶的信息可以從動態性能視圖v$pwfile_users 中獲得。
一個用戶只要具有這兩種許可權,就可以以“ as sysdba ”或者“ as sysoper”的方式登錄資料庫伺服器。
例如:
sqlplus scott/tiger as sysdba
如果用戶以“ as sysdba” 方式登錄資料庫伺服器,那麼他將成為sys 用戶。
如果以“ as sysoper”的方式登錄,那麼他將成為PUBLIC用戶。
這兩種許可權的範圍大小是不一樣的,例如,如果一個用戶以“ as sysdba”方式登錄,那麼他可以無條件地訪問任何用戶的數據,例如:
sqlplus scott/tiger as sysdba
select * from userl.tl;
如果一個用戶以“as sysoper”方式登錄,那麼他是不能訪問其他用戶的數據的。
在後面的內容中,將對這兩種許可權進行詳細的比較。
普通用戶一般由sys用戶創建,這類用戶的許可權比較小,一般只限於訪問自己模式中的資料庫對象。
普通用戶如果希望對資料庫進行其他的訪問,就需要具有相應的許可權。
如何創建用戶
資料庫系統在運行的過程中,往往要根據實際需求創建用戶,然後為用戶指定適當的許可權。
創建用戶的操作一般只能由sys 用戶完成,如果普通用戶也要創建用戶,必須具有一個系統許可權,即CREATE USER 。
創建用戶的命令是CREATE USER ,創建用戶所包含的內容包括為用戶指定用戶名、口令、預設表空間、存儲空間配額等。
其中用戶名是代表用戶賬號的標識符,它的命名規則是:
·必須以字母開始。
·長度為l ~ 30 個字元。
·從第二個字元開始,可以包括大小寫字母、數字、一、$和#等字元。
.大寫和小寫是相同的。
用來創建用戶的CREATE USER命令的完整語拉格式為:
CREATE USER 用戶名 IDENTIFIED BY "口令"
DEFAULT TABLESPACE 表空間
TEMPORARY TABLESPACE 臨時表空間
QUOTA 空間配額大小 ON 表空間
PASSWORD EXPIRE
ACCOUNT LOCK | UNLOCK
其中DEFAULT TABLESPACE用來為用戶指定預設表空間,如果不指定,那麼SYSTEM表空間將被指定為這個用戶的預設表空間。
如果不特別指定,用戶創建的表、索引等資料庫對象就位於預設表空間中。
為了提高資料庫的性能,同時為了方便管理數據, Oracle建議為用戶指定一個預設表空間。
TEMPORARY TABLESPACE用於為用戶指定臨時表空間。
在一個資料庫中可以創建多個臨時表空間,為每個用戶可以指定不同的臨時表空間。
還可以把多個臨時表空間組織為一個表空間組,把這個表空間組作為整個資料庫或者某個用戶的預設臨時表空間。
QUOTA子句用於為用戶在表空間上指定空間配額。
儘管為用戶指定了預設表空間,但是用戶在這個表空間上還不能創建資料庫對象,因為它在這個表空間上沒有可支配的存儲空間。
空間配額以位元組、KB 、MB等為單位,還可以指定為UNLIMITED ,即無限制的空間配額。
如果希望用戶在所有表空間上都具有無限制的空間配額,只要為其指定UNLIMITED TABLESPACES系統許可權即可。
PASSWORD EXPIRE用於指定用戶的口令過期,用戶在第一次登錄資料庫伺服器時必須修改自己的口令。
在創建用戶賬號時,用戶的初始口令是由管理員指定的。
如果以口令過期的方式強迫用戶修改自己的口令,這樣將使用戶的賬號更加安全。
ACCOUNT子句用於指定用戶賬號的狀態,如果為UNLOCK ,這個用戶就能夠登錄資料庫伺服器,這是預設設置。
如果為LOCK ,則為鎖定狀態。
例如,下麵的CREATE語句用於創建用戶user1,併為其指定相關屬性:
CREATE USER user1 IDENTIFIED BY "123"
DEFAULT TABLESPACE users
TEMPORARY TABLESPACE temp
QUOTA 100M ON users
PASSWORD EXPIRE
ACCOUNT LOCK;
如何在創建用戶時沒有指定QUOTA大小可以在後面添加:
例如:
alter user user1 quota 10M on users;
alter user user1 quota unlimited on users;
grant unlimited tablespace to user1;
用戶被創建之後,還沒有任何許可權,甚至不能登錄資料庫,只有當sys用戶為它指定了一定的許可權後,它才能對資料庫進行訪問。
用戶的相關信息可以從數據字典視圖dba_users 中獲得。
例如,下麵的SELECT語句用於查詢當前資料庫中所有用戶的名稱、口令、預設表空間和賬號狀態等信息:
SELECT username, password, account_status, default_tablespace FROM dba_users WHERE username='USER1';
在列出的用戶中,包括特權用戶、資料庫預創建的用戶和剛剛手工創建的用戶。
用戶的口令都是經過加密的,在較早版本的資料庫中,可以顯示加密的口令,在現在的版本中不顯示口令。
如果不特別指定,用戶的預設表空間是SYSTEM表空間。
如何修改用戶的信息
為了防止不法之徒盜取用戶的口令,用戶應該經常改變自己的口令。
用戶的口令不應該是類似1234 、abed這樣簡單的字元串,更不要指定為自己生日和姓名,也不要指定為一個英文單詞,因為這樣的口令很容易被破譯。
一個好的口令應該包括大小寫字母、數字、_、&、%、$等各種符號在內的混合字元串。
統計表明,一個口令中包含的成分越複雜,就越難破譯。
修改用戶口令的操作一般由用戶自己完成, sys用戶可以無條件修改任何一個用戶的口令。
普通用戶只能修改自己的口令,如果要修改其他用戶的口令,必須具有ALTER ANY USER這個系統許可權。
修改用戶口令的命令是ALTER USER 。
修改用戶口令的ALTER USER命令格式為:
ALTER USER 用戶名 IDENTIFIED BY "新口令";
例如,將剛纔創建的用戶user1的口令改為“ book ”,對應的ALTER USER語句為:
ALTER USER user1 IDENTIFIED BY "book";
除了SQL命令ALTER USER 以外, SQL*Plus也提供了一個PASSWORD命令,可以用來修改用戶的口令。
利用SQL*Plus 的這條命令, sys用戶可以修改其他用戶的口令,普通用戶可以修改自己的口令,在授權的情況下也可以修改其他用戶的口令。
一個用戶在修改自己的口令時,必須知道自己以前的口令。
這條命令只有一個參數,就是用戶名,如果預設了這個參數,就修改自己的口令。
以下是用戶scott修改自己的口令的情況:
PASSWORD scott
Al,TER USER命令除了修改用戶口令外.還可以修改用戶的預設表空間、存儲空間配額、賬號狀態等信息。
例如, 下麵的語句用於鎖定用戶scott:
ALTER USER scott ACCOUNT LOCK;
下麵的語句用於修改用戶user1預設表空間、臨時表空間,並將該用戶在表空間users上的空間配額修改為無限制:
ALTER USER userl
DEFAULT TABLESPACE tsl
TEMPORARY TABLESPACE tsl
QUOTA UNLIMITED ON tsl;
如何刪除用戶
一個用戶不再訪問資料庫系統時,應該將這個用戶及時地從資料庫中刪除,否則可能會有安全隱患。
一個更好的做法是先將這個用戶鎖定,過一段時間如果確定這個用戶不再需要,再將其刪除。
刪除用戶的操作一般由sys用戶完成,也可以由具有DROP USER許可權的用戶來完成。
一個用戶被刪除後,這個用戶本身的信息,以反它所擁有的資料庫對象的信息都將從數據字典中被刪除。
刪除用戶的命令是DROP USER 。
這條命令的語法格式為:
DROP USER 用戶名;
例如,要刪除用戶USER2,可以執行下麵的DROP USER語句:
DROP USER user2;
需要註意的是,如果在一個用戶的模式中已經包含一些資料庫對象,那麼這個用戶是不能被直接刪除的,在刪除用戶時系統將顯示類似以下的信息:
ORA-01922: 必須指定 CASCADE 以刪除 'USER1'
出現錯誤信息的原因是在用戶USER1的模式中包含某些資料庫對象,所以不能直接刪除。
如果要強制刪除用戶,可以在DROP USER命令中使用CASCADE選項,這樣用戶以及所擁有的資料庫對象將一起被刪除。
例如,刪除用戶scott可以執行下麵的語句:
DROP USER user1 CASCADE;
用戶的許可權管理
Oracle資料庫對用戶的許可權有著嚴密的規定,如果沒有許可權,用戶將無法完成任何操作,甚至不能登錄資料庫。
例如,剛剛創建的用戶user1在試圖登錄資料庫時,將看到以下錯誤信息:
ORA-01045: user USER1 lacks CREATE SESSION privilege; logon denied
也就是說,用戶若要登錄資料庫,必須具有CREATE SESSION許可權。
用戶許可權有兩類,即系統許可權和對象許可權。
系統許可權主要是指對資料庫對象的創建、刪除、修改的許可權,對資料庫進行創建、備份等許可權,而對象許可權主要是指對資料庫對象中的數據的訪問許可權。
系統許可權一般由sys用戶指定,也可以由具有特權的其他用戶授予。
對象許可權一般由資料庫對象的所有者授予用戶,也可以由sys用戶指定,或者由具有該對象許可權的其他用戶授予。
系統許可權的管理
系統許可權是與資料庫安全有關的最重要的許可權,這類許可權一般是針對資料庫管理員的。
系統許可權的管理主要包括許可權的分配、回收和查詢等操作。
Oracle 11g提供了200餘種系統許可權,下表 列出了與用戶有關的最重要的幾種系統許可權。
對於表、視圖、會話、用戶、觸發器這些資料庫對象,有關的系統許可權包括創建、刪除和修改它們的許可權,相關的命令分別是CREATE 、DROP和ALTER 。
表、視圖、觸發器、存儲程式等對象是與用戶有關的,在預設情況下對這些對象的操作都是在當前用戶自己的模式下進行的。
如果要在其他用戶的模式下操作這些類型的對象,需要具有對應的ANY許可權。
例如,要能夠在其他用戶的模式下創建表,當前用戶必須具有CREATE ANY TABLE系統許可權,如果希望能夠在其他用戶的模式下刪除表,必須具有DROP ANY TABLE 系統許可權等。
系統許可權一般有三種授予者,一種是sys用戶,即資料庫管理員,這是最主要的一種授予者,大部分的系統許可權管理工作都由sys用戶完成。
第二種是具有特權的普通用戶,普通用戶一旦具有了sysdba或者sysoper特權,也可以管理系統許可權。
第三種是被授予了某種系統許可權的用戶,系統允許它把所擁有的系統許可權再授予其他用戶。
為用戶授予許可權的GRANT命令的語法格式為:
GRANT 許可權列表 TO 用戶列表 WITH ADMIN OPTION;
GRANT命令執行後,所有指定用戶都將獲得指定的許可權。
如果希望把一個許可權授予所有用戶,可以用PUBLIC代替所有的用戶名。
選項“ WITH ADMIN OPTION”的功能是使得許可權的獲得者可以再將許可權授予其他用戶。
例如,剛剛創建用戶userl 時,這個用戶沒有任何許可權。
如果把CREATE SESSION許可權授予這個用戶,那麼這個用戶就可以登錄資料庫了。
如果再把CREATE TABLE許可權授予這個用戶,那麼他就可以在自己的模式中創建表了。
授予這兩個許可權的語句為:
GRANT CREATE SESSION, CREATE TABLE TO user1;
用戶在登錄資料庫系統後應該可以創建表了,但是當這個用戶在自己的模式中創建表時,
將遇到以下的錯誤:
ORA-01950: 對錶空間 'USERS' 無許可權
出錯的原因是當前用戶在他的預設表空間中沒有空間配額,即沒有可以使用的存儲空間,所以無法創建表。
這時需要為該用戶指定空間配額,或者為這個用戶指定UNLIMITED TABLESPACE系統許可權。
所以為了使一個用戶可以操作資料庫,至少應該把上述三個許可權授予這個新用戶。
例如, 下列的授權語句使得所有用戶都可以使用無限制的磁碟空間:
GRANT UNLIMITED TABLESPACE TO PUBLIC;
如果將ALTER USER的系統許可權授予某用戶,那麼它就可以修改其他用戶的信息。
現在考察下列許可權操作的語句序列 :
CONN / AS SYSDBA
GRANT ALTER USER TO user1;
CONN user1/123
ALTER USER scott IDENTIFIED BY new_tiger;
如果上述語句都執行成功,那麼用戶scott的口令將被修改為“new_tiger”。
首先以特權用戶sys登錄,並將系統許可權ALTER USER授予用戶userl。
然後以用戶userl 登錄,這個用戶就可以修改其他用戶的信息了。
回收系統許可權的命令是REVOKE ,這條命令一般由SYS 用戶執行。
普通用戶如果要回收其他用戶的許可權,則他必須具有“GRANT ANY PRIVILEGE”這個系統許可權。
如果一個用戶在接受某個系統許可權時是以“ WITH ADMIN OPTION ”方式接受的,他隨後又將這個系統許可權授予了其他用戶,那麼他也可以將這個系統許可權從其他用戶回收。
REVOKE的語法格式為:
REVOKE 系統許可權列表 FROM 用戶列表;
如果要從所有用戶回收某個系統許可權,可以用PUBLIC代替所有的用戶名。
這裡的系統許可權也是有PUBLIC授予的。
例如,要將剛纔授予用戶user1的系統許可權CREATE SESSION和CREATE TABLE 回收,可以執行下麵的REVOKE語句:
REVOKE CREATE SESSION, CREATE TABLE FROM user1;
這樣,用戶USER1就不能登錄資料庫,更不能創建表了。
需要註意的是系統許可權可以轉授,但是回收時不能間接回收。
假設有三個用戶,第一個用戶將某個系統許可權以“WITH ADMIN OPTION”的方式授予第二個用戶,第二個用戶又將這個許可權授予第三個用戶,那麼當第一個用戶從第二個用戶回收這個許可權時,並不能同時從第三個用戶回收這個許可權,第三個用戶這時仍然具有這個許可權。
現在考慮下列許可權操作的語句序列:
CONN AS sysdba
GRANT CREATE SESSION,CREATE TABLE TO user1 WITH ADMIN OPTION;
CREATE USER user2 IDENTIFIED BY "1234";
CONN user1/1234
GRANT CREATE SESSION,CREATE TABLE TO user2;
CONN sys/1234 AS sysdba
REVOKE CREATE SESSION,CREATE TABLE FROM user1;
CONN user2/1234
SELECT * FROM user_sys_privs
對象許可權的管理
對象許可權主要是對資料庫對象中的數據的訪問許可權,這類許可權主要是針對普通用戶的。
下表列出了最主要對象許可權。
SELECT 、INSERT 、DELETE和UPDATE許可權分別是指對資料庫對象中的數據的查詢、插入、刪除和修改的許可權。
對於表和視圖來說,查詢和刪除操作是整行進行的,而插入和修改卻可以在一行的某個列上進行,所以在指定許可權時, SELECT和DELETE許可權只要指定所要訪問的表就可以了,而INSERT和UPDATE許可權還可以進一步指定是對哪個列的許可權。
REFERENCES許可權是指可以與一個表建立關聯關係的許可權,如果具有了這個許可權,當前用戶就可以通過自己的一個表中的外鍵,與對方的表建立關聯。
關聯關係是通過主鍵和外鍵進行的,所以在授予這個許可權時,可以指定表中的列,也可以不指定。
EXECUTE許可權是指可以執行存儲函數、存儲過程和程式包的許可權。
有了這個許可權,一個用戶就可以執行另一個用戶的存儲程式。
當一個用戶獲得另一個用戶的某個對象的訪問許可權後,以“用戶名.對象名”的形式訪問這個資料庫對象。
一個用戶所擁有的對象和可以訪問的對象是不同的,這一點在數據字典視圖中也有所反映。
在預設情況下用戶可以直接訪問自己模式中的資料庫對象,但是要訪問其他用戶所擁有的對象,就必須具有相應的對象許可權。
例如,用戶user1要查詢用戶scott的表emp 中的數據,就必須具有對錶emp的SELECT許可權。
從數據字典視圖user_objects 中可以獲得當前用戶所擁有的全部資料庫對象的信息,而從數據字典視圖all_objects 中則可以獲得當前用戶所能訪問的全部對象的信息。
對象許可權的授予一般由對象的所有者完成,也可以由sys用戶,或者由具有某對象許可權的用戶授予,但最好由對象的所有者完成。
授予對象許可權的命令是GRANT ,回收許可權的命令是REVOKE ,與系統許可權的操作相比,這兩條命令有些不同的地方。
授予對象許可權的GRANT命令語法格式為:
GRANT 對象許可權列表 ON 對象名 TO 用戶列表 WITH GRANT OPTION;
在授予對象許可權時,不僅要說明是什麼許可權,還要指定是對哪個對象的訪問許可權,這是與系統許可權的授予不同的地方。
例如,假設當前用戶是scott ,下麵的語句將表emp 的SELECT許可權授予用戶userl 和user2:
GRANT SELECT ON emp TO user1, user2;
如果要將某個對象許可權授予所有用戶,可以用PUBLIC 代替所有的用戶名。
用戶訪問其他用戶的對象時,需要用對方的用戶名限定對象。
例如,用戶user1訪問emp表的語句為:
SELECT * FROM scott.emp;
如果沒有SELECT許可權,用戶在查詢其他用戶的一個表時,將遇到“ORA-00942:表或視圖不存在”這樣的錯誤。
如果在為用戶指定某個對象許可權時使用了“ WlTH GRANT OPTION ”選項,那麼這個用戶在接受了這個許可權後,可以再將這個許可權授予其他的用戶。
假設當前用戶是scott ,考察下麵的許可權操作語句:
GRANT SELECT ON emp TO user1 WITH GRANT OPTION;
conn user1/123
GRANT SELECT ON scott.emp TO user2;
conn user2/1234
SELECT * FROM scott.emp;
對於INSERT和UPDATE兩個對象許可權,還可以進一步指定是在表中的哪個列上具有訪問許可權,也就是說,可以規定其他用戶可以對錶中的哪個列進行插入和修改操作。
例如,假設當前用戶是scott ,下麵的語句將表emp 中對列empno的插入許可權和sal 列的修改許可權授予用戶user1和user2:
GRANT INSERT(empno), UPDATE(sal) ON emp TO user1, user2;
這樣用戶user1和user2就可以對錶emp的列empno進行插入訪問,對sal 列進行修改訪問,而對其他列沒有任何訪問許可權。
EXECUTE許可權是指可以執行一個用戶所擁有的存儲函數、存儲過程和程式包的許可權,假設當前用戶創建了-個存儲函數function1,通過下麵的語句可以把對這個函數的執行許可權授予用戶user1;
GRANT EXECUTE ON function1 TO user1;
REFERENCES許可權是指其他用戶的表可以與當前用戶的表建立關聯關係的許可權。
假設當前用戶有一個表,在這個表的某個列上建立了主鍵約束。
如果把這個表的REFERENCES 許可權授予其他用戶,那麼其他用戶就可以通過外鍵將自己的表與這個表建立關聯關係,也就是可以引用這個表中的主鍵列的值。
假設當前用戶是scott ,在表dept的deptno列上建立了主鍵約束。
假設用戶scott要將表dept 上的deptno 列的REFERENCES 許可權授予用戶user1,可以執行下麵的GRANT語句:
GRANT REFERENCES(deptno) ON dept TO user1;
這樣用戶user1就可以創建一個表,在表上指定一個外鍵,並且與表dept上的deptno列建立關聯關係,或者修改一個已經存在的表,在表上指定一個外鍵,同樣可以建立這種關聯關係。
例如:
CREATE TABLE test(deptno NUMBER REFERENCES scott.dept(deptno));
回收對象許可權的命令是REVOKE 。
一般回收對象許可權的操作由許可權的授予者完成。
這條命令的語法格式為:
REVOKE 對象許可權列表 ON 對象名 FROM 用戶列表;
如果要回收與某個資料庫對象有關的所有對象許可權,可以用ALL代替許可權列表。
例如,用戶scott要從用戶user1回收對錶emp的所有許可權,可以執行下麵的REVOKE語句:
REVOKE ALL ON emp FROM user1;
如果要從所有用戶回收某個對象許可權,可以用PUBLIC代替所有用戶的名稱。
需要註意的是,許可權INSERT 、UPDATE和REFERENCES在分配時可以指定相關的列,但是在回收時不能指定列,而只能指定表名。
例如,用戶scott要從用戶user2 回收對錶emp 中sal 列上的UPDATE許可權,下麵的語句是錯誤的:
REVOKE UPDATE(deptno) ON dept FROM user2;
正確的寫法是:
REVOKE UPDATE ON dept FROM user2;
如果某個對象許可權是以“WITH GRANT OPTION ”方式授予一個用戶的,那麼這個用戶可以將這個許可權再授予其他用戶。
在從這個用戶回收對象許可權時,也將同時從其他用戶回收,
這一點也是與系統許可權不同的。
例如,假設當前用戶scott將表emp 的SELECT許可權以“ WITHGRANT OPTION ”方式授予了用戶user1, user1又將這個許可權授予了用戶user2 ,那麼當用戶
scott從用戶userl 回收這個許可權時,同時將這個許可權從用戶user2 回收。
許可權信息的查詢
用戶的系統許可權和對象許可權信息,都可以從數據字典視圖中獲得。
與系統許可權有關的數據字典視圖包括: system_privilege_map 、dba_sys_privs 、user_sys_privs和session_privs 。
其中從視圖system_priviege_map中可以獲得當前資料庫中已經定義的所有系統許可權。
例如,下麵的語句可以列出資料庫中所有的系統許可權:
SELECT name FROM system_privilege_map;
SYS 用戶可以從數據字典視圖dba_sys_privs 中查詢任何用戶所具有的系統許可權,而普通用戶可以從數據字典視圖user_sys_privs 中查詢自己所擁有的系統許可權。
例如,下麵的SELECT語句查詢用戶scott所擁有的系統許可權:
SELECT grantee, privilege, admin_option FROM dba_sys_privs WHERE grantee='SCOTT';
其中列 grantee 指的是許可權的被授予者, privilege列表示許可權名稱, admin_option列表示是否允許用戶再將這個許可權授予其他用戶。
又如,假設當前用戶是scott ,下麵的查詢語句列出了當前用戶所擁有的系統許可權:
SELECT username, privilege, admin_option FROM user_sys_privs;
這條語句與上面一條語句的執行結果是相同的。
從數據字典視圖session_privs 中可以查詢一個用戶在當前會話中所具有的系統許可權。
如果分別從字典視圖session_privs和user_sys_privs 中查詢一個用戶所具有的系統許可權,我們會發現查詢結果並不相同。
這是因為,從user_sys_privs 中查詢到的系統許可權是用戶直接獲得的系統許可權,即sys用戶通過GRANT命令授予當前用戶的系統許可權。
而從字典視圖session_privs到的系統許可權不僅包括該用戶直接獲得的許可權,還包括該用戶從角色中間接獲得的系統許可權。
與系統許可權一樣,對象許可權的信息也可以從數據字典視圖中查詢。
與對象許可權有關的數據字典視圖包括以下幾個: dba_tab_privs 、dba_col_privs 、user_tab_privs和user_col_privs。
其中從dba tab_privs查詢任何用戶所具有的對象許可權。
例如,下列的SELECT語句查詢用戶user1所具有的對象許可權:
SELECT grantee,privilege,grantor,table_name,grantable FROM dba_tab_privs
WHERE grantee='USER1' ;
在另一個數據字典dba_col_privs 中記錄了用戶在列上的許可權。
如果REFERENCES 許可權、INSERT許可權和UPDATE 許可權在授予時沒有指定具體的列,那麼它們將被記錄在數據字典dba_tab_privs 中。
如果涉及了具體的列,這些列的信息可以從數據字典視圖dba_col_privs 中查詢。
例如,下麵的SELECT語句查詢user1所具有的列許可權:
SELECT grantee,table_name,column_name,privilege,grantor,grantable
FROM dba_col_privs
WHERE grantee='user1';
上面兩個數據字典視圖只能由sys用戶查詢,或者由具有特權的用戶查詢。
如果一個普通用戶想查看自己所具有的對象許可權,可以從另外兩個數據字典視圖user_tab_privs和user_col_privs中查詢。
例如,假設當前用戶是scott ,下麵的SELECT語句將查詢這個用戶所具有的全部對象許可權:
SELECT grantee,table_name,column_name,privilege,grantor,grantable
FROM user_col_privs;
角色的管理
角色是一組許可權的集合,使用角色的目的是使許可權管理更加方便。
假設有10 個用戶,這些用戶為了訪問資料庫,最少應該具有CREATE SESSION 、CREATE TABLE 、UNLIMITETABLESPACE等幾個系統許可權。
如果將這些許可權分別授予這些用戶,那麼需要進行的授權次數是比較多的。
但是如果把這些許可權事先放在一起,然後作為一個整體授予這些用戶,那麼每個用戶只需一次授權,授權的次數將大大減少,而且用戶數越多,需要指定的許可權越多,這種授權方式的優越性就越明顯。
這些事先組合在一起的一組許可權就是角色,角色中的許可權既可以是系統許可權,也可以是對象許可權。
為了使用角色,首先在資料庫中創建一個角色,這時角色中沒有任何許可權。
然後向角色中添加許可權。
最後將這個角色授予用戶,這個用戶就具有了角色中的所有許可權。
在使用角色的過程中,可以隨時向角色中添加許可權,也可以隨時從角色中刪除許可權,用戶的許可權也隨之改變。
如果要回收所有的許可權,只要將角色從用戶回收即可。
下圖表示用戶與角色之間的關係。
角色的創建與刪除
在資料庫中有兩類角色,一類是Oracle預定義的角色,一類是用戶自定義的角色。
Oracle預定義的角色在資料庫被創建之後即存在,並且已經包含了一系列的許可權,資料庫管理員可以將這些角色直接授予用戶。
常用的角色有CONNECT 、RESOURCE 、DBA等角色,下表列出了常見的幾個角色及其所包含的許可權。
在新創建一個用戶時,為了使其具有最基本的許可權,最簡單的方法是將CONNECT 和RESOURCE兩個角色授予該用戶。
DBA是一個特殊的角色,在這個角色中包含了資料庫中的絕大部分系統許可權。
下表列出了這個角色所包含的部分系統許可權。
除了Oracle預定義的角色以外,用戶還可以自己定義角色。
一般情況下創建角色的操作只能由sys用戶完成,如果普通用戶要定義角色,必須具有“CREATE ROLE”系統許可權。
創建角色的命令是CREATE ROLE ,它的語法格式為:
CREATE ROLE 角色名;
例如,創建一個名為role1的角色,可以執行以下語句:
CREATE ROLE role1;
刪除角色的命令是“DROP ROLE”。
角色被刪除時,角色中的許可權都被從用戶回收。
例如,刪除剛纔創建的角色的語句為:
DROP ROLE role1;
角色中許可權的添加與刪除
角色剛被創建時,沒有包含任何許可權。
用戶可以將許可權授予該角色,使這個角色成為一個許可權的集合。
向角色授權的方法與向用戶授權的方法是相同的,只要將用戶名用角色名代替就可以了。
需要註意的是,如果向角色授予系統許可權,可以使用WITH ADMIN OPTION選項,但是向角色授予對象許可權時,不能使用WITH GRANT OPTION 。
例如,用戶scott通過下列語句向角色role1授予若幹許可權:
GRANT SELECT ON emp TO role1;
GRANT UPDATE(sal) ON emp TO role1;
SYS用戶也可以通過下列語句向該角色授予若幹系統許可權:
GRANT CREATE SESSION, CREATE TABLE, CREATE VIEW TO role1 WITH ADMIN OPTION;
如果要從角色中刪除許可權,可以執行REVOKE命令。
許可權回收的方法與從用戶回收許可權的方法相同,只是用角色名代替用戶名就可以了。
例如,用戶將SELECT許可權從角色role1回收,對應的語句為:
REVOKE SELECT ON emp FROM role1;
角色的分配與回收
只有將角色授予用戶,用戶才會具有角色中的許可權。
可以一次將角色授予多個用戶,這樣這些用戶就都具有了這個角色中包含的許可權。
將角色授予用戶的命令是GRANT ,授予角色的方法與授予許可權的方法相同,只是將許可權名用角色名代替就可以了。
例如,下麵的語句將角色role1授予用戶user1和user2:
GRANT role1 TO user1, user2;
在一般情況下,將角色授予用戶的操作由sys用戶完成,普通用戶如果要完成這樣的操作,必須具有GRANT ANY ROLE的系統許可權。
要將角色從用戶回收,需要執行REVOKE命令。
角色被回收後,用戶所具有的屬於這個角色的許可權都將被回收。
從用戶回收角色與回收許可權的方法是相同的,這樣的操作一般也由sys用戶完成。
例如,下麵的語句將角色role1從用戶user1回收:
REVOKE role1 FROM user1;
角色信息的查詢
角色的信息也存儲在相關的數據字典中。
與角色有關的數據字典有以下幾個:
• dba_roles :記錄資料庫中的所有角色。
• dba_role_privs :記錄所有被授予用戶或另一角色的角色。
• user_role_privs :記錄所有被授予當前用戶的角色。
• role_role_privs :記錄一個角色中包含的其他角色。
• role_sys_privs :記錄一個角色中包含的系統許可權。
• role_tab_privs :記錄一個角色中包含的對象許可權。
• session_roles :記錄當前會話中所使用的角色。
例如,下麵的語句得到系統中目前所有的角色:
SELECT role FROM dba_roles;
下麵的語句用於查詢用戶USER1所擁有的角色和預設角色:
SELECT granted_role,default_role FROM dba_role_privs WHERE grantee='USER1';
要查詢角色CONNECT中所包含的系統許可權,可以執行下麵的查詢語句:
SELECT privilege,admin_option FROM role_sys_privs WHERE role='CONNECT';
PROFILE的管理
PROFILE是一種資料庫對象,它的功能是對用戶使用口令的情況進行控制,或者對用戶消耗系統資源的情況進行控制。
在預設情況下,在資料庫中對用戶使用口令或者消耗資源是沒有什麼限制的,或者限制很小。
在一個資料庫中,可能因為一個用戶無意中執行了包含死迴圈的PL/SQL程式,或者一個帶有惡意的用戶對一個數百GB的大表進行全表檢索,這些行為雖然不能破壞數據,但是會使資料庫系統的性能急劇降低。
資料庫管理員如果及時發現了這種情況,可以強制終止用戶會話,
然後將帶有惡意的用戶鎖定。
例如,下麵的三條語句分別用戶查詢用戶的會話信息、強制終止用戶會話、鎖定用戶賬號
(其中144和278分別為用戶會話的sid和lserial#) :
SELECT sid, serial# FROM v$session WHERE username='SCOTT';
ALTER SYSTEM KILL SESSION '144, 278';
ALTER USER scott ACCOUNT LOCK;
如果在資料庫中創建了PROFILE ,通過PROFILE可以採取主動防禦的措施,對用戶消耗系統資源的情況進行控制,這樣就可以避免很多嚴重後果的產生。
PROFILE的創建與刪除
為了能夠使用PROFILE ,首先需要以system用戶的身份執行腳本pupbld.sql 。
這個腳本位於Oracle安裝目錄下的sqlplus/admin子目錄中。
例如:
@$ORACLE_HOME/sqlplus/admin/pupbld.sql
其中$ORACLE_HOME是對環境變數ORACLE_HOME的引用,它代表Oracle的安裝目錄。
在Windows 系統中,應該以下麵的方式執行這個腳本:
@%ORACLE_HOME%\sqlplus\admin\pupbld.sql
在資料庫中需要創建PROFILE這種資料庫對象,在PROFILE中指定對用戶所施加的各種限制,並將這個PROFILE 指定給用戶,這樣用戶的口令以及對資源的消耗就會受到限制。
PROFILE被創建,可以指定給多個用戶。
創建PROFILE的操作一般由SYS 用戶完成,如果普通用戶希望創建PROFILE ,需要具有CREATE PROFILE 系統許可權。
創建PROFILE的命令格式為:
CREATE PROFILE profile名稱 LIMIT
口令限制
資源限制
在創建用戶時,可以為其指定PROFILE。
對於一個已經存在的用戶,也可以為其指定PROFILE 。
例如:
CREATE USER user4 IDENTIFIED BY "123" PROFILE pl;
ALTER USER scott PROFILE pl;
為每個用戶只能指定一個PROFILE 。
從數據字典視圖dba_users 中可以獲得為每個用戶指定的PROFILE 。
例如:
SELECT profile FROM dba_users WHERE username='SCOTT';
在一個PROFILE 中所包含的各種限制可以從數據字典視圖dba_profiles 中獲得。
例如,下麵的命令用戶查詢Pl 對用戶使用口令及使用資源進行的限制:
SELECT resource_name, limit FROM dba_profiles WHERE profile='PL';
除了明確設置的限制外, PROFILE中所包含的大部分限制都採用了預設值。
刪除PROFILE的命令是DROP PROFILE。
如果一個PROFILE 已經被指定給了某個用戶,那麼在刪除PROFILE需要指定CASCADE關鍵字。
例如:
DROP PROFILE user4 CASCADE;
如何利用PROFILE對用戶口令進行管理
對用戶口令的限制主要涉及口令的使用期限,在一個PROFILE 中可以指定多種限制。
下麵列出了對用戶口令可以施加的限制。
• FAILED_LOGIN_ATTEMPTS :允許的失敗登錄次數。如果用戶的失敗登錄達到指定的次數,用戶賬號將被鎖定。這個參數的預設值為10。
• PASSWORD_LOCK_ TIME :賬號鎖定時間。當用戶失敗的登錄達到指定的次數後,用戶賬號將被鎖定指定的天數。這個參數的預設值為1 天。
• PASSWORD_LIFE_TIME :口令的有效期。當用戶口令到達有效期後,必須進行修改,如果不修改,用戶賬號將被鎖定。這個參數的預設值為180天。
• PASSWORD_GRACE_ TIME :口令有效期的延長期。對口令的有效期可以指定延長期。在延長期內用戶仍然可以登錄,但是每次登錄都將接到警告信息。
如果用戶在延長期內沒有修改口令,用戶賬號將被鎖定。這個參數的預設值為7天。
• PASSWORD_RBBSE_ TIME :為了再次使用過去用過的口令,必須經過的天數。
• PASSWORD_REUSE_MAX :為了再次使用過去用過的口令,必須使用不同口令的次數。
其中最後兩個參數是一起使用的。
如果為兩個參數都指定了具體的值,那麼在指定的天數內,用戶的口令必須被修改過指定的次數後,才能使用過去用過的口令。
如果為其中一個參數指定了具體值,而將另外一個參數值指定為UNLIMITED ,那麼用戶將永遠不能使用過去用過的口令。
如果把兩個參數都設置為UNLIMITED ,那麼對用戶的口令沒有限制。
例如,下麵創建的PROFILE對用戶的失敗登錄次數進行控制,如果用戶失敗的登錄次數達到3次,這個用戶賬號將被鎖定5 天。
create profile PL limit
failed_login_attempts 3
password_lock_time 5;
又如,下麵創建的PROFILE對用戶修改口令進行限制,要求用戶在30天內必須把口令修改過5次後,才能使用過去用過的口令。
CREATE PROFILE p2 LIMIT
PASSWORD_REUSE_TIME 30
PASSWORD_REUSE_MAX 5;
為了通過PROFILE對用戶使用口令的情況進行控制,必須把PROFILE指定給某個用戶。
例如:
ALTER USER scott PROFILE pl;
如何利用PROFILE對用戶使用資源進行控制
對用戶使用資源的限制主要包括對連接時間、CPU時間、數據塊數量所進行的限制。
可以從兩個層次對用戶使用系統資源進行限制,一個是會話級,另一個是調用級。
其中會話級限制指的是,對用戶在整個會話範圍內所使用資源總和進行的限制。
而調用級限制指的是對用戶執行的每條命令所使用資源進行的限制。
在預設情況下,即使創建了PROFILE ,而且也為用戶指定了PROFILE ,用戶使用CPU的時間、可以訪問的數據塊還是不受限制的。
為了使PROFILE對用戶使用系統資源所做的限制起作用,需要在資料庫中將初始化參數RESOURCE_LIMIT的值設置為TRUE。
ALTER SYSTEM SET resource_limit=TRUE;
下麵列出了可以對用戶的一個會話施加的限制:
• SESSIONS_PER_USER :一個用戶所允許的併發會話的數目。
• CPU_PER_SESSION :用戶在一個會話內所使用的CPU時間的總和,時間單位為0.01 秒。
• LOGICAL_READS_PER_SESSION :用戶在一個會話內所能訪問的數據塊的數量(這個
數量包括物理讀和邏輯讀的數量)。
• CONNECT_TIME :一個用戶會話所能持續的時間,以分鐘為單位。超過這個時間,會話將自動斷開。
•IDLE_TIME :一個用戶會話所允許的連續的空閑時間,以分鐘為單位。超過這個時間,會話將自動斷開。
• PRIVATE_SGA :如果資料庫伺服器的連接模式為共用模式,這個參數用來限製為一個用戶會話所分配的SGA空間。
下麵列出了可以對用戶執行的每條命令施加的限制:
• CPU_PER_CALL : 用戶執行的每條命令所使用的CPU時間,時間單位為0.0 1秒。
• LOGICAL_READS_PER_CALL : 用戶執行的每條命令所能訪問的數據塊的數量。
如果能夠對用戶消耗CPU時間、訪問數據塊的數量等這些資源進行限制,那麼就可以有效地防止諸如死迴圈的執行、訪問一個大表中的所有數據這類情況的發生。
例如,下麵創建的PROFILE用來對一個在會話範圍內所使用的CPU時間、能夠訪問的數據塊以及會話的持續時間進行限制:
CREATE PROFILE p3 LIMIT
SESSIONS_PER_USER 3
LOGICAL_READS_PER_SESSION 500
CONNECT_TIME 5
CPU_PER_CALL 10
LOGICAL_READS_PER_CALL 50;
預設的PROFILE
在資料庫中有一個預設PROFILE ,名稱為DEFAULT ,如果沒有為用戶指定PROFILE ,那麼用戶使用口令、使用系統資源是受這個預設PROFILE限制的。
如果要對所有用戶進行同樣的限制,那麼只要修改這個預設PROFILE 中所包含的限制,並且不要為用戶指定其他的PROFILE如果在一個PROFILE 中沒有對某個限制進行設置,那麼這樣的限制將採用預設值。
預設值實際上就來自這個預設的PROFILE 。