SlideShare a Scribd company logo
1 of 53
Chapter	7	User	And	Privilege	
Oracle	Database	11g	資料庫管理入門	
第七章 使用者與權限
前言
資料庫安全對資料管理者來說,可謂最重要的課題之一。因為企業將重要資訊全部集中儲存在資料庫中。
如果輕忽資料庫的安全設定,將造成嚴重的後果。如同家中財物都存放在保險箱,不但保險箱箱門未關,
且將保險箱放在大馬路旁無人看守一般。本章節將針對使用者的身份辨識與權限授與進行介紹,讓資料庫
管理者了解資料庫安全的基本設定,避免資料庫被未經身份驗證或未經授權的資料庫使用者存取。
7.1 資料庫安全(Database Security)
Oracle 資料庫將安全(Security)分成系統安全與資料安全兩類。系統安全著重在資料庫系統上,因此重點
在身份辨識與系統權限的授與。而資料安全則考量資料庫中資料的安全,所以著重在授與物件權限與稽核
上。
7.1.1 系統安全(System Security)
身份辨識(Authentication)
身份辨識其實就是如何證明使用者是他宣稱的那個人,簡言之”你哪位”(Who Are You?),Oracle 資
料庫可以透過密碼、外部(作業系統)與全域(目錄服務)等方法驗證使用者。
密碼認證(Password):
當使用者試圖建立階段作業(Session)時,必須提供使用者名字與密碼,Oracle 資料庫由資料辭典中找到
該使用者的密碼後,進行密碼比對。如果一致則表示此使用者的身份已經確認,的確為其所宣稱的那個使
用者。若不一致將出現錯誤訊息,必須重新輸入密碼再次進行驗證。
由於密碼的管理對整個資料庫安全來說是非常重要的一部份,所以從 Oracle Database 11g 開始,資料
庫管理者可以藉由 DBA_USERS_WITH_DEFPWD 查知哪些使用者的密碼是預設密碼,可以盡快將那些
密碼更換,以免造成有心人可以透過這些預設密碼連到資料庫,造成資料庫安全的漏洞。
SQL> connect / as sysdba
Connected.
SQL> SELECT * FROM dba_users_with_defpwd;
USERNAME
------------------------------
DIP
MDSYS
WK_TEST
OUTLN
EXFSYS
Chapter	7	User	And	Privilege	
Oracle	Database	11g	資料庫管理入門	
MDDATA
ORDPLUGINS
ORDSYS
XDB
SI_INFORMTN_SCHEMA
/*找出還是使用預設密碼的使用者,並將其密碼加以更改*/
Chapter	7	User	And	Privilege	
Oracle	Database	11g	資料庫管理入門	
外部驗證(OS authentication):
使用者建立階段作業時,不需要提供使用者名稱與密碼。因為資料庫使用者的帳號,直接由 Oracle 資料
庫參數(OS_AUTHENT_PREFIX)與作業系統的使用者帳號結合。例如:OS_AUTHENT_PREFIX 的設定
值為 ops$(這是預設值),而登入作業系統所使用的帳號為 frank。則使用作業系統認證時,所自動組合而
成的資料庫使用者帳號為 OPS$FRANK。因此在資料庫中必須先有此使用者帳號,並且此使用者的驗證
方法必須為外部(EXTERNALLY),如此才能使用作業系統驗證的方式登入資料庫。
全域驗證(Global Authentication):
全域驗證可以讓資料庫管理者建立一個全域使用者,這種驗證方法是採用目錄服務機制(Directory
Service),由目錄服務伺服器來驗證資料庫使用者的身份。使用此方式驗證前,需要確定有目錄服務伺服
器存在,並且伺必須支援 LDAP 協定。
權限授與(Authorization)-System Privilege
系統安全除了注重身份辨識外,還要求考慮對使用者授與適當的權限,讓使用者可以執行他應該做且可以
做的資料庫操作,例如:建立階段作業、建立表格、建立使用者、建立表格空間等工作。為強化資料庫安
全,Oracle 資料庫的使用者預設都沒有任何的系統或物件權限,只有當資料庫管理者授與權限後,才能
對資料庫進行特定的操作。所以可以用權限的授與來控制資料庫使用者的行為,以強化資料庫系統的安全
性。
7.1.2 資料安全(Data Security)
權限授與(Authorization)-Object Privilege
物件權限是對資料庫物件所設定的權限,可以用來限制資料庫使用者可以查詢某個綱要的表格內容、執行
某個綱要的程序或新增資料到某個綱要的表格中等。因此是針對資料庫中的某個物件,所以稱作物件權限。
藉由物件權限可以讓資料庫的資料更加安全,減少未經授權而存取的情況發生。
稽核(Audit)
稽核用來記錄事前設定的資料庫操作的訊息,包括:人、事、時、地、物等資訊,可以用來進行事後的追
蹤。但是稽核只能記錄發生過的事件,不能事前防止事情發生。不過正確的稽核觀念與設定,可以當遇到
可疑情況,使用稽核記錄來找出問題的原因,避免相同問題一再發生。
Oracle Database 11g 提供以下多種稽核方法:
強制稽核(Mandatory Audit)
所謂強制表示無法關閉此種稽核,當每次執行處理(Instance)開啟或關閉,以及每次使用 SYSDBA 或
SYSOPER 身份登入資料庫,都會記錄相對的時間以及客戶端使用者帳戶等資訊。這種稽核的稽核歷程檔
Chapter	7	User	And	Privilege	
Oracle	Database	11g	資料庫管理入門	
(Audit Trail)只能儲存在作業系統中,Windows 平台一定存放在事件日誌檔(Event Log)中,而 UNIX 平
台則統一存放在$ORACLE_HOME/rdbms/audit 的目錄下,檔案名稱格式為 ora_pid.aud。
標準稽核(Standard Audit)
標準稽核由資料管理者藉由設定稽核選項(Audit Options)決定那些敘述句(Statement)、系統權限
(Privilege)與物件(Object)的操作將被稽核,使用 AUDIT_TRAIL 參數來決定關閉、啟動稽核功能。當
AUDIT_TRAIL 參數值為 NONE 或 FALSE 為關閉稽核,DB 或 DB_EXTENDED 為啟動稽核並將稽核歷
程檔儲存在 SYS 綱要的 AUD$表格中,若為 OS 或 XML 將稽核歷程檔存放在 AUDIT_FILE_DEST 參數
所指定的檔案目錄下。不過在 WINDOWS 平台,當 AUDIT_TRAIL=OS 時,其稽核歷程檔還是存放在事
件日誌中。
更細微稽核(Fine-Grained Audit)
更細微稽核用來稽核當使用者查詢或異動表格中的某些資料列,更甚至於某些資料列的某些欄位,才會產
生稽核歷程檔。因為標準稽核只能記錄對表格層次(Table Level)的操作,而此種稽核比標準稽核更加細微,
可以達到資料列層次(Row Level),甚至到欄位層次(Column Level),故稱做更細微稽核(Fine-Grained
Audit)。此種稽核必須使用 DBMS_FGA 套件建立政策(Policy),而其產生的稽核歷程檔儲存於 SYS 綱要
的 FGA_LOG$表格。
DBA 稽核(DBA Audit)
當資料庫管理者以 SYSDBA 身份登入資料庫後,此階段作業的所有操作都不會被標準稽核或更細微稽核
所稽核,此為資料庫安全的一大漏洞。因此自 Oracle Database 10g Release 2 後,可以藉由設定
AUDIT_SYS_OPERATIONS=TRUE,自此之後所有以 SYSDBA 身份登入的階段作業,當其 Server
Process 執行任何 SQL 敘述句時,都會將 SQL 敘述句記錄到稽核歷程檔中。稽核歷程檔在 UNIX 平台上
依 AUDIT_FILE_DEST 參數設定決定所在的檔案目錄,而 WINDOWS 平台還是存放在事件日誌內。
7.2 設定檔(Profile)
使用者身份辨識是資料庫安全的第一道防線,如果能夠使用身份辨識阻擋不明人士試圖登入資料庫的意圖,
則可以減少許多後續的補救工作與成本。而身份辨識最常用的一種方法,使用密碼驗證使用者身份。如果
使用者長年不改密碼或使用太簡單的密碼,都會增加被別人假冒身份的機會。因此 Oracle 資料庫可以藉
由設定檔(Profile)來限制使用者的密碼有效期限、密碼重複使用限制與密碼複雜性檢查,讓使用者必須定
期更換密碼、不能使用過去幾次或幾天用過的密碼、不能使用太簡單的密碼等限制,以加強使用者密碼的
Chapter	7	User	And	Privilege	
Oracle	Database	11g	資料庫管理入門	
安全性。同時設定檔也可以用來限制階段作業所能消耗的 Oracle 系統資源,如 CPU 時間、Logical I/O
區塊數、連線時間等資源,讓在系統資源不足的情況下,強迫消耗過多系統資源的階段作業提早結束連線。
當資料庫建立後,Oracle 資料庫便有一個叫做 DEFAULT 的設定檔存在。此設定檔當作使用者的預設設
定檔,可以不被使用,但不可以被刪除。
SQL> connect / as sysdba
Connected.
--列示出DEFAULT設定檔的設定值
SQL> SELECT resource_name,limit
2 FROM dba_profiles
3 WHERE profile='DEFAULT';
RESOURCE_NAME LIMIT
------------------------------------------------------ ----------------------------------------
COMPOSITE_LIMIT UNLIMITED
SESSIONS_PER_USER UNLIMITED
CPU_PER_SESSION UNLIMITED
CPU_PER_CALL UNLIMITED
LOGICAL_READS_PER_SESSION UNLIMITED
LOGICAL_READS_PER_CALL UNLIMITED
IDLE_TIME UNLIMITED
CONNECT_TIME UNLIMITED
PRIVATE_SGA UNLIMITED
FAILED_LOGIN_ATTEMPTS 10
PASSWORD_LIFE_TIME 1800
PASSWORD_REUSE_TIME UNLIMITED
PASSWORD_REUSE_MAX UNLIMITED
PASSWORD_VERIFY_FUNCTION NULL
PASSWORD_LOCK_TIME 1
PASSWORD_GRACE_TIME 7
SQL> SELECT username,profile FROM dba_users; --找出每個使用者所使用的設定檔
USERNAME PROFILE
------------------------------ ------------------------------
APEX_PUBLIC_USER DEFAULT
XS$NULL DEFAULT
SPATIAL_WFS_ADMIN_USR DEFAULT
SPATIAL_CSW_ADMIN_USR DEFAULT
MDDATA DEFAULT
DIP DEFAULT
TSMSYS DEFAULT
ORACLE_OCM DEFAULT
WKSYS WKSYS_PROF
WKPROXY DEFAULT
SYSMAN DEFAULT
Chapter	7	User	And	Privilege	
Oracle	Database	11g	資料庫管理入門	
7.2.1 密碼限制(Password Limit)
設定檔中有關密碼限制的設定有七種,只要知道每個設定的意義,便可以依需求彈性組合這些密碼限制以
達到所期望的效果。同時使用者只要被指派某個設定檔後,其密碼相關的限制開始生效,規範著此使用者
的密碼相關設定。
SQL> connect / as sysdba
Connected.
SQL> DESC dba_profiles
Name Null? Type
----------------------------------------------------- ----------------------- ----------------------------------------
PROFILE NOT NULL VARCHAR2(30)
RESOURCE_NAME NOT NULL VARCHAR2(32)
RESOURCE_TYPE VARCHAR2(8)
LIMIT VARCHAR2(40)
SQL> SELECT DISTINCT resource_name FROM dba_profiles
2 WHERE resource_type='PASSWORD';
RESOURCE_NAME
Chapter	7	User	And	Privilege	
Oracle	Database	11g	資料庫管理入門	
---------------------------------------------
FAILED_LOGIN_ATTEMPTS
PASSWORD_LIFE_TIME
PASSWORD_REUSE_TIME
PASSWORD_REUSE_MAX
PASSWORD_VERIFY_FUNCTION
PASSWORD_LOCK_TIME
PASSWORD_GRACE_TIME
/*當resource_type為PASSWORD,表示此資源為密碼限制,若為KERNEL則為資源限制。*/
SQL> CREATE PROFILE test_prof LIMIT
2 PASSWORD_LIFE_TIME 30
3 PASSWORD_GRACE_TIME 5
4 PASSWORD_REUSE_MAX 3
5 PASSWORD_REUSE_TIME 1
6 PASSWORD_VERIFY_FUNCTION NULL
7 FAILED_LOGIN_ATTEMPTS 5
8 PASSWORD_LOCK_TIME 1;
Profile created.
SQL> SELECT resource_name,limit
2 FROM dba_profiles
3 WHERE profile='TEST_PROF' AND resource_type='PASSWORD';
RESOURCE_NAME LIMIT
------------------------------------------------------- ----------------------------------------
FAILED_LOGIN_ATTEMPTS 5
PASSWORD_LIFE_TIME 30
PASSWORD_REUSE_TIME 1
PASSWORD_REUSE_MAX 3
PASSWORD_VERIFY_FUNCTION NULL
PASSWORD_LOCK_TIME 1
PASSWORD_GRACE_TIME 5
--有些資料庫管理者會將某個設定值設為Default,表示該設定的值參考DEFAULT設定檔的設定值。
SQL> CREATE PROFILE test_prof2 LIMIT
2 FAILED_LOGIN_ATTEMPTS default;
/*表示TEST_PROF2設定檔的FAILED_LOGIN_ATTEMPT參考DEFAULT設定檔的FAILED_LOGIN_ATTE
MPTS,其實也不用明確設定,因為所有的設定值的預設值都是DEFAULT。*/
Chapter	7	User	And	Privilege	
Oracle	Database	11g	資料庫管理入門	
FAILED_LOGIN_ATTEMPTS(登入失敗鎖定的嘗試次數)
此設定值規定當使用者連續打錯幾次密碼後,使用者帳戶會自動被鎖定,直到鎖定天數達到或資料庫管理
者解除鎖定為止。即便沒有設定 FAILED_LOGIN_ATTEMPTS,當連續三次密碼錯誤後,第四次試圖登
入時,登入畫面將自動延遲出現,最多可以延遲 10 秒鐘才出現。不過如果透過 SQL*PLUS 登入,連續
三次密碼錯誤,SQL*PLUS 會自動結束,使用者必須再次執行 SQL*PLUS 才能繼續登入動作,這是
SQL*PLUS 的安全機制。當然成功登入資料庫後,之前連續登入失敗的記錄將會清除,重新開始累計。
Chapter	7	User	And	Privilege	
Oracle	Database	11g	資料庫管理入門	
PASSWORD_LOCK_TIME(鎖定天數)
此設定規定當使用者因連續輸入錯誤密碼而被 Oracle 資料庫自動鎖定帳戶後,經過多久時間後,Oracle
資料庫會自動解除鎖定。不過帳戶狀態要等到使用者在解除鎖定後,進行第一次登入動作時,才會由
LOCK(TIMED)改為開啟(OPEN)。必須注意的是此參數的單位為天,若想鎖定時間低於一天,則可以使
用分數的分式來設定。例如:希望自動鎖定時間為 10 分鐘,則可以將 PASSWORD_LOCK_TIME 設定
為 10/1440 即可。此設定的預設值為 UNLIMITED,表示當自動鎖定後,必須由資料庫管理者使用
ALTER USER frank ACCOUNT UNLOCK 指令來解除鎖定。
PASSWORD_LIFE_TIME(到期日)
此設定規定現在的密碼經過幾天後將會失效,密碼到期後,使用者帳戶狀態將由 OPEN 變成
EXPIRED(沒有設定寬限期)或 EXPIRED(GRACE)(有設定寬限期)。
PASSWORD_GRACE_TIME(鎖定-過期之後的天數)
此設定允許使用者在密碼失效後,第一次登入後開始計算,幾天之內還可以使用舊的密碼登入資料庫。
只是每次使用者試圖登入資料庫時,將會出現密碼即將在 n 天內失效的錯誤訊息’ ORA-28002: the
password will expire within n days’。這時使用者的帳戶狀態為 EXPIRED(GRACE),而此訊息將一再
出現提醒使用者更改密碼。然而使用者在寬限期(GRACE TIME)結束前,都沒有更改密碼。則使用者的帳
戶狀態將變為 EXPIRED,所以當下次使用者試圖登入資料庫時,將出現要求更改密碼的畫面,強迫使用
者更改密碼,不然無法登入資料庫。
Chapter	7	User	And	Privilege	
Oracle	Database	11g	資料庫管理入門	
許多 Oracle 公司的文件中提到,當寬限期過後,若使用者還是未更改密碼,則使用者帳戶將被鎖定。事
實上並非如此,而只是使用者帳戶狀態變為 EXPIRED 而已,藉此強迫使用者必須更改密碼以登入資料庫。
PASSWORD_REUSE_MAX(要保留的密碼數目)
此設定要求 Oracle 資料庫必須保存最近幾次用過的密碼。當使用者更改密碼時,Oracle 資料庫利用這些
密碼歷史記錄,來判定使用者是否試圖重複之前用過的密碼。如果使用者試圖舊密碼,將會出現錯誤訊息
且不允許使用。資料庫管理者可以由 SYS.USER_HISTORY$察看目前使用過的密碼歷史記錄,當密碼超
過保留次數後,將由此表格中移除,因此使用者便可以重複使用舊密碼。此設定的預設值為 UNLIMITED,
表示不記錄任何之前用過的密碼。
PASSWORD_REUSE_TIME(要保留的天數)
此設定要求 Oracle 資料庫必須保存最近幾天內用過的密碼。當使用者更改密碼時,Oracle 資料庫利用這
些密碼歷史記錄,來判定使用者是否試圖重複之前用過的密碼。如果使用者試圖舊密碼,將會出現錯誤訊
息且不允許使用。當密碼超過保留時間後,將由此 SYS.USER_HISTORY$中移除,因此使用者便可以重
複使用舊密碼。此設定的預設值為 UNLIMITED。 此設定的預設值為 UNLIMITED,表示不記錄任何之前
的密碼。
Chapter	7	User	And	Privilege	
Oracle	Database	11g	資料庫管理入門	
當使用資料庫控制建立或編輯設定檔時,會要求當 PASSWORD_REUSE_MAX 或
PASSWORD_REUSE_TIME 其中一個設定值為數字時,另一個設定一定要為 UNLIMITED。不然將會出
現如下圖的錯誤訊息,然而這樣的要求才是真正的錯誤。因為若按照畫面要求的設定,其中一個為數字而
另一個則必須為 UNLIMITED,那麼使用這個設定檔的使用者將永遠不能使用之前用過的密碼。
--切換身份為SYS,因為要查詢資料辭典表格與視觀圖
SQL> CONNECT / AS SYSDBA
--建立一個測試帳號frank
SQL> GRANT CREATE SESSION TO frank IDENTIFIED BY oracle;
Grant succeeded.
--建立一個測試用設定檔prof_1,其中設定密碼重用限制次數為2次,重用時間無限制。
SQL> CREATE PROFILE prof_1 LIMIT
2 PASSWORD_REUSE_MAX 2
3 PASSWORD_REUSE_TIME UNLIMITED;
--將prof_1指派給frank
SQL> ALTER USER frank PROFILE prof_1;
SQL> ALTER USER frank IDENTIFIED BY abc123; --更改第一次
SQL> ALTER USER frank IDENTIFIED BY def456; --更改第二次
SQL> ALTER USER frank IDENTIFIED BY ghi789; --更改第三次
SQL>USER frank IDENTIFIED BY oracle; --此時已經更改過三次密碼,但卻還不能重用oracle這個密碼
ALTER USER frank IDENTIFIED BY oracle
*
ERROR at line 1:
ORA-28007: the password cannot be reused
SQL> SELECT password,TO_CHAR(password_date,'YYYY-MM-DD HH24:MI:SS') password_date
2 FROM sys.user_history$
3 WHERE user#=(SELECT user_id FROM dba_users WHERE username='FRANK')
4 ORDER BY password_date;
PASSWORD PASSWORD_DATE
------------------------------ ---------------------------
8A52535A7428572D 2009-04-02 13:55:21 --此為oracle的雜湊值(Hash Value),尚未被移出
E209B58C9B4CAEF1 2009-04-02 15:10:49
A4D171F6D949760B 2009-04-02 15:11:03
3B52A820306F3F11 2009-04-02 15:11:15
--修改設定檔
SQL> ALTER PROFILE prof_1 LIMIT
2 PASSWORD_REUSE_MAX 2
3 PASSWORD_REUSE_TIME 5/1440; --設定用過的密碼保存5分鐘
SQL> ALTER USER frank IDENTIFIED BY oracle;
SQL> ALTER USER frank IDENTIFIED BY abc123;
SQL> ALTER USER frank IDENTIFIED BY def456;
SQL> SELECT password,TO_CHAR(password_date,'YYYY-MM-DD HH24:MI:SS') password_date
2 FROM sys.user_history$
3 WHERE user#=(SELECT user_id FROM dba_users WHERE username='FRANK')
4 ORDER BY password_date;
PASSWORD PASSWORD_DATE
Chapter	7	User	And	Privilege	
Oracle	Database	11g	資料庫管理入門	
------------------------------ ---------------------------------
8A52535A7428572D 2009-04-02 15:30:20 --此密碼將在2009-04-02 15:35:20後便可被移出
E209B58C9B4CAEF1 2009-04-02 15:30:29
A4D171F6D949760B 2009-04-02 15:31:34
SQL> SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS') current_time FROM dual;
CURRENT_TIME
--------------------------------
2009-04-02 15:32:06
SQL> ALTER USER frank IDENTIFIED BY oracle; --因為oracle密碼尚未滿5分鐘
ALTER USER frank IDENTIFIED BY oracle
*
ERROR at line 1:
ORA-28007: the password cannot be reused
---等待約5分鐘後
SQL> SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS') current_time FROM dual;
CURRENT_TIME
--------------------------------
2009-04-02 15:40:37
SQL> ALTER USER frank IDENTIFIED BY oracle; --更改密碼成功,表示可以重複使用oracle這個密碼
User altered.
所以如果想要使用者能夠重複舊密碼,則必須將 PASSWORD_REUSE_MAX 與
PASSWORD_REUSE_TIME 都設為數字。而且使用者想要重複使用舊密碼時,必須同時符合這兩個設定。
假設 PASSWORD_REUSE_MAX=5 且 PASSWORD_REUSE_TIME=10 時,則使用者只能夠使用 10
天以前且 5 次之前的舊密碼。
若兩者都為 UNLIMITED 則使用者可以無限制地重複使用舊密碼,不過這樣對資料庫安全有不良的影響。
PASSWORD_VERIFY_FUNCTION(複雜性函數)
此設定用來要求密碼必須符合某個函數(Function)的檢驗,只有通過檢驗的密碼才能被使用。Oracle 資料
庫允許資料庫管理者自己撰寫檢驗函數,只是此函數必須位於 SYS 綱要下,而且此函數必須接受三個輸
入參數(USERNAME VARCHAR2,PASSWORD VARCHAR2,OLD_PASSWORD VARCHAR2),與回傳
Chapter	7	User	And	Privilege	
Oracle	Database	11g	資料庫管理入門	
布林值(Boolean)。當使用者被指派密碼或更改密碼時,該密碼會經由
PASSWORD_VERIFY_FUNCTION 的函數檢驗,只有當函數回傳值為真(TRUE)時,該密碼才能被使用。
若資料庫管理者不想要自行撰寫密碼檢驗函數時,可以使用 Oracle 資料庫提供的檢驗函數:
VERIFY_FUNCTION_11G(11g 新建立的檢驗函數)與 VERIFY_FUNCTION(11g 之前的檢驗函數)。只是
該函數並不會自動建立,需要資料庫管理者以 SYS 身份執行
$ORACLE_HOME/rdbms/admin/utlpwdmg.sql 來建立該函數。不過當執行 utlpwdmg.sql 後,除了會
建立 2 個函數外,其實 utlpwdmg.sql 還會修改 DEFAULT 設定檔的內容,將
VERIFY_FUNCTION_11G 設為密碼複雜性的檢驗函數,並修改某些密碼設定,讓使用 DEFAULT 設定
檔的使用者密碼限制變得更加嚴格,以增加資料庫的安全性。
SQL> connect / as sysdba
Connected.
--UNIX平台
SQL> @$ORACLE_HOME/db_1/rdbms/admin/utlpwdmg.sql
--Windows平台
SQL> @c:appadministratorproduct11.1.0db_1rdbmsadminutlpwdmg.sql
Function created. --建立VERIFY_FUNCTION_11G函數在SYS綱要
Profile altered. --修改DEFAULT設定檔內容
Function created. --建立11g之前的檢驗函數VERIFY_FUNCTION在SYS綱要
Chapter	7	User	And	Privilege	
Oracle	Database	11g	資料庫管理入門	
由上圖可以得知,DEFAULT 設定檔被修改為密碼有效期限為 180 天,當密碼過期後,第一次登入起算
7 天為寬限期。可以重複使用舊密碼,因為 PASSWORD_REUSE_MAX 與 PASSWORD_REUSE_TIME
皆為 UNLIMITED。連續輸入錯誤密碼 10 次,將導致使用者帳戶被鎖定 1 天,期滿後將自動解除鎖定。
最後所有的密碼,不論是建立使用者時所給予的密碼或事後修改的密碼,都必須經過
VERIFY_FUNCTION_11G 函數的檢驗,通過後才能使用該密碼。
以下條列出 VERIFY_FUNCTION_11G 對密碼所作的檢驗項目,其檢驗項目可由 utlpwdmg.sql 中得知。
• 密碼長度不得少於 8 個字
• 密碼不得與使用者名字相同或使用者名字逆向拼寫(例如:使用者名字為 oracle,則密碼不能為
elcaro)
• 密碼不得與伺服器名字相同或將伺服器名字加上 1 到 100 的數字(例如:伺服器名字為 frank11g,
則密碼不能為 frank11g1 或 frank11g100)
• 密碼不得為 oracle 或 oracle 加上 1 到 100 的數字
• 密碼不得為以下常見密碼:welcome1、database1、account1、user1234、password1、
oracle123、computer1、abcdefg1、change_on_install
• 密碼必須有至少一個數字與英文字母
• 新密碼必須與舊密碼至少有 3 個字不相同
至於 VERIFY_FUNCTION 的檢驗條件較 VERIFY_FUNCIONT_11G 寬鬆多。
• 密碼長度不得少於 4 個字
• 密碼不得與使用者名字相同
• 密碼不得為以下常見密碼:welcome、database、account、user、password、oracle、
computer、abcd
• 密碼必須有至少一個數字、英文字母與特殊符號(!"#$%&()``*+,-/:;<=>?_)
• 新密碼必須與舊密碼至少有 3 個字不相同
不過為資料庫的安全性著想,當 Oracle 資料庫版本為 11g 時,建議使用 VERIFY_FUNCTION_11G 檢
驗密碼。
SQL> connect / as sysdba
Chapter	7	User	And	Privilege	
Oracle	Database	11g	資料庫管理入門	
Connected.
SQL> CREATE USER green IDENTIFIED BY myboss;
CREATE USER green IDENTIFIED BY myboss
*
ERROR at line 1:
ORA-28003: password verification for the specified password failed
ORA-20001: Password length less than 8
7.2.2 資源限制(Resource Limit)
設定檔除了可以對使用者的密碼進行限制外,還可用來限制階段作業所能消耗的一些資源。當階段作業所
消耗的資源量已經達到限制數量時,該階段作業將會被強制登出,以減少 Oracle 資料庫整體的資源消耗。
不過資源限制只有在資料庫資源已經不足的情況下,才有其必要。因此資料庫管理者可以透過
RESOURCE_LIMIT 參數啟動(TRUE)或關閉(FALSE)資源限制。若 RESOURCE_LIMIT 參數值為 FALSE,
即便設定檔中有對資源設定限制,也不會發生任何影響,直到資料庫管理者將 RESOURCE_LIMIT 參數
設為 TRUE 後,才會開始發生作用。
SQL> connect / as sysdba
Connected.
SQL> SELECT DISTINCT resource_name FROM dba_profiles
2 WHERE resource_type='KERNEL';
RESOURCE_NAME
---------------------------------------------
COMPOSITE_LIMIT
SESSIONS_PER_USER
CPU_PER_CALL
LOGICAL_READS_PER_SESSION
LOGICAL_READS_PER_CALL
PRIVATE_SGA
CPU_PER_SESSION
IDLE_TIME
CONNECT_TIME
9 rows selected.
--啟動資源限制設定
SQL> ALTER SYSTEM SET resource_limit=TRUE;
CPU/階段作業(CPU_PER_SESSION)
此設定用來限制每個階段作業所能消耗的 CPU 總時間(單位為 1/100 秒),一但超過此限制,正在進行中
的交易將被退回(Rollback),此階段作業也被強制登出。錯誤訊息為 ORA-02392: exceeded session
limit on CPU usage, you are being logged off。
SQL> connect / as sysdba
Connected.
--建立測試表格,通常不建議建立在SYSTEM綱要中,因為尚未建立其他的使用者。
SQL> CREATE TABLE system.big1 AS SELECT * FROM dba_objects;
SQL> COMMIT; --結束交易
SQL> SELECT COUNT(*) FROM system.big1;
COUNT(*)
---------------
Chapter	7	User	And	Privilege	
Oracle	Database	11g	資料庫管理入門	
68213
--交易開始
SQL> DELETE system.big1 WHERE object_id=2000;
1 row deleted.
SQL> SELECT COUNT(*) FROM system.big1;
COUNT(*)
---------------
68212
SQL> DELETE system.big1;
DELETE big1
*
ERROR at line 1:
ORA-02392: exceeded session limit on CPU usage, you are being logged off
--超過CPU_PER_SESSION限制,這裡使用的值為CPU_PER_SESSION=5
SQL> SELECT COUNT(*) FROM system.big1;
SELECT COUNT(*) FROM system.big1
*
ERROR at line 1:
ORA-01012: not logged on --階段作業已經被強制登出,交易也被自動退回
Process ID: 30701
Session ID: 285 Serial number: 14071
SQL> CONNECT / AS SYSDBA --重新建立一個新階段作業
Connected.
SQL> SELECT COUNT(*) FROM system.big1;
COUNT(*)
--------------
68213 --之前的交易的確已經被自動退回
CPU/呼叫(CPU_PER_CALL)
此設定用來限制每個 CPU 呼叫(解析-parse、執行-execute、回傳-fetch)不能消耗超過多少的 CPU 時間
(單位為 1/100 秒),一但超過限制,該 CPU 呼叫將會被取消,操作也會被退回。不過整個交易依然還在
持續中,階段作業也繼續存在不會被強制登出。錯誤訊息為 ORA-02393: exceeded call limit on CPU
usage。
SQL> connect / as sysdba
Connected.
SQL> COMMIT;
SQL> SELECT COUNT(*) FROM system.big1;
COUNT(*)
---------------
68213
--交易開始
SQL> DELETE system.big1 WHERE object_id=2000;
Chapter	7	User	And	Privilege	
Oracle	Database	11g	資料庫管理入門	
1 row deleted.
SQL> SELECT COUNT(*) FROM system.big1;
COUNT(*)
---------------
68212
SQL> DELETE system.big1;
delete big1
*
ERROR at line 1:
ORA-02393: exceeded call limit on CPU usage
--超過CPU_PER_CALL的限制,此設定為CPU_PER_CALL=5
SQL> SELECT COUNT(*) FROM system.big1;
COUNT(*)
---------------
68212 --並沒有被退回,object_id=2000的資料列還是被刪除
--人為退回交易
SQL> ROLLBACK;
Rollback complete.
SQL> SELECT COUNT(*) FROM system.big1;
COUNT(*)
---------------
68213 --與交易前相同
Chapter	7	User	And	Privilege	
Oracle	Database	11g	資料庫管理入門	
連線時間(CONNECT_TIME)
此設定用來限制每個階段作業的總連線時間不能超過多少分鐘。若超過該階段作業將被強制登出,正在進
行的交易也會被自動退回。訊息如下:ORA-02399: exceeded maximum connect time, you are being
logged off
閒置時間(IDLE_TIME)
此設定用在限制每個階段作業不能連續超做多少分鐘沒有任何動作。若持續閒置時間超過限制,則此階段
作業將被強制登出,且交易自動退回。錯誤訊息如下:ORA-02396: exceeded maximum idle time,
please connect again
並行階段作業(SESSIONS_PER_USER)
此設定用來限制使用同一個資料庫帳戶所能建立的階段作業總數,若超過限制,新的階段作業將無法建立,
並會出現錯誤訊息 ORA-02391: exceeded simultaneous SESSIONS_PER_USER limit。這個設定很適
合用在 3-Tier 或 C/S 架構的應用程式中,因為這種應用程式通常使用同一個資料庫帳戶建立多個階段作
業,資料庫管理者可以依照資料庫的負荷能力,藉由 SESSIONS_PER_USER 限制同時能夠登入資料庫
的階段作業數量。同時搭配 CONNECT_TIME 與 IDLE_TIME 將連線時間過長或閒置過久的階段作業終止,
這樣便可讓資料庫可以在最佳的負荷狀態下運行,而不會有過多的階段作業連入,造成整體資料庫的效能
下降。
讀取/階段作業(LOGICAL_READS_PER_SESSION)
此設定用在限制每個階段作業累計可以讀取的資料區塊數量不能超過多少,雖然名為
LOGICAL_READS_PER_SESSION,但是這裡的讀取是由實體讀取(Physical Read)與邏輯讀取(Logical
Read)組成。如果超過讀取總數量,則階段作業會出現錯誤訊息 ORA-02394: exceeded session limit
on IO usage, you are being logged off,正在進行中的交易將會被退回,階段作業也會被強制登出。
讀取/呼叫(LOGICAL_READS_PER_CALL)
此設定用在限制每個呼叫最多可以讀取的資料區塊,如果超過讀取總數量,則階段作業會出現錯誤訊息
ORA-02395: exceeded call limit on IO usage,正在進行中的 SQL 敘述句將會被退回,但交易不會有
影響,依然持續中,同時階段作業也繼續運行。
專用 SGA(PRIVATE_SGA)
當階段作業為共享伺服器(Shared Server)模式時,階段作業的使用者整體區域(User Global Area)將會放
在系統整體區域(System Global Area)中的大型集區(Large Pool)或共用集區(Shared Pool)。而 UGA 由
階段作業資訊(Session Information)、游標狀態(Cursor State)與 SQL 工作區域(SQL Work Area)等所
組成。資料庫管理者可以透過此設定限制每個階段作業的 UGA 不能超過 KB(KiloBytes),不過此設定僅
能在階段作業使用共用伺服器時才有效果。當階段作業所使用的 SGA 空間大小超過專用 SGA 的限制時,
將會出現錯誤訊息 ORA-02397: exceeded PRIVATE_SGA limit, you are being logged off,並被強制
登出。
複合限制(COMPOSITE_LIMIT)
此設定是將 CPU_PER_SESSION、LOGICAL_READS_PER_SESSION、CONNECT_TIME 與
PRIVATE_SGA,依 RESOURCE_COST 中所設定的成本,使用加權計算的方式得出複合限制值。因此
資料庫管理者可以自行依照目前資料庫最欠缺的資源,將其資源成本設定較其資源來的大,則便可以讓消
Chapter	7	User	And	Privilege	
Oracle	Database	11g	資料庫管理入門	
耗越多欠缺資源的階段作業,比其他階段作業更容易達到資源上限,而被強制離線。若超過此設定值,則
會出現錯誤訊息 ORA-02390: exceeded COMPOSITE_LIMIT, you are being logged off,同時進行中
的交易將會被退回,階段作業也會被強制登出。
SQL> connect / as sysdba
Connected.
SQL> SELECT * FROM resource_cost;
RESOURCE_NAME UNIT_COST
--------------------------------------------------- ----------------
CPU_PER_SESSION 0
LOGICAL_READS_PER_SESSION 0
CONNECT_TIME 0
PRIVATE_SGA 0
SQL> ALTER RESOURCE COST
2 CPU_PER_SESSION 10
3 CONNECT_TIME 1;
Resource cost altered.
SQL> SELECT * FROM resource_cost;
RESOURCE_NAME UNIT_COST
----------------------------------------------------- -----------------
CPU_PER_SESSION 10
LOGICAL_READS_PER_SESSION 0
CONNECT_TIME 1
PRIVATE_SGA 0
/*複合限制=CPU_PER_SESSION*10+LOGICAL_READS_PER_SESSION*0+CONNECT_TIME*1+PRIV
ATE_SGA*0 */
Chapter	7	User	And	Privilege	
Oracle	Database	11g	資料庫管理入門	
7.2.3 建立、修改、刪除設定檔(Create、Alter、Drop Profile)
建立設定檔使用 CREATE PROFILE 指令。資料庫管理者不需要將設定所有的參數,只要設定那些與
DEFAULT 設定檔不同的設定值即可,因為未設定的參數預設值為 DEFAULT(參考 DEFAULT 設定檔的
參數值)。
SQL> connect / as sysdba
Connected.
--建立一個測試使用者FRANK
SQL> CREATE USER frank IDENTIFIED BY oracle;
SQL> SELECT username,profile FROM dba_users WHERE username='FRANK';
USERNAME PROFILE
------------------------------ ------------------------------
FRANK DEFAULT --因為沒有指定設定檔,所以Oracle資料庫自動指派DEAFULT設定檔
--建立一個設定檔TEST_PROF3
SQL> CREATE PROFILE test_prof3 LIMIT
2 PASSWORD_LIFE_TIME 100
3 PASSWORD_REUSE_MAX 5
4 PASSWORD_REUSE_TIME 10
5 CPU_PER_SESSION 1000
6 LOGICAL_READS_PER_SESSION 10000;
SQL> SELECT resource_name,limit FROM dba_profiles WHERE profile='TEST_PROF3';
Chapter	7	User	And	Privilege	
Oracle	Database	11g	資料庫管理入門	
RESOURCE_NAME LIMIT
------------------------------------------------------ ----------------------------------------
COMPOSITE_LIMIT DEFAULT --參照DEFUALT設定檔的內容
SESSIONS_PER_USER DEFAULT
CPU_PER_SESSION 1000
CPU_PER_CALL DEFAULT
LOGICAL_READS_PER_SESSION 10000
LOGICAL_READS_PER_CALL DEFAULT
IDLE_TIME DEFAULT
CONNECT_TIME DEFAULT
PRIVATE_SGA DEFAULT
FAILED_LOGIN_ATTEMPTS DEFAULT
PASSWORD_LIFE_TIME 100
PASSWORD_REUSE_TIME 10
PASSWORD_REUSE_MAX 5
PASSWORD_VERIFY_FUNCTION DEFAULT
PASSWORD_LOCK_TIME DEFAULT
PASSWORD_GRACE_TIME DEFAULT
SQL> ALTER USER frank PROFILE test_prof3; --指派給FRANK使用
SQL> SELECT username,profile FROM dba_users WHERE username='FRANK';
USERNAME PROFILE
------------------------------ ------------------------------
FRANK TEST_PROF3
修改設定檔使用 ALTER PROFILE 指定。不過當修改設定檔後,修改後的內容只對之後建立的階段作業
生效,目前已經建立的階段作業不受影響。
SQL> connect / as sysdba
Connected.
--修改TEST_PROF3的一些設定值
SQL> ALTER PROFILE test_prof3 LIMIT
2 SESSIONS_PER_USER 5
3 CONNECT_TIME 60;
SQL> SELECT resource_name,limit FROM dba_profiles WHERE profile='TEST_PROF3';
RESOURCE_NAME LIMIT
------------------------------------------------------ ----------------------------------------
COMPOSITE_LIMIT DEFAULT
SESSIONS_PER_USER 5 --修改後的設定值
CPU_PER_SESSION 1000
CPU_PER_CALL DEFAULT
LOGICAL_READS_PER_SESSION 10000
LOGICAL_READS_PER_CALL DEFAULT
IDLE_TIME DEFAULT
CONNECT_TIME 60 --修改後的設定值
PRIVATE_SGA DEFAULT
FAILED_LOGIN_ATTEMPTS DEFAULT
PASSWORD_LIFE_TIME 100
PASSWORD_REUSE_TIME 10
PASSWORD_REUSE_MAX 5
PASSWORD_VERIFY_FUNCTION DEFAULT
PASSWORD_LOCK_TIME DEFAULT
Chapter	7	User	And	Privilege	
Oracle	Database	11g	資料庫管理入門	
PASSWORD_GRACE_TIME DEFAULT
刪除設定檔使用 DROP PROFILE 指令。如果被刪除的設定檔已經指派給某個使用者,則需要使用 DROP
PROFILE CASCADE。如果某個使用者所使用的設定檔被刪除後,則 Oracle 資料庫自動將 DEFAULT
設定檔指派給該使用者,所以每個使用者一定會被指派一個設定檔,同時 DEFAULT 設定檔不會被刪除。
SQL> connect / as sysdba
Connected.
SQL> SELECT DISTINCT profile FROM dba_profiles;
PROFILE
------------------------------
WKSYS_PROF
PROF_1
TEST_PROF3
TEST_PROF
DEFAULT
TEST_PROF2
SQL> DROP PROFILE "DEFAULT"; --DEFAULT設定檔不能被刪除
DROP PROFILE "DEFAULT"
*
ERROR at line 1:
ORA-02381: cannot drop PUBLIC_DEFAULT profile
SQL> DROP PROFILE test_prof2; --因為TEST_PROF2沒有指派給任何使用者
Profile dropped.
SQL> DROP PROFILE test_prof3; --因為TEST_PROF3至少指派給一個使用者,必須加上CASCADE
DROP PROFILE test_prof3
*
ERROR at line 1:
ORA-02382: profile TEST_PROF3 has users assigned, cannot drop without CASCADE
SQL> SELECT username,profile FROM dba_users WHERE profile='TEST_PROF3';
USERNAME PROFILE
------------------------------ ------------------------------
FRANK TEST_PROF3
SQL> DROP PROFILE test_prof3 CASCADE;
Profile dropped.
--因為TEST_PROF3設定檔被刪除,所以Oracle資料庫將DEFAULT設定檔指派給FRANK
SQL> SELECT username,profile FROM dba_users WHERE username='FRANK';
USERNAME PROFILE
------------------------------ ------------------------------
FRANK DEFAULT
7.3 使用者(User)
建立一個資料庫使用者,需要一個重要的系統權限:CREATE USER。當擁有 CREATE USER 權限後,
任何人都可以建立資料庫使用者。所以不要隨便將 CREATE USE 權限授與給不需要的人,以免造成資料
Chapter	7	User	And	Privilege	
Oracle	Database	11g	資料庫管理入門	
庫的安全漏洞。當一個使用者被建立的同時,一個與使用者同名的綱要(Schema)也一起被建立。綱要與
使用者為兩個不同的物件,但是兩者有著密不可分的關係,即所有放在某綱要下的物件,便是與綱要相同
名字的使用者所擁有。同時只要是某個使用者所擁有的物件,一定會出現在同名的綱要內。所以綱要可以
視為一個邏輯的容器,裡面放著同名使用者擁有的所有物件。所以當執行 CREATE TABLE frank.T1 指
令時,frank 指的是 frank 綱要,而不是 frank 這個使用者。不過因為放在 frank 綱要下的物件,就是
frank 使用者所擁有的物件,所以有些人便將綱要與使用者混為一談,因此這裡要分清處它倆的差異。
7.3.1 建立新使用者(Create a New User)
當 Oracle 資料庫建立後,有許多的使用者帳戶會自動建立,例如:SYS、SYSTEM、SYSMAN、
DBSNMP 等。不過這些使用者是資料庫管理用的帳戶,並不是讓一般應用程式登入資料庫所使用。
其中最重要的一個使用者為 SYS。因為資料辭典的表格都放在 SYS 綱要中,同時從 Oracle Database9i
開始,SYS 必須以 AS SYSDBA 身份登入。否則為出現錯誤訊息,而無法登入。
當然還有一個重要使用者叫做 SYSTEM,因為 SYSTEM 被授與 DBA 角色,所以可以用來一般的資料庫
管理工作。除非 SYSTEM 使用者無法做到某些資料庫操作,例如開啟、關閉執行處理,建立資料庫或備
份、復原資料庫等工作,這時才會使用 SYS 帳號,不然一般使用 SYSTEM 帳號管理資料庫即可。
至於 SYSMAN 與 DBSNMP 這兩個使用者,只有當資料庫有設定資料庫控制(Database Control)時,才
會有這兩個使用者存在。
因此資料庫管理者必須建立一些使用者,讓前端應用程式可以使用這些帳戶登入資料庫。不過在建立資料
庫使用者之前,管理者要先回答下列問題,例如:使用者的預設表格空間與暫時表格空間為何?以及密碼
管理與資源限制的設定檔為何?,如此才能正確地設定使用者的相關參數。
預設表格空間(Default Tablespace)
當使用者建立一個新區段(Segment)時,若沒有指定該區段所使用的表格空間,則 Oracle 資料庫自動將
該區段建立在使用者的預設表格空間內。但是如果建立使用者時,連管理者也沒有設定預設表格空間參數,
則 Oracle 資料庫會使用資料庫的預設表格空間當作該使用者的預設表格空間。不過要注意,預設表格空
間只能使用表格空間的內容為永久型態的表格空間,不然將會出現錯誤訊息’ORA-12910: cannot
specify temporary tablespace as default tablespace’或’ORA-30033: Undo tablespace cannot
be specified as default user tablespace’。
同時當使用者想要建立某種區段時,必須擁有建立該種區段的權限(例如:建立表格需要 CREATE
TABLE 權限),以及對區段所在的表格空間還有足夠的配額。即便是使用者的預設表格空間也不能例外,
必須要有配額才能使用該表格空間的空間。
暫時表格空間(Temporary Tablespace)
當使用者的 SELECT 指令中包含 DISTINCT 子句、使用 GROUPING FUNCTION、GROUP BY 子句或
ORDER BY 等指令,或執行 CREATE INDEX 等 SQL 指令時,都需要進行一些排序(Sort)操作。此時如
Chapter	7	User	And	Privilege	
Oracle	Database	11g	資料庫管理入門	
果階段作業的 PGA 空間夠大,則可以在記憶體中進行排序稱作記憶體排序(Memory Sort)。然而可能因
為需要排序的資料過多或 PGA 空間不足,因此需要將資料先存放到暫時區段,然後才進行排序,此種方
式稱做磁碟排序(Disk Sort)。
所以建立使用者時,資料庫管理者可以設定使用者進行磁碟排序時,暫時區段所使用的暫時表格空間。若
管理者沒有指定,則 Oracle 資料庫自動將資料庫的預設暫時表格空間設定為使用者的暫時表格空間。不
過在指定暫時表格空間時,所使用的表格空間的內容必須是暫時型態,否則將會出現錯誤訊息’ORA-
12911: permanent tablespace cannot be temporary tablespace’。
SQL> connect / as sysdba
Connected.
SQL> SELECT property_name,property_value FROM database_properties
2 WHERE property_name LIKE '%TABLESPACE';
PROPERTY_NAME PROPERTY_VALUE
------------------------------------------------------ --------------------------------------------------
DEFAULT_TEMP_TABLESPACE TEMPTS1
DEFAULT_PERMANENT_TABLESPACE USERS
SQL> SELECT tablespace_name,contents FROM dba_tablespaces;
TABLESPACE_NAME CONTENTS
------------------------------ -------------------
SYSTEM PERMANENT
SYSAUX PERMANENT
UNDOTBS UNDO
TEMPTS1 TEMPORARY
USERS PERMANENT
TEMPFRANK TEMPORARY
BIGTS_NEW PERMANENT
DEMOTS PERMANENT
TEMP TEMPORARY
/*只有CONTENTS為PERMANENT的表格空間可以當作預設表格空間。CONTENTS為TEMPORARY的表格
空間才能當作暫時表格空間。*/
SQL> SELECT DISTINCT profile FROM dba_profiles;
PROFILE
------------------------------
WKSYS_PROF
DEFAULT
TEST_PROF
/*建立使用者時,若未指定設定檔,則Oracle資料庫自動選擇Default設定檔,為此使用者的密碼與資源限制
設定檔。*/
建立使用者
建立資料庫使用者指令相當簡單,只要擁有 CREATE USER 的系統權限,便可以使用 CREATE USER 的
SQL 指令或資料庫控制(Database Control)建立一個資料庫使用者。
SQL> connect / as sysdba
Connected.
SQL> DROP USER frank CASCADE; --清除之前的測試使用者
Chapter	7	User	And	Privilege	
Oracle	Database	11g	資料庫管理入門	
密碼驗證
SQL> CREATE USER frank --不能與現存的使用者或角色相同名字
2 IDENTIFIED BY oracle --使用密碼驗證
3 DEFAULT TABLESPACE demots --當建立區段卻未指定所在表格空間時,將區段建立在此表格空間
4 TEMPORARY TABLESPACE temp --當需要暫時區段時,將暫時區段建立在此表格空間內
5 QUOTA 10M ON users --最多可以使用多少的空間,每個表格都要設定
6 QUOTA 10M ON demots
7 PASSWORD EXPIRE --讓密碼僅能使用在第一次登入時,之後立刻要求使用者更改密碼
8 ACCOUNT LOCK --當使用者被鎖定後,根本不能登入資料庫,直到解除鎖定為止
9 PROFILE TEST_PROF --密碼管理與資源使用限制受到此設定檔影響
10 ;
作業系統驗證
當欲使用作業系統驗證時,首先要確定兩件事:OS_AUTHENT_PREFIX 的值與作業系統使用者名字。因
為資料庫使用者名字必須為這兩個值結合後的結果,例如 OS_AUTHENT_PREFIX=ops$而作業系統使用
者為 frank,則資料庫使用者為 OPS$FRANK。不過如果 OS_AUTHENT_PREFIX 的參數值變更為 UUU
後,原來可以使用作業系統驗證登入的使用者便無法登入,因為所產生的資料庫使用者名字變為
UUUFRANK,這個使用者名字並不存在於資料庫中。
SQL> SHOW PARAMETER os_authent_prefix
NAME TYPE VALUE
------------------------------------------ ----------- ----------
os_authent_prefix string ops$
SQL> SELECT DISTINCT osuser FROM v$session; --找出目前所有階段作業在作業系統中所有的名字
OSUSER
------------------------------
oracle
SQL> CREATE USER ops$frank --frank為作業系統的使用者名字
2 IDENTIFIED EXTERNALLY; --外部驗證
--若作業系統為Windows平台系列
--SQLNET.ORA檔案中有SQLNET.AUTHENTICATION_SERVICE=(NTS),這是預設值
SQL> create user "OPS$FRANK11GADMINISTRATOR" identified externally;
/*作業系統使用者名字為Domain_nameUsername,如果沒有加入網域,網域名字以機器名稱代替。因為為
不是合法的命名字元,所以整個資料庫名字必須用雙引號包起來,同時資料庫使用者名字必須使用大寫英文字
母。
若想移除網域名字,需要將OSAUTH_PREFIX_DOMAIN=FALSE加到Windows Registry中*/
全域驗證
SQL> CREATE USER global_frank
2 IDENTIFIED GLOBALLY AS 'CN=frank,OU=Education,O=UUU,C=TW'; --全域驗證
使用者密碼
SQL> SELECT username,password,account_status
2 FROM dba_users
Chapter	7	User	And	Privilege	
Oracle	Database	11g	資料庫管理入門	
3 WHERE username LIKE '%FRANK%';
USERNAME PASSWORD ACCOUNT_STATUS
------------------------------ ----------------------------------- --------------------------------
OPS$FRANK EXTERNAL OPEN
FRANK EXPIRED & LOCKED
GLOBAL_FRANK GLOBAL OPEN
/*Oracle Database 11g後會安全起見,在此欄位上無法看到加密後的密碼字串。如果需要察看密碼字串,可
以由sys.user$.password得知。當ACCOUNT_STATUS為EXPIRED表示密碼已經失效,下一次登入資料庫
時會被要求更改密碼。若ACCOUNT_STATUS為LOCKED,則不能登入資料庫。*/
SQL> SELECT name,password FROM sys.user$ WHERE name='FRANK';
NAME PASSWORD
------------------------------ ------------------------------
FRANK 8A52535A7428572D --是由username+password本文,經雜湊運算後的密文
Chapter	7	User	And	Privilege	
Oracle	Database	11g	資料庫管理入門	
帳戶鎖定與密碼失效
當使用者帳戶被鎖定後,使用者便無法登入資料庫,這是當使用者長期不需要登入資料庫時,最安全的一
種處置。
[oracle@ELinux ~]$ sqlplus frank/oracle
ERROR:
ORA-28000: the account is locked
然而如果帳戶沒有被鎖定,則使用者登入資料庫時,通過身份辨識後,Oracle 資料庫就會檢查使用者密
碼是否失效,若為失效狀態。則會出現要求更改密碼的畫面,使用者必須遵守設定檔的密碼限制來更改密
Chapter	7	User	And	Privilege	
Oracle	Database	11g	資料庫管理入門	
碼,否則將一直僵持在更改密碼畫面。 當密碼失效檢查通過後,接著 Oracle 資料庫檢查使用者是否擁有
CREATE SESSION 權限,若有 CREATE SESSION 權限則建立階段作業。
[oracle@ELinux ~]$ sqlplus frank/oracle
ERROR:
ORA-28001: the password has expired
Changing password for frank
New password: abc123
Retype new password: abc123
ERROR:
ORA-01045: user FRANK lacks CREATE SESSION privilege; logon denied --無法建立階段作業
Password changed --表示密碼已經改變為abc123。
/*但在Oracle11g之前的版本,都會出現password unchanged,但密碼已更改的情況。*/
配額(Quota)
配額用來限制使用者對每個表格空間的使用量,當配額超過或沒有設定配額時,使用者將無法增加對表格
空間的使用。這樣可以避免使用者意外地消耗過多表格空間的空間,也可以減少使用者將區段放置到錯誤
的表格空間中的機會。當建立使用者時,若沒有設定任何配額。則表示該使用者沒有任何的配額,也就是
Chapter	7	User	And	Privilege	
Oracle	Database	11g	資料庫管理入門	
說使用者不能使用任何表格空間的空間。資料庫管理者可以藉由 DBA_TS_QUOTAS 查知使用者空間配
額與表格空間的關係。
SQL> CONNECT / AS SYSDBA
Connected.
SQL> CREATE USER test_user1 IDENTIFIED BY oracle;
User created.
SQL> GRANT CREATE SESSION,CREATE TABLE TO test_user1;
Grant succeeded.
SQL> CONNECT test_user1/oracle; --切換身份為test_user1
SQL> CREATE TABLE t1 (a NUMBER) ;
CREATE TABLE t1 (a NUMBER)
*
ERROR at line 1:
ORA-01950: no privileges on tablespace 'USERS'
/*這個錯誤訊息說明test_user1根本沒有設定任何配額在表格空間users上 */
SQL> CONNECT / AS SYSDBA
Connected.
SQL> ALTER USER test_user1 QUOTA 1M ON USERS; --給與test_user1有1M的配額在users表格空間中
SQL> SELECT tablespace_name,bytes,max_bytes FROM dba_ts_quotas
2 WHERE username='TEST_USER1';
TABLESPACE_NAME BYTES MAX_BYTES
------------------------------ ---------- ------------------
USERS 0 1048576
/*BYTES為已使用的空間。MAX_BYTES為配額上限,若為-1表示為無限制(UNLIMITED)*/
SQL> CREATE TABLE test_user1.t1 (a NUMBER) ;
/*因為表格放在test_user1綱要中,所以使用的空間配額為test_user1的配額。同時因為未指定表格空間,所
以使用test_user1的預設表格空間放此表格。*/
SQL> SELECT tablespace_name,bytes,max_bytes FROM dba_ts_quotas
2 WHERE username='TEST_USER1';
TABLESPACE_NAME BYTES MAX_BYTES
------------------------------ ---------- ------------------
USERS 65536 1048576
/*已用掉65536(64K)的空間配額*/
SQL> INSERT INTO test_user1.t1 VALUES(1);
Chapter	7	User	And	Privilege	
Oracle	Database	11g	資料庫管理入門	
SQL> COMMIT;
SQL> SELECT * FROM test_user1.t1;
A
-----------
1
當配額小於已使用空間時,只是表示此使用者不能再新增使用空間在此表格空間。而不會刪除任何已存在
表格或資料。
SQL> ALTER USER test_user1 QUOTA 0 ON users; --將表格空間users的配額設為0
SQL> SELECT tablespace_name,bytes,max_bytes FROM dba_ts_quotas
2 WHERE username='TEST_USER1';
no rows selected
SQL> CREATE TABLE test_user1.t2(a NUMBER) TABLESPACE users;
CREATE TABLE test_user1.t2(a NUMBER) TABLESPACE users
*
ERROR at line 1:
ORA-01536: space quota exceeded for tablespace 'USERS'
/*已使用的空間超過表格空間的配額,這個錯誤訊息與沒有設定配額是不同的錯誤訊息。*/
SQL> SELECT * FROM test_user1.t1; --已經存在的表格,不會因為配額因素而被刪除
A
-----------
1
7.2.2 修改使用者設定(Alter User)
當使用者建立後,除了使用者名字不能更改外,其餘的的設定都可以使用 ALTER USER 指令修改。
SQL> connect / as sysdba
Connected.
SQL> SELECT username,account_status FROM dba_users WHERE username='FRANK';
USERNAME ACCOUNT_STATUS
------------------------------ --------------------------------
FRANK EXPIRED & LOCKED -- 帳戶被鎖定以及密碼失效
SQL> ALTER USER frank ACCOUNT UNLOCK; --解除帳戶鎖定
SQL> SELECT username,account_status FROM dba_users WHERE username='FRANK';
USERNAME ACCOUNT_STATUS
------------------------------ --------------------------------
FRANK EXPIRED --密碼還是失效
SQL> ALTER USER frank IDENTIFIED BY oracle; --重新指派新密碼給frank
SQL> SELECT username,account_status FROM dba_users WHERE username='FRANK';
USERNAME ACCOUNT_STATUS
Chapter	7	User	And	Privilege	
Oracle	Database	11g	資料庫管理入門	
------------------------------ --------------------------------
FRANK OPEN --使用者可以登入且密碼有效
SQL> ALTER USER frank DEFAULT TABLESPACE users
2 QUOTA 20M ON users QUOTA 0 ON demots; --更改使用者對表格空間的配額設定
SQL> ALTER USER frank PROFILE default; --要求frank使用default設定檔
7.2.3 刪除使用者(Drop User)
當使用者暫時不需要登入資料庫時,只需將其鎖定即可。但是如果使用者已不再需要存在時,建議將它刪
除,以免留下一個資料庫安全的漏洞。根據是否有綱要物件存在,決定刪除使用者的語法。一但使用者被
刪除後,所有這個使用者擁有的物件都會一併被刪除,由於 DROP USER 為 DDL 指令,不能被退回
(Rollback),所以執行 DROP USER 指令時千萬要三思而後行。同時刪除使用者為資料庫中重要且危險的
工作,需要被授與 DROP USER 權限才可以執行 DROP USER 的操作。
SQL> connect / as sysdba
Connected.
SQL> DROP USER wilson; --因為WILSON綱要中沒有任何綱要物件存在。
User dropped.
SQL> DROP USER linda;
DROP USER linda
*
ERROR at line 1:
ORA-01922: CASCADE must be specified to drop 'LINDA'
/*因為LINDA綱要中有至少一個綱要物件存在。這是提供一個機會,讓管理者知道這個使用者的綱要中,還有
一些物件存在。可以再確認後,才繼續刪除使用者。*/
SQL> SELECT object_name,object_type FROM dba_objects WHERE owner='LINDA';
OBJECT_NAME OBJECT_TYPE
------------------------------ -------------------
T2 TABLE
T1 VIEW
/*發現LINDA擁有這兩個物件。*/
SQL> DROP USER LINDA CASCADE; --CASACDE參數會先將所有的綱要物件刪除後,才刪除使用者。
User dropped.
/*所有屬於LINDA的物件都隨著使用者刪除而一併被刪除。*/
SQL> DROP USER gigi; --如果GIGI已經建立至少一個階段作業時,Oracle資料庫無法刪除連線中的使用者
DROP USER gigi
*
ERROR at line 1:
ORA-01940: cannot drop a user that is currently connected
Chapter	7	User	And	Privilege	
Oracle	Database	11g	資料庫管理入門	
7.2.4 代理使用者(Proxy User)
代理使用者允許使用者依自己的帳號與密碼登入資料庫,但建立階段作業後,使用者的身份卻變成另一個
使用者。這個功能早在 Oracle Database8i 時就已經存在,只是當時只能用在 OCI 呼叫所撰寫的程式中,
Oracle Database9i 再延伸到使用 JAVA 所撰寫的程式,直到 Oracle Database10g R2 後,才能用在
SQL*PLUS 的環境中。
SQL> connect / as sysdba
Connected.
SQL> CREATE USER app_user IDENTIFIED BY app_user;
User created.
SQL> GRANT CREATE SESSION TO app_user;
Grant succeeded.
SQL> CREATE USER client_user1 IDENTIFIED BY client_user1
2> QUOTA 10M ON users;
User created.
SQL> GRANT CREATE SESSION,CREATE TABLE TO client_user1;
Grant succeeded.
SQL> ALTER USER client_user1 GRANT CONNECT THROUGH app_user;
User altered.
SQL> CREATE TABLE client_user1.test_tab(a NUMBER);
Table created.
SQL> INSERT INTO client_user1.test_tab VALUES(1);
1 row created.
SQL> COMMIT;
Commit complete.
/*使用一般的方式登入*/
SQL> CONNECT app_user/app_user
Connected.
SQL> SHOW USER
USER is "APP_USER"
SQL> SELECT * FROM client_user1;
SELECT * FROM client_user1
*
ERROR at line 1:
ORA-00942: table or view does not exist
--使用代理使用者登入,以app_user的帳號與密碼登入,但登入後身份卻為client_user1
SQL> CONNECT app_user[client_user1]/app_user
Connected.
SQL> SHOW USER
Chapter	7	User	And	Privilege	
Oracle	Database	11g	資料庫管理入門	
USER is "CLIENT_USER1" --雖然以app_user身份登入,但使用者身份卻為client_user1
SQL> SELECT * FROM test_tab;
A
-----------
1
7.4 權限(Privilege)
在 Oracle 資料庫中,為了保護資料庫中的資料,Oracle 資料庫採用正面表列的方式,即藉由權限
(privilege)的授與,控制使用者所能執行的操作,如果沒有被授與權限或權限被收回,則無法進行相關的
操作。因此當一個新的使用者被建立後,預設是沒有任何權限,也就是一開始使用者無法做任何事,直到
被授與適當的權限為止。整個 Oracle 資料庫將所有的權限分為系統權限與物件權限兩種。
7.4.1 系統權限(System Privilege)
Oracle 資料庫的系統權限用來給予使用者可以對資料庫進行某些特殊管理操作,例如:建立使用者
(CREATE USER)、建立表格(CREATE TABLE)、查詢任何綱要中的表格(SELECT ANY TABLE)等動作。
系統權限的個數有隨著 Oracle 資料庫版本的增加而增多的趨勢,例如: 在 Oracl9i 時僅有 126 種系統權
限,而 Oracle10g 已增加到 166 種系統權限,但 Oracle11g 竟然有多達 206 種系統權限。
ANY SCHEMA
有時候資料庫管理者會看到兩個系統權限非常的相似,只差了一個字:ANY,例如 CREATE TABLE 與
CREATE ANY TABLE。有加上 ANY 與非有 ANY 的系統權限的差別,在於有 ANY 的系統權限範圍可
以跨越綱要。例如:被授與 CREATE TABLE 權限的使用者,可以建立表格在自己的綱要中。然而被授
與 CREATE ANY TABLE 的使用者,則可以建立表格在任何綱要中。至於 ANY 是否包含 SYS 綱要,則
根據參數 O7_DICTIONARY_ACCESSIBILITY 的值決定。若
Chapter	7	User	And	Privilege	
Oracle	Database	11g	資料庫管理入門	
O7_DICTIONARY_ACCESSIBILITY=FALSE,則 ANY 設定不包含 SYS 綱要。反之若為 TRUE,則
ANY 有包含 SYS 綱要。
不過為保護 SYS 綱要資料辭典(Data Dictionary)安全,自從 Oracle Database 9i 開始
O7_DICTIONARY_ACCESSIBILITY 預設值變為 FALSE。若有使用者因為工作需要,必須查詢資料辭
典內容,資料庫管理者可以透過授與 SELECT_CATALOG_ROLE 角色或授與 SELECT ANY
DICTIONARY 給該使用者,便可以讓使用者查詢資料辭典的內容。
SELECT ANY DICTIONARY 是 Oracle Database 9i 所新增的系統權限,可以讓使用者查詢所有的資料
辭典與資料辭典視觀圖。這種做法相對輕鬆,但是也隱含資安漏洞,因為是任何的資料辭典表格與視觀圖。
因為 SELECT_CATALOG_ROLE 是由物件權限所組成的,這些物件是資料辭典視觀圖(Data Dictionary
View),所以當使用者想要查詢的資料辭典或資料辭典視觀圖不在 SELECT_CATALOG_ROLE 的授權範
圍時,則無法查詢,此時需要額外的授權。這樣雖然比較麻煩,但是對整體資料庫安全而言是相對正確的
做法。
SQL> CONNECT / AS SYSDBA
SQL> SHOW PARAMETER O7_DICTIONARY_ACCESSIBILITY
NAME TYPE VALUE
------------------------------------------------------ ----------- ------------------------------
O7_DICTIONARY_ACCESSIBILITY boolean FALSE
SQL> GRANT CREATE SESSION TO gigi IDENTIFIED BY oracle; --建立測試使用者gigi
SQL> CONNECT gigi/oracle
Connected.
SQL> SHOW USER
USER is "GIGI"
SQL> SELECT * FROM session_privs;
PRIVILEGE
----------------------------------------
CREATE SESSION
SQL> SELECT COUNT(*) FROM hr.employees;
SELECT COUNT(*) FROM hr.employees
*
ERROR at line 1:
ORA-00942: table or view does not exist
/*Oracle 資料庫為增加安全性,當查詢某個表格或視觀圖時,不管是沒有查詢權限還是根本沒有該物件,錯
誤訊息都會出現為ORA-00942:表格或視觀圖不存在,以避免讓有不良企圖的使用者得知物件存在,只是沒
有權限而已。*/
SQL> CONNECT system/oracle
Connected.
SQL> GRANT SELECT ANY TABLE TO gigi;
/*SELECT ANY TABLE可以查詢任何綱要的表格或視觀圖。*/
SQL> CONNECT gigi/oracle
Connected.
SQL> SELECT * FROM session_privs; --SESSION_PRIVS可以查知目前可以使用那些系統權限
PRIVILEGE
----------------------------------------
Chapter	7	User	And	Privilege	
Oracle	Database	11g	資料庫管理入門	
CREATE SESSION
SELECT ANY TABLE
SQL> SELECT COUNT(*) FROM hr.employees; --需要安裝範例綱要
COUNT(*)
---------------
107
SQL> SELECT COUNT(*) FROM sh.sales; --需要安裝範例綱要
COUNT(*)
---------------
918843
SQL> SELECT COUNT(*) FROM dba_tables;
SELECT COUNT(*) FROM dba_tables
*
ERROR at line 1:
ORA-00942: table or view does not exist
/* O7_DICTIONARY_ACCESSIBILTY=FALSE時,ANY不包含SYS綱要,所以SELECT ANY TABLE無法
查詢到資料辭典視觀圖。*/
SQL> SELECT COUNT(*) FROM sys.tab$;
SELECT COUNT(*) FROM sys.tab$
*
ERROR at line 1:
ORA-00942: table or view does not exist
/* O7_DICTIONARY_ACCESSIBILTY=FALSE時,ANY不包含SYS綱要,所以SELECT ANY TABLE無法
查詢到資料辭典表格。*/
SQL> CONNECT / AS SYSDBA
Connected.
SQL> GRANT SELECT ANY DICTIONARY TO gigi;
Grant succeeded.
SQL> REVOKE SELECT ANY TABLE FROM gigi;
Revoke succeeded.
SQL> CONNECT gigi/oracle
Connected.
SQL> SELECT * FROM session_privs;
PRIVILEGE
----------------------------------------
CREATE SESSION
SELECT ANY DICTIONARY
SQL> SELECT COUNT(*) FROM hr.employees;
SELECT COUNT(*) FROM hr.employees
*
ERROR at line 1:
ORA-00942: table or view does not exist
SQL> SELECT COUNT(*) FROM dba_tables;
Chapter	7	User	And	Privilege	
Oracle	Database	11g	資料庫管理入門	
COUNT(*)
---------------
2522
SQL> SELECT COUNT(*) FROM sys.tab$;
COUNT(*)
---------------
2587
SQL> CONNECT system/oracle
Connected.
SQL> REVOKE SELECT ANY DICTIONARY FROM gigi;
Revoke succeeded.
SQL> GRANT SELECT_CATALOG_ROLE TO gigi;
Grant succeeded.
SQL> CONNECT gigi/oracle
Connected.
SQL> SELECT * FROM session_privs;
PRIVILEGE
----------------------------------------
CREATE SESSION
SQL> SELECT * FROM session_roles;
ROLE
------------------------------
CONNECT
SELECT_CATALOG_ROLE
HS_ADMIN_ROLE
SQL> SELECT COUNT(*) FROM hr.employees;
SELECT COUNT(*) FROM hr.employees
*
ERROR at line 1:
ORA-00942: table or view does not exist
SQL> SELECT COUNT(*) FROM dba_tables;
COUNT(*)
---------------
2522
SQL> SELECT COUNT(*) FROM sys.tab$;
SELECT COUNT(*) FROM sys.tab$
*
ERROR at line 1:
ORA-00942: table or view does not exist
由以上的範例得知,SELECT ANY TABLE 無法查詢資料辭典表格或資料辭典視觀圖,但可以查詢除
SYS 綱要外的所有表格與視觀圖。而 SELECT ANY DICTIONARY 可以用來查詢資料辭典表格或資料辭
Chapter	7	User	And	Privilege	
Oracle	Database	11g	資料庫管理入門	
典視觀圖,但卻無法用來非 SYS 綱要外的表格或視觀圖上。因此資料庫管理者在授與 SELECT ANY
TABLE 與 SELECT ANY DICTIONARY 時,要依據使用者的需求授與其適當的權限即可。
7.4.2 物件權限(Object Privilege)
物件權限是給予使用者對某個綱要物件進行某種操作的權限,物件權限依不同的物件型態有不同的物件權
限。例如:表格物件有 ALTER、DELETE、INDEX、INSERT、SELECT、UPDATE、REFERENCES、
ON COMMIT REFRESH、QUERY REWRITE、DEBUG、FLASHBACK 等 11 種權限,而函數
(Function)物件或程序(Procedure)物件則有 EXECUTE 與 DEBUG 兩種。在 Oracle Database 11g 時,
共有 26 種不同型態的物件權限。
7.4.3 授與權限(Grant Privilege)
使用 GRANT 指令,可以權限授與使用者、角色或 PUBLIC。PUBLIC 是一種特殊的角色,代表著資料庫
的所有人。一但權限授與給 PUBLIC 時,所有資料庫的使用者都可以得到此權限,可以簡化授權的操作,
但是卻帶來資料庫安全的風險,一般不建議使用這種方式。
SQL> CONNECT / AS SYSDBA
SQL> GRANT CREATE SESSION to scott IDENTIFIED BY tiger; --建立一個測試使用者scott
SQL> GRANT CREATE SESSION to green IDENTIFIED BY oracle;
--授與系統權限
SQL> GRANT SELECT ANY TABLE,CREATE TABLE TO frank,scott;
/*同時將SELECT ANY TABLE,CREATE TABLE系統權限授與frank與scott兩人,這兩人僅能使用SELECT
ANY TABLE與CREATE TABLE權限,但不能授與或收回該權限。*/
Chapter	7	User	And	Privilege	
Oracle	Database	11g	資料庫管理入門	
SQL> GRANT SELECT ANY TABLE,CREATE TABLE TO frank WITH ADMIN OPTION;
/*除了將SELECT ANY TABLE,CREATE TABLE權限授與frank外,並且讓frank擁有管理SELECT ANY TA
BLE與CREATE TABLE的權力,因此frank可以將SELECT ANY TABLE或CREATE TABLE授與任何人或角
色,而且也可以由任何人或角色身上收回這兩個系統權限。*/
--授與物件權限
SQL> CREATE TABLE frank.big1 AS SELECT * FROM DBA_OBJECTS; --建立範例表格
SQL> GRANT SELECT ON frank.big1 TO scott;
/*授與frank綱要中表格big1上的SELECT權限給scott,但是scott僅能使用該權限,但不能將權限授與給他
人。*/
SQL> GRANT SELECT ON frank.big1 TO scott WITH GRANT OPTION;
/*scott除了自己被授與frank綱要的big1表格上的SELECT 權限外,還可以將該權限授權給其他人。*/
SQL> CONNECT scott/tiger --切換身份為scott
SQL> GRANT SELECT ON frank.big1 TO green; --scott將frank.big1的SELECT權限授與green
7.4.4 收回權限(Revoke Privilege)
權限既然可以被授與,當然也可以被收回。不過當收回權限時,依系統權限與物件權限有不同的方法。首
先收回系統權限時,使用者必須擁有該系統權限的 ADMIN OPTION,才能收回該系統權限。可以由
DBA_SYS_PRIVS 中查知系統權限授權給哪些人或哪些角色。
SQL> CONNECT / AS SYSDBA
SQL> SELECT grantee,admin_option FROM dba_sys_privs
2 WHERE privilege='SELECT ANY TABLE';
GRANTEE ADM
------------------------------------------------------ -------
DBA YES
MDSYS NO
SYS YES
IMP_FULL_DATABASE NO
WKSYS NO
EXP_FULL_DATABASE NO
DATAPUMP_IMP_FULL_DATABASE NO
OLAP_DBA NO
FLOWS_030000 NO
SYSTEM NO
OLAPSYS NO
FRANK YES
SQL> REVOKE SELECT ANY TABLE FROM frank; --將SELECT ANY TABLE由frank身上收回
Revoke succeeded.
SQL> SELECT grantee,admin_option FROM dba_sys_privs
2 WHERE privilege='SELECT ANY TABLE';
GRANTEE ADM
------------------------------------------------------ -------
DBA YES
MDSYS NO
SYS YES
IMP_FULL_DATABASE NO
WKSYS NO
EXP_FULL_DATABASE NO
Chapter	7	User	And	Privilege	
Oracle	Database	11g	資料庫管理入門	
DATAPUMP_IMP_FULL_DATABASE NO
OLAP_DBA NO
FLOWS_030000 NO
SYSTEM NO
OLAPSYS NO
/* frank不在擁有SELECT ANY TABLE權限*/
重疊收回(CASCADE REVOKE)
當物件權限被收回時,有一種系統權限沒有的特色:重疊收回。即收回某使用者被授與的物件權限時,所
有由該使用者所授權出去的物件權限都會被一起收回,而系統權限則須一個個的收回。不過如果欲收回的
物件權限不是由收回者所直接授與,則無法收回該物件權限。可以由
DBA_TAB_PRIVS/ALL_TAB_PRIVS/USER_TAB_PRIVS 查知物件權限的階層關係。
SQL> CONNECT / AS SYSDBA
--查詢哪些人被授與frank.big1表格的SELECT權限
SQL> SELECT grantee,grantor,grantable FROM dba_tab_privs
2 WHERE owner='FRANK' AND table_name='BIG1';
GRANTEE GRANTOR GRA
------------------------------ ----------------------------------- -------
SCOTT FRANK YES
GREEN SCOTT NO
/*可以得知FRANK授權給SCOTT,而SCOTT再將權限授權給GREEN。關係為FRANK->SCOTT->GREEN*/
SQL> CONNECT frank/oracle --身份切換為frank
Connected.
SQL> SHOW USER
USER is "FRANK"
SQL> REVOKE SELECT ON frank.big1 FROM green;
REVOKE SELECT ON frank.big1 FROM green
*
ERROR at line 1:
ORA-01927: cannot REVOKE privileges you did not grant
/*green的權限來自於scott,只能由scott收回green的權限。或者藉由CASCADE REVOKE機制,收回scott
的權限時,會先將green的權限收回。*/
SQL> SELECT grantee,grantor,grantable FROM user_tab_privs
2 WHERE table_name='BIG1';
GRANTEE GRANTOR GRA
------------------------------ ----------------------------------- -------
SCOTT FRANK YES
GREEN SCOTT NO
SQL> REVOKE SELECT ON big1 FROM scott;
Revoke succeeded.
SQL> SELECT grantee,grantor,grantable FROM user_tab_privs
2 WHERE table_name='BIG1';
no rows selected
/*不僅是scott的物件權限被收回,同時由scott所授權出去的物件權限也一併被收回,這就是重疊收回(CASC
ADE REVOKE)。不過只有在收回物件權限時,才會有此現象,收回系統權限必須一個一個慢慢收回。*/
Chapter	7	User	And	Privilege	
Oracle	Database	11g	資料庫管理入門	
7.5 角色(Role)
Oracle 資料庫藉由權限的授與與收回,讓被授權的使用者只能進行被授權的操作。不過當授與或收回權
限給個別使用者時,通常需要授與或收回多次,這樣會花費資料庫管理人員大量的時間與心力。而且如果
不小心將不該授與的權限授與給不適當的使用者,或未收回不再需要某些權限,這樣反而造成資料庫安全
的漏洞。因此 Oracle 資料庫可以利用角色來達到下面幾點好處:
簡化權限管理:避免權限管理的負擔與減少錯誤發生的機會。管理者只要先建立一個角色,再將某些權限
授予給該角色,最後將角色授予給使用者,則使用者便擁有該角色所被授與的權限。
動態權限管理:當使用者所被授與的角色,其權限有所變動時。使用者自然隨著角色權限的增減,而得到
或減少所能使用的權限。這樣資料庫管理者可以經由角色權限的變動,動態地讓使用者的權限增加或減少。
有選擇性的權限使用:資料庫管理者可以藉由角色的啟用(Enable)或關閉(Disable),讓使用者暫時擁有某
些權限,或暫時失去某些權限。同時角色啟用時,可以要求驗證,只有驗證通過後,才能使用該角色所帶
來的權限。
7.5.1 建立角色(Create Role)
建立角色的指令為 CREATE ROLE,較建立使用者更為簡單。因為角色只是權限的集合,沒有一些其他
的設定。不過角色可以加上驗證機制,避免使用者隨便自行啟用角色。
• 角色有以下的幾個特點:
• 角色不能與現有角色或使用者相同名字。
• 角色為系統權限與物件權限的集合,而不是使用者的集合。
• 角色可以被授權給其他角色與使用者,或由其他角色與使用者處收回。
• 角色不能直接或間接地授權給自己。
• 角色授權與收回的 SQL 指令如同授權與收回系統權限一般。
• 角色不被任何人擁有,角色也沒有對應的綱要存在。
• 角色可以動態地啟用或關閉。
• 角色可以要求使用正確密碼才能啟動。
資料庫管理者可以由 DBA_ROLES 查知有哪些角色存在以及使否需要密碼才能啟動。
建立角色(Create Role)
Chapter	7	User	And	Privilege	
Oracle	Database	11g	資料庫管理入門	
因為角色為完成某些工作所需的權限集合,所以當建立角色時,通常以工作職稱或應用程式為角色名字。
SQL> CREATE ROLE test_role_a; --建立一個不需要驗證即可啟用的角色
SQL> CREATE ROLE test_role_b --建立一個需要驗證才能啟用的角色
2 IDENTIFIED BY oracle; --建立一個區域角色(Local Role),角色啟用透過密碼進行驗證。
/*IDENTIFIED EXTERNALLY 建立一個外部角色(External Role),角色啟用透過作業系統進行驗證。*/
/*IDENTIFIED GLOALLY 建立一個全域角色(Global Role),角色啟用透過目錄服務(Directory Service)進行
驗證。*/
/*IDENTIFIED USING package_name 建立一個應用程式角色(Application Role),角色啟用透過套件(Pack
age)進行驗證。*/
SQL> CREATE ROLE test_role_c;
SQL> SELECT * FROM dba_roles WHERE role LIKE 'TEST_ROLE_%';
ROLE PASSWORD
------------------------------ ------------------
TEST_ROLE_A NO
TEST_ROLE_B YES
TEST_ROLE_C NO
--將權限授權給角色,權限可以為物件或系統權限
SQL> GRANT CREATE PROCEDURE,CREATE ANY TABLE TO test_role_a;
SQL> GRANT SELECT ANY TABLE TO test_role_b;
SQL> GRANT CREATE MATERIALIZED VIEW TO test_role_c;
SQL> GRANT SELECT ON frank.big1 TO test_role_c;
--可以由ROLE_SYS_PRIVS查知每個角色被授與的系統權限
SQL> SELECT role,privilege,admin_option FROM role_sys_privs
2 WHERE role LIKE 'TEST_ROLE_%';
ROLE PRIVILEGE ADM
------------------------------ ---------------------------------------------- -------
TEST_ROLE_C CREATE MATERIALIZED VIEW NO
TEST_ROLE_A CREATE ANY TABLE NO
TEST_ROLE_A CREATE PROCEDURE NO
TEST_ROLE_B SELECT ANY TABLE NO
--可以由ROLE_TAB_PRIVS得到角色被授與的物件權限
SQL> SELECT role,owner,table_name,privilege,grantable
2 FROM role_tab_privs
3 WHERE role LIKE 'TEST_ROLE_%';
ROLE OWNER TABLE_NAME PRIVILEGE GRA
-------------------- --------------------- ---------------------------------- ----------------------- --------
TEST_ROLE_C FRANK BIG1 SELECT NO
--將角色授權給使用者
SQL> GRANT test_role_a,test_role_b TO frank;
SQL> GRANT test_role_c TO frank WITH ADMIN OPTION;
/*將frank不僅能使用test_role_c所帶來的權限,也可將test_role_c角色授權給其他使用者或角色,或由其他
角色或使用者處收回test_role_c角色。*/
--透過DBA_ROLE_PRIVS可以得到角色授權給哪些使用者、角色,以及是否有ADMIN OPTION
SQL> SELECT * FROM dba_role_privs
2 WHERE granted_role LIKE 'TEST_ROLE_%';
Chapter	7	User	And	Privilege	
Oracle	Database	11g	資料庫管理入門	
GRANTEE GRANTED_ROLE ADM DEF
------------------------------ ------------------------------ ------- -------
FRANK TEST_ROLE_B NO YES
SYS TEST_ROLE_C YES YES --因為TEST_ROLE_C為SYS所建立
FRANK TEST_ROLE_C YES YES --ADM=YES表示有ADMIN OPTION
SYS TEST_ROLE_B YES YES
FRANK TEST_ROLE_A NO YES
SYS TEST_ROLE_A YES YES
修改角色(Alter Role)
當角色建立後,資料庫管理者只能更改驗證的方法,其實也沒有其他設定可以修改。
SQL> ALTER ROLE test_role_a IDENTIFIED BY oracle;
SQL> SELECT * FROM dba_roles WHERE role='TEST_ROLE_A';
ROLE PASSWORD
------------------------------ -----------------
TEST_ROLE_A YES
SQL> ALTER ROLE test_role_a NOT IDENTIFIED;
SQL> SELECT * FROM dba_roles WHERE role='TEST_ROLE_A';
ROLE PASSWORD
------------------------------ -----------------
TEST_ROLE_A NO
刪除角色(Drop Role)
當角色被刪除時,Oracle 資料庫自動將角色由被授權的使用者與角色處收回,然後才刪除角色。如果角
色被刪除時,已經被使用者啟用,則已啟用的角色所帶來的權限不受影響,可以繼續使用那些權限。
SQL> DROP ROLE test_role;
7.5.2 預設角色(Default Role)
預設角色為當使用者登入資料庫後,會自動生效的角色。通常將角色授權給使用者時,這個角色便成為預
設角色。可是有時候使用者被授與角色,是因為備援的關係,例如副主管也會被授與主管的權限,因為當
主管不在辦公室時,則副主管必須能夠代行主管權責。可是平常主管在辦公室時,副主管則不能也不該使
用主管權限。所以資料庫管理者可以建立一個主管角色並加上密碼驗證,然後將主管角色授與副主管,但
是不要讓主管角色為副主管的預設角色。因此平常副主管登入資料庫時,僅擁有自己的角色與權限,一但
當主管離開辦公室時,副主管便可以利用密碼將主管角色生效,便可以代理主管的工作,卻不會同時有兩
個人同時握有主管權限造成雙頭馬車的問題。
資料庫管理者可以由 DBA_ROLE_PRIVS 來得到使用者所被授與的角色及預設角色為何。
SQL> CONNECT / AS SYSDBA
SQL> SELECT granted_role,default_role FROM dba_role_privs
2 WHERE grantee='FRANK';
GRANTED_ROLE DEF
------------------------------ -------
TEST_ROLE_B YES
TEST_ROLE_C YES
TEST_ROLE_A YES
Chapter	7	User	And	Privilege	
Oracle	Database	11g	資料庫管理入門	
--使用frank身份登入
[oracle@ELinux ~]$ sqlplus frank/oracle
SQL> SHOW USER
USER is "FRANK"
SQL> SELECT * FROM session_roles; --此階段作業目前啟用的角色
ROLE
------------------------------
TEST_ROLE_A
TEST_ROLE_B
TEST_ROLE_C
/*因為test_role_a,test_role_b,test_role_c都是預設角色,所以即使test_role_b需要驗證才能啟用,但是
預設角色不在此限,因為預設角色為登入後自動啟用,不須另外啟用。*/
SQL> SELECT * FROM session_privs; --此階段作業目前可以使用的系統權限
PRIVILEGE
----------------------------------------
CREATE SESSION
CREATE TABLE
CREATE ANY TABLE
SELECT ANY TABLE
CREATE PROCEDURE
CREATE MATERIALIZED VIEW
SELECT ANY DICTIONARY
7 rows selected.
SQL> exit; --結束此階段作業
修改使用者的預設角色
資料庫管理者可以事後修改使用者的預設角色,這個操作不會將角色收回,只是設定那些角色在階段作業
建立時,不會自動啟用,需要額外使用 SET ROLE 啟用角色。
SQL> SHOW USER
USER is "SYS"
SQL> ALTER USER frank DEFAULT ROLE NONE; --將所有的被授與角色都變成不是預設角色
SQL> SELECT granted_role,default_role FROM dba_role_privs
2 WHERE grantee='FRANK';
GRANTED_ROLE DEF
------------------------------ -------
TEST_ROLE_B NO
TEST_ROLE_C NO
TEST_ROLE_A NO
SQL> ALTER USER frank DEFAULT ROLE test_role_b,test_role_c;
/*將test_role_b與test_role_c設定為預設角色,其餘被授與的角色為非預設角色。*/
SQL> SELECT granted_role,default_role FROM dba_role_privs
2 WHERE grantee='FRANK';
GRANTED_ROLE DEF
------------------------------ -------
TEST_ROLE_B YES
TEST_ROLE_C YES
Chapter	7	User	And	Privilege	
Oracle	Database	11g	資料庫管理入門	
TEST_ROLE_A NO
SQL> ALTER USER frank DEFAULT ROLE ALL; --將所有被授與的角色都設定為預設角色
SQL> SELECT granted_role,default_role FROM dba_role_privs
2 WHERE grantee='FRANK';
GRANTED_ROLE DEF
------------------------------ ------
TEST_ROLE_B YES
TEST_ROLE_C YES
TEST_ROLE_A YES
SQL> ALTER USER frank DEFAULT ROLE ALL EXCEPT test_role_b,test_role_c;
/*除了test_role_b與test_role_c外,其餘被授與的角色都設為預設角色。*/
SQL> SELECT granted_role,default_role FROM dba_role_privs
2 WHERE grantee='FRANK';
GRANTED_ROLE DEF
------------------------------ ------
TEST_ROLE_B NO
TEST_ROLE_C NO
TEST_ROLE_A YES
7.5.3 啟用角色(Set Role)
當階段作業建立後,Oracle 資料庫會自動啟用使用者的預設角色。使用者可以自行查詢
SESSION_ROLES 得知目前階段作業中已啟用的角色,也可以透過 SESSION_PRIVS 知道可以使用那些
系統權限。然而不是預設角色的啟用,則需要使用 SET ROLE 指令。可是 SET ROLE 指令也可以將某些
角色關閉,因為 SET ROLE 用來設定目前階段作業欲啟用的角色。若一個已啟用的角色,沒有被後續的
SET ROLE 指令指明,則 Oracle 資料庫會將該角色關閉。
[oracle@ELinux ~]$ sqlplus frank/oracle
SQL> SHOW USER
USER is "FRANK"
SQL> SELECT * FROM session_roles;
ROLE
------------------------------
TEST_ROLE_A --只有test_role_a為預設角色
SQL> SET ROLE test_role_c; --將啟用test_role_c,其他角色必須關閉
SQL> SELECT * FROM session_roles;
ROLE
------------------------------
TEST_ROLE_C --只有test_role_c角色被啟用,test_role_b角色反而被關閉
SQL> SET ROLE ALL; --因為test_role_b需要驗證,不能使用ALL
SET ROLE ALL
*
ERROR at line 1:
ORA-01979: missing or invalid password for role 'TEST_ROLE_B'
Chapter	7	User	And	Privilege	
Oracle	Database	11g	資料庫管理入門	
SQL> SET ROLE test_role_a,test_role_b IDENTIFIED BY oracle,test_role_c;
/*要求啟用test_role_a,test_role_b,test_role_c這幾個角色*/
SQL> SELECT * FROM session_roles;
ROLE
------------------------------
TEST_ROLE_A
TEST_ROLE_B
TEST_ROLE_C
SQL> SET ROLE NONE; --關閉所有角色
SQL> SELECT * FROM session_roles;
no rows selected
SQL> SET ROLE ALL EXCEPT test_role_b; --啟用所有被授與的角色,除了test_role_b
SQL> SELECT * FROM session_roles;
ROLE
------------------------------
TEST_ROLE_A
TEST_ROLE_C
SQL> SET ROLE dba; --只能啟用已經被授與的角色
SET ROLE dba
*
ERROR at line 1:
ORA-01924: role 'DBA' not granted or does not exist
Chapter	7	User	And	Privilege	
Oracle	Database	11g	資料庫管理入門	
7.5.4 事先定義的角色(Predefined Role)
所謂事先定義的角色,是指那些在建立資料庫的同時,Oracle 資料庫預先建立與授與權限的角色,主要
是為了減輕資料庫管理者的負擔,不需要建立角色與授與權限給角色即可立刻使用。Oracle Database
11g 中的預設角色有:AQ_ADMINISTRATOR_ROLE、AQ_USER_ROLE、CONNECT、DBA、
DELETE_CATALOG_ROLE、EXECUTE_CATALOG_ROLE、EXP_FULL_DATABASE、
HS_ADMIN_ROLE、IMP_FULL_DATABASE、RECOVERY_CATALOG_OWNER、RESOURCE、
SCHEDULER_ADMIN、SELECT_CATALOG_ROLE、XDBADMIN、XDB_SET_INVOKER、
XDB_WEBSERVICES 、 XDB_WEBSERVICES_OVER_HTTP 、 XDB_WEBSERVICES_WITH_PUBLIC 。
這些角色中以 CONNECT 與 RESOURCE 最為人所熟知。許多資料庫管理者建立使用者後,通常都會立
刻授予 CONNECT 角色給使用者,這樣使用者使用如建立階段作業(CREATE SESSION)、建立表格
(CREATE TABLE)等基本權限。若此使用者是程式設計人員,那麼 DBA 就會將 RESOURCE 角色也授予
使用者,讓其擁有一些開發資料庫程式所需要的權限。事實上有許多 DBA 根本不知道他自己到底給予了
使用者那些權限,只是依循以前的步驟。也不知道這些角色中,其實隱藏著一些安全漏洞。
CONNECT
如同之前所言,角色是為了簡化權限的管理。所以當 DBA 授予某個角色給使用者時,當然必須先了解這
個角色,到底是由那些權限所組成的。DBA 可以查詢下列的視觀圖(VIEW)來得到這些資訊。通常是查詢
ROLE_SYS_PRIVS(系統權限授與給那些角色)或 DBA_SYS_PRIVS(系統權限授與給那些角色或使用者):
SQL> CONNECT system/oracle --此處使用system身份即可
SQL> show user
USER 為 "SYSTEM"
SQL> DESC role_sys_privs
Name Null? Type
----------------------------------------- ----------------------- ----------------------------------------
ROLE NOT NULL VARCHAR2(30)
PRIVILEGE NOT NULL VARCHAR2(40)
ADMIN_OPTION VARCHAR2(3)
SQL> DESC dba_sys_privs
Name Null? Type
----------------------------------------- ----------------------- ----------------------------------------
PRIVILEGE NOT NULL VARCHAR2(40)
ADMIN_OPTION VARCHAR2(3)
不過有一個需要注意的地方,那就是查詢 ROLE_SYS_PRIVS 中,無法找到 CONNECT 或 RESOURCE
兩個角色的資訊,必須查詢 DBA_SYS_PRIVS 才可以得到有關的資訊。
/*在Oracle Database 10g之前的版本*/
SQL> select privilege from role_sys_privs where role='CONNECT';
沒有任何資料列被選取
SQL> select privilege from dba_sys_privs where grantee='CONNECT';
PRIVILEGE
----------------------------------------
CREATE SESSION
CREATE SYNONYM
CREATE SEQUENCE
CREATE DATABASE LINK
已選取 8 個資料列.
Chapter	7	User	And	Privilege	
Oracle	Database	11g	資料庫管理入門	
SQL> select privilege from role_sys_privs where role='RESOURCE';
沒有任何資料列被選取
SQL> select privilege from dba_sys_privs where grantee='RESOURCE';
PRIVILEGE
----------------------------------------
CREATE TYPE
CREATE TABLE
CREATE CLUSTER
CREATE TRIGGER
CREATE OPERATOR
CREATE SEQUENCE
CREATE INDEXTYPE
CREATE PROCEDURE
已選取 8 個資料列.
/*以上結果在Oracle Database 9i資料庫方為如此*/
所以當使用者被授予 CONNECT 角色後,他便擁有 CREATE VIEW,CREATE TABLE,ALTER
SESSION,CREATE CLUSTER,CREATE SESSION,CREATE SYNONYMN,CREATE
SEQUENCE,CREATE DATABASE LINK 等權限,這也就是為何要授予 CONNECT 角色給一般使用者
的原因,可以簡化權限管理的複雜度。
但是在 Oracle Database 10g R2 之後,CONNECT 角色所內含的權限僅剩下 CREATE SESSION 一個,
其餘的權限都不再被預設授予給 CONNECT 角色。所以如果 DBA 還是因循過去的方法建立使用者,那麼
這個使用者只能建立連線但無法進行其他的動作,若 DBA 不能深究授予 CONNECT 角色的原因,一但出
現權限不足的問題,就無法很快地解決問題。
SQL> show user
USER 為 "SYSTEM"
SQL> select privilege from dba_sys_privs where grantee='CONNECT';
PRIVILEGE
----------------------------------------
CREATE SESSION
SQL> create user frank identified by oracle;
已建立使用者.
SQL> grant connect to frank;
順利授權.
SQL> connect frank/oracle
已連線.
SQL> show user
USER 為 "FRANK"
SQL> select * from session_roles;
ROLE
------------------------------
CONNECT
SQL> select * from session_privs;
PRIVILEGE
----------------------------------------
CREATE SESSION
為了解決 Oracle Database 10g R2 後 CONNECT 角色的內容更動,DBA 可以利用下列兩種方式來解決
所遇到的問題:
DBA 另外建立一個新的角色,將其餘的權限(CREATE VIEW,CREATE TABLE,ALTER
SESSION,CREATE CLUSTER, CREATE SYNONYMN,CREATE SEQUENCE,CREATE DATABASE
Chapter	7	User	And	Privilege	
Oracle	Database	11g	資料庫管理入門	
LINK)授予給新建的角色,之後找到有那些使用者或角色已經被授予 CONNECT 角色,最後將新建的角
色授予給那些使用者即可。
SQL> show user
USER 為 "SYSTEM"
SQL> create role new_connect;
SQL> grant create table,create view,create cluster,create synonym,create sequence,create database li
nk,
alter session to new_connect;
順利授權.
SQL> select grantee from dba_role_privs where granted_role='CONNECT';
GRANTEE
------------------------------
WMSYS
IX
PM
OLAP_USER
MDDATA
FRANK
SYS
EXFSYS
MDSYS
SCOTT
已選取 10 個資料列.
SQL> grant new_connect to frank;
順利授權.
SQL> connect frank/oracle
已連線.
SQL> show user
USER 為 "FRANK"
SQL> select * from session_roles;
ROLE
------------------------------
CONNECT
NEW_CONNECT
SQL> select * from session_privs;
PRIVILEGE
----------------------------------------
CREATE SESSION
ALTER SESSION
CREATE TABLE
CREATE CLUSTER
CREATE SYNONYM
CREATE VIEW
CREATE SEQUENCE
CREATE DATABASE LINK
已選取 8 個資料列.
執行%ORACLE_HOME%rdbmsadminrstrconn.sql(Windows 平台)或
$ORACLE_HOME/rdbms/admin/rstrconn.sql(UNIX 平台),將 CREATE VIEW,CREATE
TABLE,ALTER SESSION,CREATE CLUSTER, CREATE SYNONYMN,CREATE
SEQUENCE,CREATE DATABASE LINK 再授予給 CONNECT 角色,使 CONNECT 角色的內容恢復到
Oracle Database10gR2 之前的樣子。
SQL> show user
USER 為 "SYSTEM"
SQL> select privilege from dba_sys_privs where grantee='CONNECT';
Chapter	7	User	And	Privilege	
Oracle	Database	11g	資料庫管理入門	
PRIVILEGE
----------------------------------------
CREATE SESSION
SQL>@$ORACLE_HOME/rdbms/admin/rstrconn.sql
順利授權
確認完成
SQL> select privilege from dba_sys_privs where grantee='CONNECT';
PRIVILEGE
----------------------------------------
CREATE VIEW
CREATE TABLE
ALTER SESSION
CREATE CLUSTER
CREATE SESSION
CREATE SYNONYM
CREATE SEQUENCE
CREATE DATABASE LINK
已選取 8 個資料列.
RESOURCE
由之前的資訊可以得知,RESOURCE 角色擁有 CREATE TYPE,CREATE TABLE,CREATE
CLUSTER,CREATE TRIGGER,CREATE OPERATOR,CREATE SEQUENCE,CREATE
INDEXTYPE,CREATE PROCEDURE 這些權限,所以被授予這個角色的使用者,就間接擁有這些權限。
這些權限大多數是當進行資料庫程式開發時,建立一些資料庫物件所必須的權限,所以一般的 DBA 通常
會直接授予 RESOURCE 角色給程式設計人員,讓他們可以順利地進行開發工作。但是在建立資料庫物件
之前,使出者必須先要建立資料庫連線,也就是同時必須擁有 CREATE SESSION 的權限。也就是如此,
就形成文章前面所形容的情形,當 DBA 建立一個新的使用者時,便會順便授予 CONNECT 與
RESOURCE 兩個角色給使用者,讓使用者可以順利地進行他的工作。不過在 Oracle 資料庫中,建立
SEGMENT(即需要空間放資料的物件,如 TABLE,CLUSTER,INDEX 等等)物件時,除了要建立相關物件
的權限外,還要擁有該物件放所放置的表格空間(TABLESPACE)上的空間配額(QUOTA)未超過。而空間
配額的設定可以在建立使用者的同時或之後再更改配額,不過重要是,空間配額預設是沒有,所以沒有設
定就沒有配額。
SQL> show user
USER 為 "SYSTEM"
SQL> create user testuser1 identified by oracle;
已建立使用者.
SQL> grant create table to testuser1;
順利授權.
SQL> connect testuser/oracle
ERROR:
ORA-01045: user TESTUSER lacks CREATE SESSION privilege; logon denied
警告: 您已不再與 ORACLE 相連
SQL> connect system/oracle
已連線.
SQL> show user
USER 為 "SYSTEM"
SQL> grant create session to testuser1;
順利授權.
SQL> connect testuser/oracle
已連線.
SQL> show user
USER 為 "TESTUSER1"
SQL> select * from session_roles;
Chapter	7	User	And	Privilege	
Oracle	Database	11g	資料庫管理入門	
沒有任何資料列被選取
SQL> select * from session_privs;
PRIVILEGE
----------------------------------------
CREATE SESSION
CREATE TABLE
SQL> create table test1 (a number) tablespace users;
create table test1 (a number) tablespace users
*
ERROR 在行 1:
ORA-01950: 沒有表格空間 'USERS' 的權限
SQL> connect system/oracle
已連線.
SQL> alter user testuser1 quota 10M on users;
已更改使用者.
SQL> connect testuser1/oracle@o10gr2
已連線.
SQL> show user
USER 為 "TESTUSER1"
SQL> create table test1 (a number) tablespace users;
已建立表格.
當授予 RESOURCE 角色給使用者時,有個相信是絕大多數的 DBA 都不知道的安全漏洞,那就是使用者
可以不需任何表格空間的配額,只要有建立物件的權限,即可在任何的表格空間上建立物件。這是因為當
授予 RESOURCE 角色時,Oracle 資料庫會順便授與 UNLIMITED TABLESPACE 給使用者,擁有此權
限的使用者不需要配額即可將物件建立在任何的表格空間上。除了失去原本設計配額這項屬性的意義外,
同時有可能造成整個資料庫中,物件胡亂放置的問題,影響資料庫的管理與安全。
SQL> show user
USER 為 "SYSTEM"
SQL> create user testuser2 identified by oracle;
已建立使用者.
SQL> select privilege from dba_sys_privs where grantee='TESTUSER2';
沒有任何資料列被選取
SQL> grant connect,resource to testuser2;
順利授權.
SQL> select privilege from dba_sys_privs where grantee='TESTUSER2';
PRIVILEGE
----------------------------------------
UNLIMITED TABLESPACE
SQL> select privilege from dba_sys_privs where grantee='CONNECT';
PRIVILEGE
----------------------------------------
CREATE SESSION
SQL> select privilege from dba_sys_privs where grantee='RESOURCE';
PRIVILEGE
----------------------------------------
CREATE TRIGGER
CREATE SEQUENCE
CREATE TYPE
CREATE PROCEDURE
CREATE CLUSTER
CREATE OPERATOR
CREATE INDEXTYPE
CREATE TABLE
已選取 8 個資料列.
SQL> connect testuser2/oracle@o10gr2;
Chapter	7	User	And	Privilege	
Oracle	Database	11g	資料庫管理入門	
已連線.
SQL> show user
USER 為 "TESTUSER2"
SQL> select * from session_roles;
ROLE
------------------------------
CONNECT
RESOURCE
SQL> select * from session_privs;
PRIVILEGE
----------------------------------------
CREATE SESSION
UNLIMITED TABLESPACE
CREATE TABLE
CREATE CLUSTER
CREATE SEQUENCE
CREATE PROCEDURE
CREATE TRIGGER
CREATE TYPE
CREATE OPERATOR
CREATE INDEXTYPE
已選取 10 個資料列.
如何解決這個 Well Known Bug(內行人都知道)?
• 直接將”UNLIMITED TABLESPACE”收回即可。
SQL> show user
USER 為 "SYSTEM"
SQL> select privilege from dba_sys_privs where grantee='TESTUSER2';
PRIVILEGE
----------------------------------------
UNLIMITED TABLESPACE
SQL> revoke unlimited tablespace from testuser2;
順利撤銷.
SQL> select privilege from dba_sys_privs where grantee='TESTUSER2';
沒有任何資料列被選取
SQL> connect testuser2/oracle@o10gr2
已連線.
SQL> show user
USER 為 "TESTUSER2"
SQL> select * from session_roles;
ROLE
------------------------------
CONNECT
RESOURCE
SQL> select * from session_privs;
PRIVILEGE
----------------------------------------
CREATE SESSION
CREATE TABLE
CREATE CLUSTER
CREATE SEQUENCE
CREATE PROCEDURE
CREATE TRIGGER
CREATE TYPE
CREATE OPERATOR
CREATE INDEXTYPE
Chapter	7	User	And	Privilege	
Oracle	Database	11g	資料庫管理入門	
已選取 9 個資料列.
• 新建一個角色,取代 RESOURCE 原本的功能 。
SQL> show user
USER 為 "SYSTEM"
SQL> create role new_resource;
已建立角色.
SQL> select privilege from dba_sys_privs where grantee='RESOURCE';
PRIVILEGE
----------------------------------------
CREATE TRIGGER
CREATE SEQUENCE
CREATE TYPE
CREATE PROCEDURE
CREATE CLUSTER
CREATE OPERATOR
CREATE INDEXTYPE
CREATE TABLE
已選取 8 個資料列.
SQL> grant create trigger,create sequence,create type,create procedure,create cl
uster,create operator,create indextype,create table to new_resource;
順利授權.
SQL> select privilege from dba_sys_privs where grantee='NEW_RESOURCE';
PRIVILEGE
----------------------------------------
CREATE OPERATOR
CREATE TRIGGER
CREATE CLUSTER
CREATE TABLE
CREATE PROCEDURE
CREATE INDEXTYPE
CREATE SEQUENCE
CREATE TYPE
已選取 8 個資料列.
SQL> create user testuser3 identified by oracle;
已建立使用者.
SQL> select privilege from dba_sys_privs where grantee='TESTUSER3';
沒有任何資料列被選取
SQL> grant connect,new_resource to testuser3;
順利授權.
SQL> select privilege from dba_sys_privs where grantee='TESTUSER3';
沒有任何資料列被選取
SQL> connect testuser3/oracle@o10gr2;
已連線.
SQL> show user
USER 為 "TESTUSER3"
SQL> select * from session_roles;
ROLE
------------------------------
CONNECT
NEW_RESOURCE
SQL> select * from session_privs;
PRIVILEGE
----------------------------------------
CREATE SESSION
CREATE TABLE
CREATE CLUSTER
Chapter	7	User	And	Privilege	
Oracle	Database	11g	資料庫管理入門	
CREATE SEQUENCE
CREATE PROCEDURE
CREATE TRIGGER
CREATE TYPE
CREATE OPERATOR
CREATE INDEXTYPE
已選取 9 個資料列.
結論
資料庫安全對資料庫管理者來說是非常重要的一件事,而且資料庫的安全設定,應該早在建立資料庫之前,
就應該規劃完成。同時應用程式存取資料庫的安全設定,也應該在設計應用程式時就加以考慮,而不是留
到應用程式上線後才開始規劃。經過本章節的說明,相信資料庫管理者已經了解如何建立一個新的資料庫
使用者,同時授與使用者所需要的權限。並且使用設定檔要求使用者定期更換密碼、限制密碼的重複使用
與要求密碼的複雜程度等。然而本章只介紹資料庫安全的系統安全與資料安全的部份,至於稽核與資料檔
安全等就留待未來介紹。

More Related Content

What's hot

Oracle Database Management Basic 1
Oracle Database Management Basic 1Oracle Database Management Basic 1
Oracle Database Management Basic 1Chien Chung Shen
 
Oracle Database Management - Backup/Recovery
Oracle Database Management - Backup/RecoveryOracle Database Management - Backup/Recovery
Oracle Database Management - Backup/RecoveryChien Chung Shen
 
Oracle Database SQL Tuning Concept
Oracle Database SQL Tuning ConceptOracle Database SQL Tuning Concept
Oracle Database SQL Tuning ConceptChien Chung Shen
 
障害とオペミスに備える! ~Oracle Databaseのバックアップを考えよう~
障害とオペミスに備える! ~Oracle Databaseのバックアップを考えよう~障害とオペミスに備える! ~Oracle Databaseのバックアップを考えよう~
障害とオペミスに備える! ~Oracle Databaseのバックアップを考えよう~Shinnosuke Akita
 
Oracle statistics by example
Oracle statistics by exampleOracle statistics by example
Oracle statistics by exampleMauro Pagano
 
Oracle sql high performance tuning
Oracle sql high performance tuningOracle sql high performance tuning
Oracle sql high performance tuningGuy Harrison
 
Oracle Database Performance Tuning Concept
Oracle Database Performance Tuning ConceptOracle Database Performance Tuning Concept
Oracle Database Performance Tuning ConceptChien Chung Shen
 
Oracle Database Performance Tuning Advanced Features and Best Practices for DBAs
Oracle Database Performance Tuning Advanced Features and Best Practices for DBAsOracle Database Performance Tuning Advanced Features and Best Practices for DBAs
Oracle Database Performance Tuning Advanced Features and Best Practices for DBAsZohar Elkayam
 
簡単!AWRをEXCELピボットグラフで分析しよう♪
簡単!AWRをEXCELピボットグラフで分析しよう♪簡単!AWRをEXCELピボットグラフで分析しよう♪
簡単!AWRをEXCELピボットグラフで分析しよう♪Yohei Azekatsu
 
監査ログをもっと身近に!〜統合監査のすすめ〜
監査ログをもっと身近に!〜統合監査のすすめ〜監査ログをもっと身近に!〜統合監査のすすめ〜
監査ログをもっと身近に!〜統合監査のすすめ〜Michitoshi Yoshida
 
Oracle Database Appliance 12.1.2.3.0 アップデート及びパッチ管理について
Oracle Database Appliance 12.1.2.3.0 アップデート及びパッチ管理についてOracle Database Appliance 12.1.2.3.0 アップデート及びパッチ管理について
Oracle Database Appliance 12.1.2.3.0 アップデート及びパッチ管理についてオラクルエンジニア通信
 
Understanding Oracle RAC 12c Internals OOW13 [CON8806]
Understanding Oracle RAC 12c Internals OOW13 [CON8806]Understanding Oracle RAC 12c Internals OOW13 [CON8806]
Understanding Oracle RAC 12c Internals OOW13 [CON8806]Markus Michalewicz
 
Active dataguard
Active dataguardActive dataguard
Active dataguardManoj Kumar
 
GoldenGateテクニカルセミナー3「Oracle GoldenGate Technical Deep Dive」(2016/5/11)
GoldenGateテクニカルセミナー3「Oracle GoldenGate Technical Deep Dive」(2016/5/11)GoldenGateテクニカルセミナー3「Oracle GoldenGate Technical Deep Dive」(2016/5/11)
GoldenGateテクニカルセミナー3「Oracle GoldenGate Technical Deep Dive」(2016/5/11)オラクルエンジニア通信
 

What's hot (20)

Oracle Database Management Basic 1
Oracle Database Management Basic 1Oracle Database Management Basic 1
Oracle Database Management Basic 1
 
Oracle SQL 1 Day Tutorial
Oracle SQL 1 Day TutorialOracle SQL 1 Day Tutorial
Oracle SQL 1 Day Tutorial
 
Oracle Database Management - Backup/Recovery
Oracle Database Management - Backup/RecoveryOracle Database Management - Backup/Recovery
Oracle Database Management - Backup/Recovery
 
Oracle Database SQL Tuning Concept
Oracle Database SQL Tuning ConceptOracle Database SQL Tuning Concept
Oracle Database SQL Tuning Concept
 
障害とオペミスに備える! ~Oracle Databaseのバックアップを考えよう~
障害とオペミスに備える! ~Oracle Databaseのバックアップを考えよう~障害とオペミスに備える! ~Oracle Databaseのバックアップを考えよう~
障害とオペミスに備える! ~Oracle Databaseのバックアップを考えよう~
 
Oracle statistics by example
Oracle statistics by exampleOracle statistics by example
Oracle statistics by example
 
Analyzing awr report
Analyzing awr reportAnalyzing awr report
Analyzing awr report
 
Oracle sql high performance tuning
Oracle sql high performance tuningOracle sql high performance tuning
Oracle sql high performance tuning
 
Zero Data Loss Recovery Applianceのご紹介
Zero Data Loss Recovery Applianceのご紹介Zero Data Loss Recovery Applianceのご紹介
Zero Data Loss Recovery Applianceのご紹介
 
Oracle Database Performance Tuning Concept
Oracle Database Performance Tuning ConceptOracle Database Performance Tuning Concept
Oracle Database Performance Tuning Concept
 
Oracle Database Performance Tuning Advanced Features and Best Practices for DBAs
Oracle Database Performance Tuning Advanced Features and Best Practices for DBAsOracle Database Performance Tuning Advanced Features and Best Practices for DBAs
Oracle Database Performance Tuning Advanced Features and Best Practices for DBAs
 
簡単!AWRをEXCELピボットグラフで分析しよう♪
簡単!AWRをEXCELピボットグラフで分析しよう♪簡単!AWRをEXCELピボットグラフで分析しよう♪
簡単!AWRをEXCELピボットグラフで分析しよう♪
 
監査ログをもっと身近に!〜統合監査のすすめ〜
監査ログをもっと身近に!〜統合監査のすすめ〜監査ログをもっと身近に!〜統合監査のすすめ〜
監査ログをもっと身近に!〜統合監査のすすめ〜
 
Oracle GoldenGate アーキテクチャと基本機能
Oracle GoldenGate アーキテクチャと基本機能Oracle GoldenGate アーキテクチャと基本機能
Oracle GoldenGate アーキテクチャと基本機能
 
Oracle Database Appliance 12.1.2.3.0 アップデート及びパッチ管理について
Oracle Database Appliance 12.1.2.3.0 アップデート及びパッチ管理についてOracle Database Appliance 12.1.2.3.0 アップデート及びパッチ管理について
Oracle Database Appliance 12.1.2.3.0 アップデート及びパッチ管理について
 
Oracle Data Masking and Subsettingのご紹介
Oracle Data Masking and Subsettingのご紹介Oracle Data Masking and Subsettingのご紹介
Oracle Data Masking and Subsettingのご紹介
 
Oracle Database Vaultのご紹介
Oracle Database Vaultのご紹介Oracle Database Vaultのご紹介
Oracle Database Vaultのご紹介
 
Understanding Oracle RAC 12c Internals OOW13 [CON8806]
Understanding Oracle RAC 12c Internals OOW13 [CON8806]Understanding Oracle RAC 12c Internals OOW13 [CON8806]
Understanding Oracle RAC 12c Internals OOW13 [CON8806]
 
Active dataguard
Active dataguardActive dataguard
Active dataguard
 
GoldenGateテクニカルセミナー3「Oracle GoldenGate Technical Deep Dive」(2016/5/11)
GoldenGateテクニカルセミナー3「Oracle GoldenGate Technical Deep Dive」(2016/5/11)GoldenGateテクニカルセミナー3「Oracle GoldenGate Technical Deep Dive」(2016/5/11)
GoldenGateテクニカルセミナー3「Oracle GoldenGate Technical Deep Dive」(2016/5/11)
 

Similar to Oracle使用者安全設定

1.oracle 11g 用户管理新功能
1.oracle 11g 用户管理新功能1.oracle 11g 用户管理新功能
1.oracle 11g 用户管理新功能WASecurity
 
Essential oracle security internal for dba
Essential oracle security internal for dbaEssential oracle security internal for dba
Essential oracle security internal for dbamaclean liu
 
3, OCP - instance management
3, OCP - instance management3, OCP - instance management
3, OCP - instance managementted-xu
 
6, OCP - oracle security
6, OCP - oracle security6, OCP - oracle security
6, OCP - oracle securityted-xu
 
数据库性能诊断的七种武器
数据库性能诊断的七种武器数据库性能诊断的七种武器
数据库性能诊断的七种武器Leyi (Kamus) Zhang
 
Oracle北大青鸟完全教程
Oracle北大青鸟完全教程Oracle北大青鸟完全教程
Oracle北大青鸟完全教程yiditushe
 
Mysql 培训-优化篇
Mysql 培训-优化篇Mysql 培训-优化篇
Mysql 培训-优化篇sunmonth
 
A.oracle 查询结果的缓存问题
A.oracle 查询结果的缓存问题A.oracle 查询结果的缓存问题
A.oracle 查询结果的缓存问题WASecurity
 
7, OCP - configure database for backup and recovery
7, OCP - configure database for backup and recovery7, OCP - configure database for backup and recovery
7, OCP - configure database for backup and recoveryted-xu
 
Php应用程序常见安全问题解析
Php应用程序常见安全问题解析Php应用程序常见安全问题解析
Php应用程序常见安全问题解析mysqlops
 
11g r2新特性之standby max_data_delay
11g r2新特性之standby max_data_delay11g r2新特性之standby max_data_delay
11g r2新特性之standby max_data_delaymaclean liu
 
11个步骤应用Spring Security 3(西安尚学堂~付老实)
11个步骤应用Spring Security 3(西安尚学堂~付老实)11个步骤应用Spring Security 3(西安尚学堂~付老实)
11个步骤应用Spring Security 3(西安尚学堂~付老实)Underwind
 
11个步骤应用Spring Security 3
11个步骤应用Spring Security 311个步骤应用Spring Security 3
11个步骤应用Spring Security 3Underwind
 
Oracle数据库升级前必要的准备工作
Oracle数据库升级前必要的准备工作Oracle数据库升级前必要的准备工作
Oracle数据库升级前必要的准备工作maclean liu
 
12, OCP - performance tuning
12, OCP - performance tuning12, OCP - performance tuning
12, OCP - performance tuningted-xu
 
A.oracle 数据字典与脚本初步
A.oracle 数据字典与脚本初步A.oracle 数据字典与脚本初步
A.oracle 数据字典与脚本初步WASecurity
 
Itpub电子杂志(第五期)
Itpub电子杂志(第五期)Itpub电子杂志(第五期)
Itpub电子杂志(第五期)yiditushe
 
1.Oracle系统应用数据泄露问题分析
1.Oracle系统应用数据泄露问题分析1.Oracle系统应用数据泄露问题分析
1.Oracle系统应用数据泄露问题分析WASecurity
 
MySQL5.6&5.7 Cluster 7.3 Review
MySQL5.6&5.7 Cluster 7.3 ReviewMySQL5.6&5.7 Cluster 7.3 Review
MySQL5.6&5.7 Cluster 7.3 Review郁萍 王
 

Similar to Oracle使用者安全設定 (20)

1.oracle 11g 用户管理新功能
1.oracle 11g 用户管理新功能1.oracle 11g 用户管理新功能
1.oracle 11g 用户管理新功能
 
Essential oracle security internal for dba
Essential oracle security internal for dbaEssential oracle security internal for dba
Essential oracle security internal for dba
 
3, OCP - instance management
3, OCP - instance management3, OCP - instance management
3, OCP - instance management
 
6, OCP - oracle security
6, OCP - oracle security6, OCP - oracle security
6, OCP - oracle security
 
数据库性能诊断的七种武器
数据库性能诊断的七种武器数据库性能诊断的七种武器
数据库性能诊断的七种武器
 
Oracle北大青鸟完全教程
Oracle北大青鸟完全教程Oracle北大青鸟完全教程
Oracle北大青鸟完全教程
 
Mysql 培训-优化篇
Mysql 培训-优化篇Mysql 培训-优化篇
Mysql 培训-优化篇
 
A.oracle 查询结果的缓存问题
A.oracle 查询结果的缓存问题A.oracle 查询结果的缓存问题
A.oracle 查询结果的缓存问题
 
7, OCP - configure database for backup and recovery
7, OCP - configure database for backup and recovery7, OCP - configure database for backup and recovery
7, OCP - configure database for backup and recovery
 
Php应用程序常见安全问题解析
Php应用程序常见安全问题解析Php应用程序常见安全问题解析
Php应用程序常见安全问题解析
 
第11章
第11章 第11章
第11章
 
11g r2新特性之standby max_data_delay
11g r2新特性之standby max_data_delay11g r2新特性之standby max_data_delay
11g r2新特性之standby max_data_delay
 
11个步骤应用Spring Security 3(西安尚学堂~付老实)
11个步骤应用Spring Security 3(西安尚学堂~付老实)11个步骤应用Spring Security 3(西安尚学堂~付老实)
11个步骤应用Spring Security 3(西安尚学堂~付老实)
 
11个步骤应用Spring Security 3
11个步骤应用Spring Security 311个步骤应用Spring Security 3
11个步骤应用Spring Security 3
 
Oracle数据库升级前必要的准备工作
Oracle数据库升级前必要的准备工作Oracle数据库升级前必要的准备工作
Oracle数据库升级前必要的准备工作
 
12, OCP - performance tuning
12, OCP - performance tuning12, OCP - performance tuning
12, OCP - performance tuning
 
A.oracle 数据字典与脚本初步
A.oracle 数据字典与脚本初步A.oracle 数据字典与脚本初步
A.oracle 数据字典与脚本初步
 
Itpub电子杂志(第五期)
Itpub电子杂志(第五期)Itpub电子杂志(第五期)
Itpub电子杂志(第五期)
 
1.Oracle系统应用数据泄露问题分析
1.Oracle系统应用数据泄露问题分析1.Oracle系统应用数据泄露问题分析
1.Oracle系统应用数据泄露问题分析
 
MySQL5.6&5.7 Cluster 7.3 Review
MySQL5.6&5.7 Cluster 7.3 ReviewMySQL5.6&5.7 Cluster 7.3 Review
MySQL5.6&5.7 Cluster 7.3 Review
 

More from Chien Chung Shen

More from Chien Chung Shen (8)

Databases on AWS
Databases on AWSDatabases on AWS
Databases on AWS
 
Awsomeday ntc
Awsomeday ntcAwsomeday ntc
Awsomeday ntc
 
MySQL SQL Tutorial
MySQL SQL TutorialMySQL SQL Tutorial
MySQL SQL Tutorial
 
Oracle 12cR1 In-Memory Column Store
Oracle 12cR1 In-Memory Column StoreOracle 12cR1 In-Memory Column Store
Oracle 12cR1 In-Memory Column Store
 
Mssql to oracle
Mssql to oracleMssql to oracle
Mssql to oracle
 
Oracle Database Undo Segment Operation Concept
Oracle Database Undo Segment Operation ConceptOracle Database Undo Segment Operation Concept
Oracle Database Undo Segment Operation Concept
 
Hadoop Essential for Oracle Professionals
Hadoop Essential for Oracle ProfessionalsHadoop Essential for Oracle Professionals
Hadoop Essential for Oracle Professionals
 
Understanding index
Understanding indexUnderstanding index
Understanding index
 

Oracle使用者安全設定

  • 1. Chapter 7 User And Privilege Oracle Database 11g 資料庫管理入門 第七章 使用者與權限 前言 資料庫安全對資料管理者來說,可謂最重要的課題之一。因為企業將重要資訊全部集中儲存在資料庫中。 如果輕忽資料庫的安全設定,將造成嚴重的後果。如同家中財物都存放在保險箱,不但保險箱箱門未關, 且將保險箱放在大馬路旁無人看守一般。本章節將針對使用者的身份辨識與權限授與進行介紹,讓資料庫 管理者了解資料庫安全的基本設定,避免資料庫被未經身份驗證或未經授權的資料庫使用者存取。 7.1 資料庫安全(Database Security) Oracle 資料庫將安全(Security)分成系統安全與資料安全兩類。系統安全著重在資料庫系統上,因此重點 在身份辨識與系統權限的授與。而資料安全則考量資料庫中資料的安全,所以著重在授與物件權限與稽核 上。 7.1.1 系統安全(System Security) 身份辨識(Authentication) 身份辨識其實就是如何證明使用者是他宣稱的那個人,簡言之”你哪位”(Who Are You?),Oracle 資 料庫可以透過密碼、外部(作業系統)與全域(目錄服務)等方法驗證使用者。 密碼認證(Password): 當使用者試圖建立階段作業(Session)時,必須提供使用者名字與密碼,Oracle 資料庫由資料辭典中找到 該使用者的密碼後,進行密碼比對。如果一致則表示此使用者的身份已經確認,的確為其所宣稱的那個使 用者。若不一致將出現錯誤訊息,必須重新輸入密碼再次進行驗證。 由於密碼的管理對整個資料庫安全來說是非常重要的一部份,所以從 Oracle Database 11g 開始,資料 庫管理者可以藉由 DBA_USERS_WITH_DEFPWD 查知哪些使用者的密碼是預設密碼,可以盡快將那些 密碼更換,以免造成有心人可以透過這些預設密碼連到資料庫,造成資料庫安全的漏洞。 SQL> connect / as sysdba Connected. SQL> SELECT * FROM dba_users_with_defpwd; USERNAME ------------------------------ DIP MDSYS WK_TEST OUTLN EXFSYS
  • 3. Chapter 7 User And Privilege Oracle Database 11g 資料庫管理入門 外部驗證(OS authentication): 使用者建立階段作業時,不需要提供使用者名稱與密碼。因為資料庫使用者的帳號,直接由 Oracle 資料 庫參數(OS_AUTHENT_PREFIX)與作業系統的使用者帳號結合。例如:OS_AUTHENT_PREFIX 的設定 值為 ops$(這是預設值),而登入作業系統所使用的帳號為 frank。則使用作業系統認證時,所自動組合而 成的資料庫使用者帳號為 OPS$FRANK。因此在資料庫中必須先有此使用者帳號,並且此使用者的驗證 方法必須為外部(EXTERNALLY),如此才能使用作業系統驗證的方式登入資料庫。 全域驗證(Global Authentication): 全域驗證可以讓資料庫管理者建立一個全域使用者,這種驗證方法是採用目錄服務機制(Directory Service),由目錄服務伺服器來驗證資料庫使用者的身份。使用此方式驗證前,需要確定有目錄服務伺服 器存在,並且伺必須支援 LDAP 協定。 權限授與(Authorization)-System Privilege 系統安全除了注重身份辨識外,還要求考慮對使用者授與適當的權限,讓使用者可以執行他應該做且可以 做的資料庫操作,例如:建立階段作業、建立表格、建立使用者、建立表格空間等工作。為強化資料庫安 全,Oracle 資料庫的使用者預設都沒有任何的系統或物件權限,只有當資料庫管理者授與權限後,才能 對資料庫進行特定的操作。所以可以用權限的授與來控制資料庫使用者的行為,以強化資料庫系統的安全 性。 7.1.2 資料安全(Data Security) 權限授與(Authorization)-Object Privilege 物件權限是對資料庫物件所設定的權限,可以用來限制資料庫使用者可以查詢某個綱要的表格內容、執行 某個綱要的程序或新增資料到某個綱要的表格中等。因此是針對資料庫中的某個物件,所以稱作物件權限。 藉由物件權限可以讓資料庫的資料更加安全,減少未經授權而存取的情況發生。 稽核(Audit) 稽核用來記錄事前設定的資料庫操作的訊息,包括:人、事、時、地、物等資訊,可以用來進行事後的追 蹤。但是稽核只能記錄發生過的事件,不能事前防止事情發生。不過正確的稽核觀念與設定,可以當遇到 可疑情況,使用稽核記錄來找出問題的原因,避免相同問題一再發生。 Oracle Database 11g 提供以下多種稽核方法: 強制稽核(Mandatory Audit) 所謂強制表示無法關閉此種稽核,當每次執行處理(Instance)開啟或關閉,以及每次使用 SYSDBA 或 SYSOPER 身份登入資料庫,都會記錄相對的時間以及客戶端使用者帳戶等資訊。這種稽核的稽核歷程檔
  • 4. Chapter 7 User And Privilege Oracle Database 11g 資料庫管理入門 (Audit Trail)只能儲存在作業系統中,Windows 平台一定存放在事件日誌檔(Event Log)中,而 UNIX 平 台則統一存放在$ORACLE_HOME/rdbms/audit 的目錄下,檔案名稱格式為 ora_pid.aud。 標準稽核(Standard Audit) 標準稽核由資料管理者藉由設定稽核選項(Audit Options)決定那些敘述句(Statement)、系統權限 (Privilege)與物件(Object)的操作將被稽核,使用 AUDIT_TRAIL 參數來決定關閉、啟動稽核功能。當 AUDIT_TRAIL 參數值為 NONE 或 FALSE 為關閉稽核,DB 或 DB_EXTENDED 為啟動稽核並將稽核歷 程檔儲存在 SYS 綱要的 AUD$表格中,若為 OS 或 XML 將稽核歷程檔存放在 AUDIT_FILE_DEST 參數 所指定的檔案目錄下。不過在 WINDOWS 平台,當 AUDIT_TRAIL=OS 時,其稽核歷程檔還是存放在事 件日誌中。 更細微稽核(Fine-Grained Audit) 更細微稽核用來稽核當使用者查詢或異動表格中的某些資料列,更甚至於某些資料列的某些欄位,才會產 生稽核歷程檔。因為標準稽核只能記錄對表格層次(Table Level)的操作,而此種稽核比標準稽核更加細微, 可以達到資料列層次(Row Level),甚至到欄位層次(Column Level),故稱做更細微稽核(Fine-Grained Audit)。此種稽核必須使用 DBMS_FGA 套件建立政策(Policy),而其產生的稽核歷程檔儲存於 SYS 綱要 的 FGA_LOG$表格。 DBA 稽核(DBA Audit) 當資料庫管理者以 SYSDBA 身份登入資料庫後,此階段作業的所有操作都不會被標準稽核或更細微稽核 所稽核,此為資料庫安全的一大漏洞。因此自 Oracle Database 10g Release 2 後,可以藉由設定 AUDIT_SYS_OPERATIONS=TRUE,自此之後所有以 SYSDBA 身份登入的階段作業,當其 Server Process 執行任何 SQL 敘述句時,都會將 SQL 敘述句記錄到稽核歷程檔中。稽核歷程檔在 UNIX 平台上 依 AUDIT_FILE_DEST 參數設定決定所在的檔案目錄,而 WINDOWS 平台還是存放在事件日誌內。 7.2 設定檔(Profile) 使用者身份辨識是資料庫安全的第一道防線,如果能夠使用身份辨識阻擋不明人士試圖登入資料庫的意圖, 則可以減少許多後續的補救工作與成本。而身份辨識最常用的一種方法,使用密碼驗證使用者身份。如果 使用者長年不改密碼或使用太簡單的密碼,都會增加被別人假冒身份的機會。因此 Oracle 資料庫可以藉 由設定檔(Profile)來限制使用者的密碼有效期限、密碼重複使用限制與密碼複雜性檢查,讓使用者必須定 期更換密碼、不能使用過去幾次或幾天用過的密碼、不能使用太簡單的密碼等限制,以加強使用者密碼的
  • 5. Chapter 7 User And Privilege Oracle Database 11g 資料庫管理入門 安全性。同時設定檔也可以用來限制階段作業所能消耗的 Oracle 系統資源,如 CPU 時間、Logical I/O 區塊數、連線時間等資源,讓在系統資源不足的情況下,強迫消耗過多系統資源的階段作業提早結束連線。 當資料庫建立後,Oracle 資料庫便有一個叫做 DEFAULT 的設定檔存在。此設定檔當作使用者的預設設 定檔,可以不被使用,但不可以被刪除。 SQL> connect / as sysdba Connected. --列示出DEFAULT設定檔的設定值 SQL> SELECT resource_name,limit 2 FROM dba_profiles 3 WHERE profile='DEFAULT'; RESOURCE_NAME LIMIT ------------------------------------------------------ ---------------------------------------- COMPOSITE_LIMIT UNLIMITED SESSIONS_PER_USER UNLIMITED CPU_PER_SESSION UNLIMITED CPU_PER_CALL UNLIMITED LOGICAL_READS_PER_SESSION UNLIMITED LOGICAL_READS_PER_CALL UNLIMITED IDLE_TIME UNLIMITED CONNECT_TIME UNLIMITED PRIVATE_SGA UNLIMITED FAILED_LOGIN_ATTEMPTS 10 PASSWORD_LIFE_TIME 1800 PASSWORD_REUSE_TIME UNLIMITED PASSWORD_REUSE_MAX UNLIMITED PASSWORD_VERIFY_FUNCTION NULL PASSWORD_LOCK_TIME 1 PASSWORD_GRACE_TIME 7 SQL> SELECT username,profile FROM dba_users; --找出每個使用者所使用的設定檔 USERNAME PROFILE ------------------------------ ------------------------------ APEX_PUBLIC_USER DEFAULT XS$NULL DEFAULT SPATIAL_WFS_ADMIN_USR DEFAULT SPATIAL_CSW_ADMIN_USR DEFAULT MDDATA DEFAULT DIP DEFAULT TSMSYS DEFAULT ORACLE_OCM DEFAULT WKSYS WKSYS_PROF WKPROXY DEFAULT SYSMAN DEFAULT
  • 6. Chapter 7 User And Privilege Oracle Database 11g 資料庫管理入門 7.2.1 密碼限制(Password Limit) 設定檔中有關密碼限制的設定有七種,只要知道每個設定的意義,便可以依需求彈性組合這些密碼限制以 達到所期望的效果。同時使用者只要被指派某個設定檔後,其密碼相關的限制開始生效,規範著此使用者 的密碼相關設定。 SQL> connect / as sysdba Connected. SQL> DESC dba_profiles Name Null? Type ----------------------------------------------------- ----------------------- ---------------------------------------- PROFILE NOT NULL VARCHAR2(30) RESOURCE_NAME NOT NULL VARCHAR2(32) RESOURCE_TYPE VARCHAR2(8) LIMIT VARCHAR2(40) SQL> SELECT DISTINCT resource_name FROM dba_profiles 2 WHERE resource_type='PASSWORD'; RESOURCE_NAME
  • 7. Chapter 7 User And Privilege Oracle Database 11g 資料庫管理入門 --------------------------------------------- FAILED_LOGIN_ATTEMPTS PASSWORD_LIFE_TIME PASSWORD_REUSE_TIME PASSWORD_REUSE_MAX PASSWORD_VERIFY_FUNCTION PASSWORD_LOCK_TIME PASSWORD_GRACE_TIME /*當resource_type為PASSWORD,表示此資源為密碼限制,若為KERNEL則為資源限制。*/ SQL> CREATE PROFILE test_prof LIMIT 2 PASSWORD_LIFE_TIME 30 3 PASSWORD_GRACE_TIME 5 4 PASSWORD_REUSE_MAX 3 5 PASSWORD_REUSE_TIME 1 6 PASSWORD_VERIFY_FUNCTION NULL 7 FAILED_LOGIN_ATTEMPTS 5 8 PASSWORD_LOCK_TIME 1; Profile created. SQL> SELECT resource_name,limit 2 FROM dba_profiles 3 WHERE profile='TEST_PROF' AND resource_type='PASSWORD'; RESOURCE_NAME LIMIT ------------------------------------------------------- ---------------------------------------- FAILED_LOGIN_ATTEMPTS 5 PASSWORD_LIFE_TIME 30 PASSWORD_REUSE_TIME 1 PASSWORD_REUSE_MAX 3 PASSWORD_VERIFY_FUNCTION NULL PASSWORD_LOCK_TIME 1 PASSWORD_GRACE_TIME 5 --有些資料庫管理者會將某個設定值設為Default,表示該設定的值參考DEFAULT設定檔的設定值。 SQL> CREATE PROFILE test_prof2 LIMIT 2 FAILED_LOGIN_ATTEMPTS default; /*表示TEST_PROF2設定檔的FAILED_LOGIN_ATTEMPT參考DEFAULT設定檔的FAILED_LOGIN_ATTE MPTS,其實也不用明確設定,因為所有的設定值的預設值都是DEFAULT。*/
  • 8. Chapter 7 User And Privilege Oracle Database 11g 資料庫管理入門 FAILED_LOGIN_ATTEMPTS(登入失敗鎖定的嘗試次數) 此設定值規定當使用者連續打錯幾次密碼後,使用者帳戶會自動被鎖定,直到鎖定天數達到或資料庫管理 者解除鎖定為止。即便沒有設定 FAILED_LOGIN_ATTEMPTS,當連續三次密碼錯誤後,第四次試圖登 入時,登入畫面將自動延遲出現,最多可以延遲 10 秒鐘才出現。不過如果透過 SQL*PLUS 登入,連續 三次密碼錯誤,SQL*PLUS 會自動結束,使用者必須再次執行 SQL*PLUS 才能繼續登入動作,這是 SQL*PLUS 的安全機制。當然成功登入資料庫後,之前連續登入失敗的記錄將會清除,重新開始累計。
  • 9. Chapter 7 User And Privilege Oracle Database 11g 資料庫管理入門 PASSWORD_LOCK_TIME(鎖定天數) 此設定規定當使用者因連續輸入錯誤密碼而被 Oracle 資料庫自動鎖定帳戶後,經過多久時間後,Oracle 資料庫會自動解除鎖定。不過帳戶狀態要等到使用者在解除鎖定後,進行第一次登入動作時,才會由 LOCK(TIMED)改為開啟(OPEN)。必須注意的是此參數的單位為天,若想鎖定時間低於一天,則可以使 用分數的分式來設定。例如:希望自動鎖定時間為 10 分鐘,則可以將 PASSWORD_LOCK_TIME 設定 為 10/1440 即可。此設定的預設值為 UNLIMITED,表示當自動鎖定後,必須由資料庫管理者使用 ALTER USER frank ACCOUNT UNLOCK 指令來解除鎖定。 PASSWORD_LIFE_TIME(到期日) 此設定規定現在的密碼經過幾天後將會失效,密碼到期後,使用者帳戶狀態將由 OPEN 變成 EXPIRED(沒有設定寬限期)或 EXPIRED(GRACE)(有設定寬限期)。 PASSWORD_GRACE_TIME(鎖定-過期之後的天數) 此設定允許使用者在密碼失效後,第一次登入後開始計算,幾天之內還可以使用舊的密碼登入資料庫。 只是每次使用者試圖登入資料庫時,將會出現密碼即將在 n 天內失效的錯誤訊息’ ORA-28002: the password will expire within n days’。這時使用者的帳戶狀態為 EXPIRED(GRACE),而此訊息將一再 出現提醒使用者更改密碼。然而使用者在寬限期(GRACE TIME)結束前,都沒有更改密碼。則使用者的帳 戶狀態將變為 EXPIRED,所以當下次使用者試圖登入資料庫時,將出現要求更改密碼的畫面,強迫使用 者更改密碼,不然無法登入資料庫。
  • 10. Chapter 7 User And Privilege Oracle Database 11g 資料庫管理入門 許多 Oracle 公司的文件中提到,當寬限期過後,若使用者還是未更改密碼,則使用者帳戶將被鎖定。事 實上並非如此,而只是使用者帳戶狀態變為 EXPIRED 而已,藉此強迫使用者必須更改密碼以登入資料庫。 PASSWORD_REUSE_MAX(要保留的密碼數目) 此設定要求 Oracle 資料庫必須保存最近幾次用過的密碼。當使用者更改密碼時,Oracle 資料庫利用這些 密碼歷史記錄,來判定使用者是否試圖重複之前用過的密碼。如果使用者試圖舊密碼,將會出現錯誤訊息 且不允許使用。資料庫管理者可以由 SYS.USER_HISTORY$察看目前使用過的密碼歷史記錄,當密碼超 過保留次數後,將由此表格中移除,因此使用者便可以重複使用舊密碼。此設定的預設值為 UNLIMITED, 表示不記錄任何之前用過的密碼。 PASSWORD_REUSE_TIME(要保留的天數) 此設定要求 Oracle 資料庫必須保存最近幾天內用過的密碼。當使用者更改密碼時,Oracle 資料庫利用這 些密碼歷史記錄,來判定使用者是否試圖重複之前用過的密碼。如果使用者試圖舊密碼,將會出現錯誤訊 息且不允許使用。當密碼超過保留時間後,將由此 SYS.USER_HISTORY$中移除,因此使用者便可以重 複使用舊密碼。此設定的預設值為 UNLIMITED。 此設定的預設值為 UNLIMITED,表示不記錄任何之前 的密碼。
  • 11. Chapter 7 User And Privilege Oracle Database 11g 資料庫管理入門 當使用資料庫控制建立或編輯設定檔時,會要求當 PASSWORD_REUSE_MAX 或 PASSWORD_REUSE_TIME 其中一個設定值為數字時,另一個設定一定要為 UNLIMITED。不然將會出 現如下圖的錯誤訊息,然而這樣的要求才是真正的錯誤。因為若按照畫面要求的設定,其中一個為數字而 另一個則必須為 UNLIMITED,那麼使用這個設定檔的使用者將永遠不能使用之前用過的密碼。 --切換身份為SYS,因為要查詢資料辭典表格與視觀圖 SQL> CONNECT / AS SYSDBA --建立一個測試帳號frank SQL> GRANT CREATE SESSION TO frank IDENTIFIED BY oracle; Grant succeeded. --建立一個測試用設定檔prof_1,其中設定密碼重用限制次數為2次,重用時間無限制。 SQL> CREATE PROFILE prof_1 LIMIT 2 PASSWORD_REUSE_MAX 2 3 PASSWORD_REUSE_TIME UNLIMITED; --將prof_1指派給frank SQL> ALTER USER frank PROFILE prof_1; SQL> ALTER USER frank IDENTIFIED BY abc123; --更改第一次 SQL> ALTER USER frank IDENTIFIED BY def456; --更改第二次 SQL> ALTER USER frank IDENTIFIED BY ghi789; --更改第三次 SQL>USER frank IDENTIFIED BY oracle; --此時已經更改過三次密碼,但卻還不能重用oracle這個密碼 ALTER USER frank IDENTIFIED BY oracle * ERROR at line 1: ORA-28007: the password cannot be reused SQL> SELECT password,TO_CHAR(password_date,'YYYY-MM-DD HH24:MI:SS') password_date 2 FROM sys.user_history$ 3 WHERE user#=(SELECT user_id FROM dba_users WHERE username='FRANK') 4 ORDER BY password_date; PASSWORD PASSWORD_DATE ------------------------------ --------------------------- 8A52535A7428572D 2009-04-02 13:55:21 --此為oracle的雜湊值(Hash Value),尚未被移出 E209B58C9B4CAEF1 2009-04-02 15:10:49 A4D171F6D949760B 2009-04-02 15:11:03 3B52A820306F3F11 2009-04-02 15:11:15 --修改設定檔 SQL> ALTER PROFILE prof_1 LIMIT 2 PASSWORD_REUSE_MAX 2 3 PASSWORD_REUSE_TIME 5/1440; --設定用過的密碼保存5分鐘 SQL> ALTER USER frank IDENTIFIED BY oracle; SQL> ALTER USER frank IDENTIFIED BY abc123; SQL> ALTER USER frank IDENTIFIED BY def456; SQL> SELECT password,TO_CHAR(password_date,'YYYY-MM-DD HH24:MI:SS') password_date 2 FROM sys.user_history$ 3 WHERE user#=(SELECT user_id FROM dba_users WHERE username='FRANK') 4 ORDER BY password_date; PASSWORD PASSWORD_DATE
  • 12. Chapter 7 User And Privilege Oracle Database 11g 資料庫管理入門 ------------------------------ --------------------------------- 8A52535A7428572D 2009-04-02 15:30:20 --此密碼將在2009-04-02 15:35:20後便可被移出 E209B58C9B4CAEF1 2009-04-02 15:30:29 A4D171F6D949760B 2009-04-02 15:31:34 SQL> SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS') current_time FROM dual; CURRENT_TIME -------------------------------- 2009-04-02 15:32:06 SQL> ALTER USER frank IDENTIFIED BY oracle; --因為oracle密碼尚未滿5分鐘 ALTER USER frank IDENTIFIED BY oracle * ERROR at line 1: ORA-28007: the password cannot be reused ---等待約5分鐘後 SQL> SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS') current_time FROM dual; CURRENT_TIME -------------------------------- 2009-04-02 15:40:37 SQL> ALTER USER frank IDENTIFIED BY oracle; --更改密碼成功,表示可以重複使用oracle這個密碼 User altered. 所以如果想要使用者能夠重複舊密碼,則必須將 PASSWORD_REUSE_MAX 與 PASSWORD_REUSE_TIME 都設為數字。而且使用者想要重複使用舊密碼時,必須同時符合這兩個設定。 假設 PASSWORD_REUSE_MAX=5 且 PASSWORD_REUSE_TIME=10 時,則使用者只能夠使用 10 天以前且 5 次之前的舊密碼。 若兩者都為 UNLIMITED 則使用者可以無限制地重複使用舊密碼,不過這樣對資料庫安全有不良的影響。 PASSWORD_VERIFY_FUNCTION(複雜性函數) 此設定用來要求密碼必須符合某個函數(Function)的檢驗,只有通過檢驗的密碼才能被使用。Oracle 資料 庫允許資料庫管理者自己撰寫檢驗函數,只是此函數必須位於 SYS 綱要下,而且此函數必須接受三個輸 入參數(USERNAME VARCHAR2,PASSWORD VARCHAR2,OLD_PASSWORD VARCHAR2),與回傳
  • 13. Chapter 7 User And Privilege Oracle Database 11g 資料庫管理入門 布林值(Boolean)。當使用者被指派密碼或更改密碼時,該密碼會經由 PASSWORD_VERIFY_FUNCTION 的函數檢驗,只有當函數回傳值為真(TRUE)時,該密碼才能被使用。 若資料庫管理者不想要自行撰寫密碼檢驗函數時,可以使用 Oracle 資料庫提供的檢驗函數: VERIFY_FUNCTION_11G(11g 新建立的檢驗函數)與 VERIFY_FUNCTION(11g 之前的檢驗函數)。只是 該函數並不會自動建立,需要資料庫管理者以 SYS 身份執行 $ORACLE_HOME/rdbms/admin/utlpwdmg.sql 來建立該函數。不過當執行 utlpwdmg.sql 後,除了會 建立 2 個函數外,其實 utlpwdmg.sql 還會修改 DEFAULT 設定檔的內容,將 VERIFY_FUNCTION_11G 設為密碼複雜性的檢驗函數,並修改某些密碼設定,讓使用 DEFAULT 設定 檔的使用者密碼限制變得更加嚴格,以增加資料庫的安全性。 SQL> connect / as sysdba Connected. --UNIX平台 SQL> @$ORACLE_HOME/db_1/rdbms/admin/utlpwdmg.sql --Windows平台 SQL> @c:appadministratorproduct11.1.0db_1rdbmsadminutlpwdmg.sql Function created. --建立VERIFY_FUNCTION_11G函數在SYS綱要 Profile altered. --修改DEFAULT設定檔內容 Function created. --建立11g之前的檢驗函數VERIFY_FUNCTION在SYS綱要
  • 14. Chapter 7 User And Privilege Oracle Database 11g 資料庫管理入門 由上圖可以得知,DEFAULT 設定檔被修改為密碼有效期限為 180 天,當密碼過期後,第一次登入起算 7 天為寬限期。可以重複使用舊密碼,因為 PASSWORD_REUSE_MAX 與 PASSWORD_REUSE_TIME 皆為 UNLIMITED。連續輸入錯誤密碼 10 次,將導致使用者帳戶被鎖定 1 天,期滿後將自動解除鎖定。 最後所有的密碼,不論是建立使用者時所給予的密碼或事後修改的密碼,都必須經過 VERIFY_FUNCTION_11G 函數的檢驗,通過後才能使用該密碼。 以下條列出 VERIFY_FUNCTION_11G 對密碼所作的檢驗項目,其檢驗項目可由 utlpwdmg.sql 中得知。 • 密碼長度不得少於 8 個字 • 密碼不得與使用者名字相同或使用者名字逆向拼寫(例如:使用者名字為 oracle,則密碼不能為 elcaro) • 密碼不得與伺服器名字相同或將伺服器名字加上 1 到 100 的數字(例如:伺服器名字為 frank11g, 則密碼不能為 frank11g1 或 frank11g100) • 密碼不得為 oracle 或 oracle 加上 1 到 100 的數字 • 密碼不得為以下常見密碼:welcome1、database1、account1、user1234、password1、 oracle123、computer1、abcdefg1、change_on_install • 密碼必須有至少一個數字與英文字母 • 新密碼必須與舊密碼至少有 3 個字不相同 至於 VERIFY_FUNCTION 的檢驗條件較 VERIFY_FUNCIONT_11G 寬鬆多。 • 密碼長度不得少於 4 個字 • 密碼不得與使用者名字相同 • 密碼不得為以下常見密碼:welcome、database、account、user、password、oracle、 computer、abcd • 密碼必須有至少一個數字、英文字母與特殊符號(!"#$%&()``*+,-/:;<=>?_) • 新密碼必須與舊密碼至少有 3 個字不相同 不過為資料庫的安全性著想,當 Oracle 資料庫版本為 11g 時,建議使用 VERIFY_FUNCTION_11G 檢 驗密碼。 SQL> connect / as sysdba
  • 15. Chapter 7 User And Privilege Oracle Database 11g 資料庫管理入門 Connected. SQL> CREATE USER green IDENTIFIED BY myboss; CREATE USER green IDENTIFIED BY myboss * ERROR at line 1: ORA-28003: password verification for the specified password failed ORA-20001: Password length less than 8 7.2.2 資源限制(Resource Limit) 設定檔除了可以對使用者的密碼進行限制外,還可用來限制階段作業所能消耗的一些資源。當階段作業所 消耗的資源量已經達到限制數量時,該階段作業將會被強制登出,以減少 Oracle 資料庫整體的資源消耗。 不過資源限制只有在資料庫資源已經不足的情況下,才有其必要。因此資料庫管理者可以透過 RESOURCE_LIMIT 參數啟動(TRUE)或關閉(FALSE)資源限制。若 RESOURCE_LIMIT 參數值為 FALSE, 即便設定檔中有對資源設定限制,也不會發生任何影響,直到資料庫管理者將 RESOURCE_LIMIT 參數 設為 TRUE 後,才會開始發生作用。 SQL> connect / as sysdba Connected. SQL> SELECT DISTINCT resource_name FROM dba_profiles 2 WHERE resource_type='KERNEL'; RESOURCE_NAME --------------------------------------------- COMPOSITE_LIMIT SESSIONS_PER_USER CPU_PER_CALL LOGICAL_READS_PER_SESSION LOGICAL_READS_PER_CALL PRIVATE_SGA CPU_PER_SESSION IDLE_TIME CONNECT_TIME 9 rows selected. --啟動資源限制設定 SQL> ALTER SYSTEM SET resource_limit=TRUE; CPU/階段作業(CPU_PER_SESSION) 此設定用來限制每個階段作業所能消耗的 CPU 總時間(單位為 1/100 秒),一但超過此限制,正在進行中 的交易將被退回(Rollback),此階段作業也被強制登出。錯誤訊息為 ORA-02392: exceeded session limit on CPU usage, you are being logged off。 SQL> connect / as sysdba Connected. --建立測試表格,通常不建議建立在SYSTEM綱要中,因為尚未建立其他的使用者。 SQL> CREATE TABLE system.big1 AS SELECT * FROM dba_objects; SQL> COMMIT; --結束交易 SQL> SELECT COUNT(*) FROM system.big1; COUNT(*) ---------------
  • 16. Chapter 7 User And Privilege Oracle Database 11g 資料庫管理入門 68213 --交易開始 SQL> DELETE system.big1 WHERE object_id=2000; 1 row deleted. SQL> SELECT COUNT(*) FROM system.big1; COUNT(*) --------------- 68212 SQL> DELETE system.big1; DELETE big1 * ERROR at line 1: ORA-02392: exceeded session limit on CPU usage, you are being logged off --超過CPU_PER_SESSION限制,這裡使用的值為CPU_PER_SESSION=5 SQL> SELECT COUNT(*) FROM system.big1; SELECT COUNT(*) FROM system.big1 * ERROR at line 1: ORA-01012: not logged on --階段作業已經被強制登出,交易也被自動退回 Process ID: 30701 Session ID: 285 Serial number: 14071 SQL> CONNECT / AS SYSDBA --重新建立一個新階段作業 Connected. SQL> SELECT COUNT(*) FROM system.big1; COUNT(*) -------------- 68213 --之前的交易的確已經被自動退回 CPU/呼叫(CPU_PER_CALL) 此設定用來限制每個 CPU 呼叫(解析-parse、執行-execute、回傳-fetch)不能消耗超過多少的 CPU 時間 (單位為 1/100 秒),一但超過限制,該 CPU 呼叫將會被取消,操作也會被退回。不過整個交易依然還在 持續中,階段作業也繼續存在不會被強制登出。錯誤訊息為 ORA-02393: exceeded call limit on CPU usage。 SQL> connect / as sysdba Connected. SQL> COMMIT; SQL> SELECT COUNT(*) FROM system.big1; COUNT(*) --------------- 68213 --交易開始 SQL> DELETE system.big1 WHERE object_id=2000;
  • 17. Chapter 7 User And Privilege Oracle Database 11g 資料庫管理入門 1 row deleted. SQL> SELECT COUNT(*) FROM system.big1; COUNT(*) --------------- 68212 SQL> DELETE system.big1; delete big1 * ERROR at line 1: ORA-02393: exceeded call limit on CPU usage --超過CPU_PER_CALL的限制,此設定為CPU_PER_CALL=5 SQL> SELECT COUNT(*) FROM system.big1; COUNT(*) --------------- 68212 --並沒有被退回,object_id=2000的資料列還是被刪除 --人為退回交易 SQL> ROLLBACK; Rollback complete. SQL> SELECT COUNT(*) FROM system.big1; COUNT(*) --------------- 68213 --與交易前相同
  • 18. Chapter 7 User And Privilege Oracle Database 11g 資料庫管理入門 連線時間(CONNECT_TIME) 此設定用來限制每個階段作業的總連線時間不能超過多少分鐘。若超過該階段作業將被強制登出,正在進 行的交易也會被自動退回。訊息如下:ORA-02399: exceeded maximum connect time, you are being logged off 閒置時間(IDLE_TIME) 此設定用在限制每個階段作業不能連續超做多少分鐘沒有任何動作。若持續閒置時間超過限制,則此階段 作業將被強制登出,且交易自動退回。錯誤訊息如下:ORA-02396: exceeded maximum idle time, please connect again 並行階段作業(SESSIONS_PER_USER) 此設定用來限制使用同一個資料庫帳戶所能建立的階段作業總數,若超過限制,新的階段作業將無法建立, 並會出現錯誤訊息 ORA-02391: exceeded simultaneous SESSIONS_PER_USER limit。這個設定很適 合用在 3-Tier 或 C/S 架構的應用程式中,因為這種應用程式通常使用同一個資料庫帳戶建立多個階段作 業,資料庫管理者可以依照資料庫的負荷能力,藉由 SESSIONS_PER_USER 限制同時能夠登入資料庫 的階段作業數量。同時搭配 CONNECT_TIME 與 IDLE_TIME 將連線時間過長或閒置過久的階段作業終止, 這樣便可讓資料庫可以在最佳的負荷狀態下運行,而不會有過多的階段作業連入,造成整體資料庫的效能 下降。 讀取/階段作業(LOGICAL_READS_PER_SESSION) 此設定用在限制每個階段作業累計可以讀取的資料區塊數量不能超過多少,雖然名為 LOGICAL_READS_PER_SESSION,但是這裡的讀取是由實體讀取(Physical Read)與邏輯讀取(Logical Read)組成。如果超過讀取總數量,則階段作業會出現錯誤訊息 ORA-02394: exceeded session limit on IO usage, you are being logged off,正在進行中的交易將會被退回,階段作業也會被強制登出。 讀取/呼叫(LOGICAL_READS_PER_CALL) 此設定用在限制每個呼叫最多可以讀取的資料區塊,如果超過讀取總數量,則階段作業會出現錯誤訊息 ORA-02395: exceeded call limit on IO usage,正在進行中的 SQL 敘述句將會被退回,但交易不會有 影響,依然持續中,同時階段作業也繼續運行。 專用 SGA(PRIVATE_SGA) 當階段作業為共享伺服器(Shared Server)模式時,階段作業的使用者整體區域(User Global Area)將會放 在系統整體區域(System Global Area)中的大型集區(Large Pool)或共用集區(Shared Pool)。而 UGA 由 階段作業資訊(Session Information)、游標狀態(Cursor State)與 SQL 工作區域(SQL Work Area)等所 組成。資料庫管理者可以透過此設定限制每個階段作業的 UGA 不能超過 KB(KiloBytes),不過此設定僅 能在階段作業使用共用伺服器時才有效果。當階段作業所使用的 SGA 空間大小超過專用 SGA 的限制時, 將會出現錯誤訊息 ORA-02397: exceeded PRIVATE_SGA limit, you are being logged off,並被強制 登出。 複合限制(COMPOSITE_LIMIT) 此設定是將 CPU_PER_SESSION、LOGICAL_READS_PER_SESSION、CONNECT_TIME 與 PRIVATE_SGA,依 RESOURCE_COST 中所設定的成本,使用加權計算的方式得出複合限制值。因此 資料庫管理者可以自行依照目前資料庫最欠缺的資源,將其資源成本設定較其資源來的大,則便可以讓消
  • 19. Chapter 7 User And Privilege Oracle Database 11g 資料庫管理入門 耗越多欠缺資源的階段作業,比其他階段作業更容易達到資源上限,而被強制離線。若超過此設定值,則 會出現錯誤訊息 ORA-02390: exceeded COMPOSITE_LIMIT, you are being logged off,同時進行中 的交易將會被退回,階段作業也會被強制登出。 SQL> connect / as sysdba Connected. SQL> SELECT * FROM resource_cost; RESOURCE_NAME UNIT_COST --------------------------------------------------- ---------------- CPU_PER_SESSION 0 LOGICAL_READS_PER_SESSION 0 CONNECT_TIME 0 PRIVATE_SGA 0 SQL> ALTER RESOURCE COST 2 CPU_PER_SESSION 10 3 CONNECT_TIME 1; Resource cost altered. SQL> SELECT * FROM resource_cost; RESOURCE_NAME UNIT_COST ----------------------------------------------------- ----------------- CPU_PER_SESSION 10 LOGICAL_READS_PER_SESSION 0 CONNECT_TIME 1 PRIVATE_SGA 0 /*複合限制=CPU_PER_SESSION*10+LOGICAL_READS_PER_SESSION*0+CONNECT_TIME*1+PRIV ATE_SGA*0 */
  • 20. Chapter 7 User And Privilege Oracle Database 11g 資料庫管理入門 7.2.3 建立、修改、刪除設定檔(Create、Alter、Drop Profile) 建立設定檔使用 CREATE PROFILE 指令。資料庫管理者不需要將設定所有的參數,只要設定那些與 DEFAULT 設定檔不同的設定值即可,因為未設定的參數預設值為 DEFAULT(參考 DEFAULT 設定檔的 參數值)。 SQL> connect / as sysdba Connected. --建立一個測試使用者FRANK SQL> CREATE USER frank IDENTIFIED BY oracle; SQL> SELECT username,profile FROM dba_users WHERE username='FRANK'; USERNAME PROFILE ------------------------------ ------------------------------ FRANK DEFAULT --因為沒有指定設定檔,所以Oracle資料庫自動指派DEAFULT設定檔 --建立一個設定檔TEST_PROF3 SQL> CREATE PROFILE test_prof3 LIMIT 2 PASSWORD_LIFE_TIME 100 3 PASSWORD_REUSE_MAX 5 4 PASSWORD_REUSE_TIME 10 5 CPU_PER_SESSION 1000 6 LOGICAL_READS_PER_SESSION 10000; SQL> SELECT resource_name,limit FROM dba_profiles WHERE profile='TEST_PROF3';
  • 21. Chapter 7 User And Privilege Oracle Database 11g 資料庫管理入門 RESOURCE_NAME LIMIT ------------------------------------------------------ ---------------------------------------- COMPOSITE_LIMIT DEFAULT --參照DEFUALT設定檔的內容 SESSIONS_PER_USER DEFAULT CPU_PER_SESSION 1000 CPU_PER_CALL DEFAULT LOGICAL_READS_PER_SESSION 10000 LOGICAL_READS_PER_CALL DEFAULT IDLE_TIME DEFAULT CONNECT_TIME DEFAULT PRIVATE_SGA DEFAULT FAILED_LOGIN_ATTEMPTS DEFAULT PASSWORD_LIFE_TIME 100 PASSWORD_REUSE_TIME 10 PASSWORD_REUSE_MAX 5 PASSWORD_VERIFY_FUNCTION DEFAULT PASSWORD_LOCK_TIME DEFAULT PASSWORD_GRACE_TIME DEFAULT SQL> ALTER USER frank PROFILE test_prof3; --指派給FRANK使用 SQL> SELECT username,profile FROM dba_users WHERE username='FRANK'; USERNAME PROFILE ------------------------------ ------------------------------ FRANK TEST_PROF3 修改設定檔使用 ALTER PROFILE 指定。不過當修改設定檔後,修改後的內容只對之後建立的階段作業 生效,目前已經建立的階段作業不受影響。 SQL> connect / as sysdba Connected. --修改TEST_PROF3的一些設定值 SQL> ALTER PROFILE test_prof3 LIMIT 2 SESSIONS_PER_USER 5 3 CONNECT_TIME 60; SQL> SELECT resource_name,limit FROM dba_profiles WHERE profile='TEST_PROF3'; RESOURCE_NAME LIMIT ------------------------------------------------------ ---------------------------------------- COMPOSITE_LIMIT DEFAULT SESSIONS_PER_USER 5 --修改後的設定值 CPU_PER_SESSION 1000 CPU_PER_CALL DEFAULT LOGICAL_READS_PER_SESSION 10000 LOGICAL_READS_PER_CALL DEFAULT IDLE_TIME DEFAULT CONNECT_TIME 60 --修改後的設定值 PRIVATE_SGA DEFAULT FAILED_LOGIN_ATTEMPTS DEFAULT PASSWORD_LIFE_TIME 100 PASSWORD_REUSE_TIME 10 PASSWORD_REUSE_MAX 5 PASSWORD_VERIFY_FUNCTION DEFAULT PASSWORD_LOCK_TIME DEFAULT
  • 22. Chapter 7 User And Privilege Oracle Database 11g 資料庫管理入門 PASSWORD_GRACE_TIME DEFAULT 刪除設定檔使用 DROP PROFILE 指令。如果被刪除的設定檔已經指派給某個使用者,則需要使用 DROP PROFILE CASCADE。如果某個使用者所使用的設定檔被刪除後,則 Oracle 資料庫自動將 DEFAULT 設定檔指派給該使用者,所以每個使用者一定會被指派一個設定檔,同時 DEFAULT 設定檔不會被刪除。 SQL> connect / as sysdba Connected. SQL> SELECT DISTINCT profile FROM dba_profiles; PROFILE ------------------------------ WKSYS_PROF PROF_1 TEST_PROF3 TEST_PROF DEFAULT TEST_PROF2 SQL> DROP PROFILE "DEFAULT"; --DEFAULT設定檔不能被刪除 DROP PROFILE "DEFAULT" * ERROR at line 1: ORA-02381: cannot drop PUBLIC_DEFAULT profile SQL> DROP PROFILE test_prof2; --因為TEST_PROF2沒有指派給任何使用者 Profile dropped. SQL> DROP PROFILE test_prof3; --因為TEST_PROF3至少指派給一個使用者,必須加上CASCADE DROP PROFILE test_prof3 * ERROR at line 1: ORA-02382: profile TEST_PROF3 has users assigned, cannot drop without CASCADE SQL> SELECT username,profile FROM dba_users WHERE profile='TEST_PROF3'; USERNAME PROFILE ------------------------------ ------------------------------ FRANK TEST_PROF3 SQL> DROP PROFILE test_prof3 CASCADE; Profile dropped. --因為TEST_PROF3設定檔被刪除,所以Oracle資料庫將DEFAULT設定檔指派給FRANK SQL> SELECT username,profile FROM dba_users WHERE username='FRANK'; USERNAME PROFILE ------------------------------ ------------------------------ FRANK DEFAULT 7.3 使用者(User) 建立一個資料庫使用者,需要一個重要的系統權限:CREATE USER。當擁有 CREATE USER 權限後, 任何人都可以建立資料庫使用者。所以不要隨便將 CREATE USE 權限授與給不需要的人,以免造成資料
  • 23. Chapter 7 User And Privilege Oracle Database 11g 資料庫管理入門 庫的安全漏洞。當一個使用者被建立的同時,一個與使用者同名的綱要(Schema)也一起被建立。綱要與 使用者為兩個不同的物件,但是兩者有著密不可分的關係,即所有放在某綱要下的物件,便是與綱要相同 名字的使用者所擁有。同時只要是某個使用者所擁有的物件,一定會出現在同名的綱要內。所以綱要可以 視為一個邏輯的容器,裡面放著同名使用者擁有的所有物件。所以當執行 CREATE TABLE frank.T1 指 令時,frank 指的是 frank 綱要,而不是 frank 這個使用者。不過因為放在 frank 綱要下的物件,就是 frank 使用者所擁有的物件,所以有些人便將綱要與使用者混為一談,因此這裡要分清處它倆的差異。 7.3.1 建立新使用者(Create a New User) 當 Oracle 資料庫建立後,有許多的使用者帳戶會自動建立,例如:SYS、SYSTEM、SYSMAN、 DBSNMP 等。不過這些使用者是資料庫管理用的帳戶,並不是讓一般應用程式登入資料庫所使用。 其中最重要的一個使用者為 SYS。因為資料辭典的表格都放在 SYS 綱要中,同時從 Oracle Database9i 開始,SYS 必須以 AS SYSDBA 身份登入。否則為出現錯誤訊息,而無法登入。 當然還有一個重要使用者叫做 SYSTEM,因為 SYSTEM 被授與 DBA 角色,所以可以用來一般的資料庫 管理工作。除非 SYSTEM 使用者無法做到某些資料庫操作,例如開啟、關閉執行處理,建立資料庫或備 份、復原資料庫等工作,這時才會使用 SYS 帳號,不然一般使用 SYSTEM 帳號管理資料庫即可。 至於 SYSMAN 與 DBSNMP 這兩個使用者,只有當資料庫有設定資料庫控制(Database Control)時,才 會有這兩個使用者存在。 因此資料庫管理者必須建立一些使用者,讓前端應用程式可以使用這些帳戶登入資料庫。不過在建立資料 庫使用者之前,管理者要先回答下列問題,例如:使用者的預設表格空間與暫時表格空間為何?以及密碼 管理與資源限制的設定檔為何?,如此才能正確地設定使用者的相關參數。 預設表格空間(Default Tablespace) 當使用者建立一個新區段(Segment)時,若沒有指定該區段所使用的表格空間,則 Oracle 資料庫自動將 該區段建立在使用者的預設表格空間內。但是如果建立使用者時,連管理者也沒有設定預設表格空間參數, 則 Oracle 資料庫會使用資料庫的預設表格空間當作該使用者的預設表格空間。不過要注意,預設表格空 間只能使用表格空間的內容為永久型態的表格空間,不然將會出現錯誤訊息’ORA-12910: cannot specify temporary tablespace as default tablespace’或’ORA-30033: Undo tablespace cannot be specified as default user tablespace’。 同時當使用者想要建立某種區段時,必須擁有建立該種區段的權限(例如:建立表格需要 CREATE TABLE 權限),以及對區段所在的表格空間還有足夠的配額。即便是使用者的預設表格空間也不能例外, 必須要有配額才能使用該表格空間的空間。 暫時表格空間(Temporary Tablespace) 當使用者的 SELECT 指令中包含 DISTINCT 子句、使用 GROUPING FUNCTION、GROUP BY 子句或 ORDER BY 等指令,或執行 CREATE INDEX 等 SQL 指令時,都需要進行一些排序(Sort)操作。此時如
  • 24. Chapter 7 User And Privilege Oracle Database 11g 資料庫管理入門 果階段作業的 PGA 空間夠大,則可以在記憶體中進行排序稱作記憶體排序(Memory Sort)。然而可能因 為需要排序的資料過多或 PGA 空間不足,因此需要將資料先存放到暫時區段,然後才進行排序,此種方 式稱做磁碟排序(Disk Sort)。 所以建立使用者時,資料庫管理者可以設定使用者進行磁碟排序時,暫時區段所使用的暫時表格空間。若 管理者沒有指定,則 Oracle 資料庫自動將資料庫的預設暫時表格空間設定為使用者的暫時表格空間。不 過在指定暫時表格空間時,所使用的表格空間的內容必須是暫時型態,否則將會出現錯誤訊息’ORA- 12911: permanent tablespace cannot be temporary tablespace’。 SQL> connect / as sysdba Connected. SQL> SELECT property_name,property_value FROM database_properties 2 WHERE property_name LIKE '%TABLESPACE'; PROPERTY_NAME PROPERTY_VALUE ------------------------------------------------------ -------------------------------------------------- DEFAULT_TEMP_TABLESPACE TEMPTS1 DEFAULT_PERMANENT_TABLESPACE USERS SQL> SELECT tablespace_name,contents FROM dba_tablespaces; TABLESPACE_NAME CONTENTS ------------------------------ ------------------- SYSTEM PERMANENT SYSAUX PERMANENT UNDOTBS UNDO TEMPTS1 TEMPORARY USERS PERMANENT TEMPFRANK TEMPORARY BIGTS_NEW PERMANENT DEMOTS PERMANENT TEMP TEMPORARY /*只有CONTENTS為PERMANENT的表格空間可以當作預設表格空間。CONTENTS為TEMPORARY的表格 空間才能當作暫時表格空間。*/ SQL> SELECT DISTINCT profile FROM dba_profiles; PROFILE ------------------------------ WKSYS_PROF DEFAULT TEST_PROF /*建立使用者時,若未指定設定檔,則Oracle資料庫自動選擇Default設定檔,為此使用者的密碼與資源限制 設定檔。*/ 建立使用者 建立資料庫使用者指令相當簡單,只要擁有 CREATE USER 的系統權限,便可以使用 CREATE USER 的 SQL 指令或資料庫控制(Database Control)建立一個資料庫使用者。 SQL> connect / as sysdba Connected. SQL> DROP USER frank CASCADE; --清除之前的測試使用者
  • 25. Chapter 7 User And Privilege Oracle Database 11g 資料庫管理入門 密碼驗證 SQL> CREATE USER frank --不能與現存的使用者或角色相同名字 2 IDENTIFIED BY oracle --使用密碼驗證 3 DEFAULT TABLESPACE demots --當建立區段卻未指定所在表格空間時,將區段建立在此表格空間 4 TEMPORARY TABLESPACE temp --當需要暫時區段時,將暫時區段建立在此表格空間內 5 QUOTA 10M ON users --最多可以使用多少的空間,每個表格都要設定 6 QUOTA 10M ON demots 7 PASSWORD EXPIRE --讓密碼僅能使用在第一次登入時,之後立刻要求使用者更改密碼 8 ACCOUNT LOCK --當使用者被鎖定後,根本不能登入資料庫,直到解除鎖定為止 9 PROFILE TEST_PROF --密碼管理與資源使用限制受到此設定檔影響 10 ; 作業系統驗證 當欲使用作業系統驗證時,首先要確定兩件事:OS_AUTHENT_PREFIX 的值與作業系統使用者名字。因 為資料庫使用者名字必須為這兩個值結合後的結果,例如 OS_AUTHENT_PREFIX=ops$而作業系統使用 者為 frank,則資料庫使用者為 OPS$FRANK。不過如果 OS_AUTHENT_PREFIX 的參數值變更為 UUU 後,原來可以使用作業系統驗證登入的使用者便無法登入,因為所產生的資料庫使用者名字變為 UUUFRANK,這個使用者名字並不存在於資料庫中。 SQL> SHOW PARAMETER os_authent_prefix NAME TYPE VALUE ------------------------------------------ ----------- ---------- os_authent_prefix string ops$ SQL> SELECT DISTINCT osuser FROM v$session; --找出目前所有階段作業在作業系統中所有的名字 OSUSER ------------------------------ oracle SQL> CREATE USER ops$frank --frank為作業系統的使用者名字 2 IDENTIFIED EXTERNALLY; --外部驗證 --若作業系統為Windows平台系列 --SQLNET.ORA檔案中有SQLNET.AUTHENTICATION_SERVICE=(NTS),這是預設值 SQL> create user "OPS$FRANK11GADMINISTRATOR" identified externally; /*作業系統使用者名字為Domain_nameUsername,如果沒有加入網域,網域名字以機器名稱代替。因為為 不是合法的命名字元,所以整個資料庫名字必須用雙引號包起來,同時資料庫使用者名字必須使用大寫英文字 母。 若想移除網域名字,需要將OSAUTH_PREFIX_DOMAIN=FALSE加到Windows Registry中*/ 全域驗證 SQL> CREATE USER global_frank 2 IDENTIFIED GLOBALLY AS 'CN=frank,OU=Education,O=UUU,C=TW'; --全域驗證 使用者密碼 SQL> SELECT username,password,account_status 2 FROM dba_users
  • 26. Chapter 7 User And Privilege Oracle Database 11g 資料庫管理入門 3 WHERE username LIKE '%FRANK%'; USERNAME PASSWORD ACCOUNT_STATUS ------------------------------ ----------------------------------- -------------------------------- OPS$FRANK EXTERNAL OPEN FRANK EXPIRED & LOCKED GLOBAL_FRANK GLOBAL OPEN /*Oracle Database 11g後會安全起見,在此欄位上無法看到加密後的密碼字串。如果需要察看密碼字串,可 以由sys.user$.password得知。當ACCOUNT_STATUS為EXPIRED表示密碼已經失效,下一次登入資料庫 時會被要求更改密碼。若ACCOUNT_STATUS為LOCKED,則不能登入資料庫。*/ SQL> SELECT name,password FROM sys.user$ WHERE name='FRANK'; NAME PASSWORD ------------------------------ ------------------------------ FRANK 8A52535A7428572D --是由username+password本文,經雜湊運算後的密文
  • 27. Chapter 7 User And Privilege Oracle Database 11g 資料庫管理入門 帳戶鎖定與密碼失效 當使用者帳戶被鎖定後,使用者便無法登入資料庫,這是當使用者長期不需要登入資料庫時,最安全的一 種處置。 [oracle@ELinux ~]$ sqlplus frank/oracle ERROR: ORA-28000: the account is locked 然而如果帳戶沒有被鎖定,則使用者登入資料庫時,通過身份辨識後,Oracle 資料庫就會檢查使用者密 碼是否失效,若為失效狀態。則會出現要求更改密碼的畫面,使用者必須遵守設定檔的密碼限制來更改密
  • 28. Chapter 7 User And Privilege Oracle Database 11g 資料庫管理入門 碼,否則將一直僵持在更改密碼畫面。 當密碼失效檢查通過後,接著 Oracle 資料庫檢查使用者是否擁有 CREATE SESSION 權限,若有 CREATE SESSION 權限則建立階段作業。 [oracle@ELinux ~]$ sqlplus frank/oracle ERROR: ORA-28001: the password has expired Changing password for frank New password: abc123 Retype new password: abc123 ERROR: ORA-01045: user FRANK lacks CREATE SESSION privilege; logon denied --無法建立階段作業 Password changed --表示密碼已經改變為abc123。 /*但在Oracle11g之前的版本,都會出現password unchanged,但密碼已更改的情況。*/ 配額(Quota) 配額用來限制使用者對每個表格空間的使用量,當配額超過或沒有設定配額時,使用者將無法增加對表格 空間的使用。這樣可以避免使用者意外地消耗過多表格空間的空間,也可以減少使用者將區段放置到錯誤 的表格空間中的機會。當建立使用者時,若沒有設定任何配額。則表示該使用者沒有任何的配額,也就是
  • 29. Chapter 7 User And Privilege Oracle Database 11g 資料庫管理入門 說使用者不能使用任何表格空間的空間。資料庫管理者可以藉由 DBA_TS_QUOTAS 查知使用者空間配 額與表格空間的關係。 SQL> CONNECT / AS SYSDBA Connected. SQL> CREATE USER test_user1 IDENTIFIED BY oracle; User created. SQL> GRANT CREATE SESSION,CREATE TABLE TO test_user1; Grant succeeded. SQL> CONNECT test_user1/oracle; --切換身份為test_user1 SQL> CREATE TABLE t1 (a NUMBER) ; CREATE TABLE t1 (a NUMBER) * ERROR at line 1: ORA-01950: no privileges on tablespace 'USERS' /*這個錯誤訊息說明test_user1根本沒有設定任何配額在表格空間users上 */ SQL> CONNECT / AS SYSDBA Connected. SQL> ALTER USER test_user1 QUOTA 1M ON USERS; --給與test_user1有1M的配額在users表格空間中 SQL> SELECT tablespace_name,bytes,max_bytes FROM dba_ts_quotas 2 WHERE username='TEST_USER1'; TABLESPACE_NAME BYTES MAX_BYTES ------------------------------ ---------- ------------------ USERS 0 1048576 /*BYTES為已使用的空間。MAX_BYTES為配額上限,若為-1表示為無限制(UNLIMITED)*/ SQL> CREATE TABLE test_user1.t1 (a NUMBER) ; /*因為表格放在test_user1綱要中,所以使用的空間配額為test_user1的配額。同時因為未指定表格空間,所 以使用test_user1的預設表格空間放此表格。*/ SQL> SELECT tablespace_name,bytes,max_bytes FROM dba_ts_quotas 2 WHERE username='TEST_USER1'; TABLESPACE_NAME BYTES MAX_BYTES ------------------------------ ---------- ------------------ USERS 65536 1048576 /*已用掉65536(64K)的空間配額*/ SQL> INSERT INTO test_user1.t1 VALUES(1);
  • 30. Chapter 7 User And Privilege Oracle Database 11g 資料庫管理入門 SQL> COMMIT; SQL> SELECT * FROM test_user1.t1; A ----------- 1 當配額小於已使用空間時,只是表示此使用者不能再新增使用空間在此表格空間。而不會刪除任何已存在 表格或資料。 SQL> ALTER USER test_user1 QUOTA 0 ON users; --將表格空間users的配額設為0 SQL> SELECT tablespace_name,bytes,max_bytes FROM dba_ts_quotas 2 WHERE username='TEST_USER1'; no rows selected SQL> CREATE TABLE test_user1.t2(a NUMBER) TABLESPACE users; CREATE TABLE test_user1.t2(a NUMBER) TABLESPACE users * ERROR at line 1: ORA-01536: space quota exceeded for tablespace 'USERS' /*已使用的空間超過表格空間的配額,這個錯誤訊息與沒有設定配額是不同的錯誤訊息。*/ SQL> SELECT * FROM test_user1.t1; --已經存在的表格,不會因為配額因素而被刪除 A ----------- 1 7.2.2 修改使用者設定(Alter User) 當使用者建立後,除了使用者名字不能更改外,其餘的的設定都可以使用 ALTER USER 指令修改。 SQL> connect / as sysdba Connected. SQL> SELECT username,account_status FROM dba_users WHERE username='FRANK'; USERNAME ACCOUNT_STATUS ------------------------------ -------------------------------- FRANK EXPIRED & LOCKED -- 帳戶被鎖定以及密碼失效 SQL> ALTER USER frank ACCOUNT UNLOCK; --解除帳戶鎖定 SQL> SELECT username,account_status FROM dba_users WHERE username='FRANK'; USERNAME ACCOUNT_STATUS ------------------------------ -------------------------------- FRANK EXPIRED --密碼還是失效 SQL> ALTER USER frank IDENTIFIED BY oracle; --重新指派新密碼給frank SQL> SELECT username,account_status FROM dba_users WHERE username='FRANK'; USERNAME ACCOUNT_STATUS
  • 31. Chapter 7 User And Privilege Oracle Database 11g 資料庫管理入門 ------------------------------ -------------------------------- FRANK OPEN --使用者可以登入且密碼有效 SQL> ALTER USER frank DEFAULT TABLESPACE users 2 QUOTA 20M ON users QUOTA 0 ON demots; --更改使用者對表格空間的配額設定 SQL> ALTER USER frank PROFILE default; --要求frank使用default設定檔 7.2.3 刪除使用者(Drop User) 當使用者暫時不需要登入資料庫時,只需將其鎖定即可。但是如果使用者已不再需要存在時,建議將它刪 除,以免留下一個資料庫安全的漏洞。根據是否有綱要物件存在,決定刪除使用者的語法。一但使用者被 刪除後,所有這個使用者擁有的物件都會一併被刪除,由於 DROP USER 為 DDL 指令,不能被退回 (Rollback),所以執行 DROP USER 指令時千萬要三思而後行。同時刪除使用者為資料庫中重要且危險的 工作,需要被授與 DROP USER 權限才可以執行 DROP USER 的操作。 SQL> connect / as sysdba Connected. SQL> DROP USER wilson; --因為WILSON綱要中沒有任何綱要物件存在。 User dropped. SQL> DROP USER linda; DROP USER linda * ERROR at line 1: ORA-01922: CASCADE must be specified to drop 'LINDA' /*因為LINDA綱要中有至少一個綱要物件存在。這是提供一個機會,讓管理者知道這個使用者的綱要中,還有 一些物件存在。可以再確認後,才繼續刪除使用者。*/ SQL> SELECT object_name,object_type FROM dba_objects WHERE owner='LINDA'; OBJECT_NAME OBJECT_TYPE ------------------------------ ------------------- T2 TABLE T1 VIEW /*發現LINDA擁有這兩個物件。*/ SQL> DROP USER LINDA CASCADE; --CASACDE參數會先將所有的綱要物件刪除後,才刪除使用者。 User dropped. /*所有屬於LINDA的物件都隨著使用者刪除而一併被刪除。*/ SQL> DROP USER gigi; --如果GIGI已經建立至少一個階段作業時,Oracle資料庫無法刪除連線中的使用者 DROP USER gigi * ERROR at line 1: ORA-01940: cannot drop a user that is currently connected
  • 32. Chapter 7 User And Privilege Oracle Database 11g 資料庫管理入門 7.2.4 代理使用者(Proxy User) 代理使用者允許使用者依自己的帳號與密碼登入資料庫,但建立階段作業後,使用者的身份卻變成另一個 使用者。這個功能早在 Oracle Database8i 時就已經存在,只是當時只能用在 OCI 呼叫所撰寫的程式中, Oracle Database9i 再延伸到使用 JAVA 所撰寫的程式,直到 Oracle Database10g R2 後,才能用在 SQL*PLUS 的環境中。 SQL> connect / as sysdba Connected. SQL> CREATE USER app_user IDENTIFIED BY app_user; User created. SQL> GRANT CREATE SESSION TO app_user; Grant succeeded. SQL> CREATE USER client_user1 IDENTIFIED BY client_user1 2> QUOTA 10M ON users; User created. SQL> GRANT CREATE SESSION,CREATE TABLE TO client_user1; Grant succeeded. SQL> ALTER USER client_user1 GRANT CONNECT THROUGH app_user; User altered. SQL> CREATE TABLE client_user1.test_tab(a NUMBER); Table created. SQL> INSERT INTO client_user1.test_tab VALUES(1); 1 row created. SQL> COMMIT; Commit complete. /*使用一般的方式登入*/ SQL> CONNECT app_user/app_user Connected. SQL> SHOW USER USER is "APP_USER" SQL> SELECT * FROM client_user1; SELECT * FROM client_user1 * ERROR at line 1: ORA-00942: table or view does not exist --使用代理使用者登入,以app_user的帳號與密碼登入,但登入後身份卻為client_user1 SQL> CONNECT app_user[client_user1]/app_user Connected. SQL> SHOW USER
  • 33. Chapter 7 User And Privilege Oracle Database 11g 資料庫管理入門 USER is "CLIENT_USER1" --雖然以app_user身份登入,但使用者身份卻為client_user1 SQL> SELECT * FROM test_tab; A ----------- 1 7.4 權限(Privilege) 在 Oracle 資料庫中,為了保護資料庫中的資料,Oracle 資料庫採用正面表列的方式,即藉由權限 (privilege)的授與,控制使用者所能執行的操作,如果沒有被授與權限或權限被收回,則無法進行相關的 操作。因此當一個新的使用者被建立後,預設是沒有任何權限,也就是一開始使用者無法做任何事,直到 被授與適當的權限為止。整個 Oracle 資料庫將所有的權限分為系統權限與物件權限兩種。 7.4.1 系統權限(System Privilege) Oracle 資料庫的系統權限用來給予使用者可以對資料庫進行某些特殊管理操作,例如:建立使用者 (CREATE USER)、建立表格(CREATE TABLE)、查詢任何綱要中的表格(SELECT ANY TABLE)等動作。 系統權限的個數有隨著 Oracle 資料庫版本的增加而增多的趨勢,例如: 在 Oracl9i 時僅有 126 種系統權 限,而 Oracle10g 已增加到 166 種系統權限,但 Oracle11g 竟然有多達 206 種系統權限。 ANY SCHEMA 有時候資料庫管理者會看到兩個系統權限非常的相似,只差了一個字:ANY,例如 CREATE TABLE 與 CREATE ANY TABLE。有加上 ANY 與非有 ANY 的系統權限的差別,在於有 ANY 的系統權限範圍可 以跨越綱要。例如:被授與 CREATE TABLE 權限的使用者,可以建立表格在自己的綱要中。然而被授 與 CREATE ANY TABLE 的使用者,則可以建立表格在任何綱要中。至於 ANY 是否包含 SYS 綱要,則 根據參數 O7_DICTIONARY_ACCESSIBILITY 的值決定。若
  • 34. Chapter 7 User And Privilege Oracle Database 11g 資料庫管理入門 O7_DICTIONARY_ACCESSIBILITY=FALSE,則 ANY 設定不包含 SYS 綱要。反之若為 TRUE,則 ANY 有包含 SYS 綱要。 不過為保護 SYS 綱要資料辭典(Data Dictionary)安全,自從 Oracle Database 9i 開始 O7_DICTIONARY_ACCESSIBILITY 預設值變為 FALSE。若有使用者因為工作需要,必須查詢資料辭 典內容,資料庫管理者可以透過授與 SELECT_CATALOG_ROLE 角色或授與 SELECT ANY DICTIONARY 給該使用者,便可以讓使用者查詢資料辭典的內容。 SELECT ANY DICTIONARY 是 Oracle Database 9i 所新增的系統權限,可以讓使用者查詢所有的資料 辭典與資料辭典視觀圖。這種做法相對輕鬆,但是也隱含資安漏洞,因為是任何的資料辭典表格與視觀圖。 因為 SELECT_CATALOG_ROLE 是由物件權限所組成的,這些物件是資料辭典視觀圖(Data Dictionary View),所以當使用者想要查詢的資料辭典或資料辭典視觀圖不在 SELECT_CATALOG_ROLE 的授權範 圍時,則無法查詢,此時需要額外的授權。這樣雖然比較麻煩,但是對整體資料庫安全而言是相對正確的 做法。 SQL> CONNECT / AS SYSDBA SQL> SHOW PARAMETER O7_DICTIONARY_ACCESSIBILITY NAME TYPE VALUE ------------------------------------------------------ ----------- ------------------------------ O7_DICTIONARY_ACCESSIBILITY boolean FALSE SQL> GRANT CREATE SESSION TO gigi IDENTIFIED BY oracle; --建立測試使用者gigi SQL> CONNECT gigi/oracle Connected. SQL> SHOW USER USER is "GIGI" SQL> SELECT * FROM session_privs; PRIVILEGE ---------------------------------------- CREATE SESSION SQL> SELECT COUNT(*) FROM hr.employees; SELECT COUNT(*) FROM hr.employees * ERROR at line 1: ORA-00942: table or view does not exist /*Oracle 資料庫為增加安全性,當查詢某個表格或視觀圖時,不管是沒有查詢權限還是根本沒有該物件,錯 誤訊息都會出現為ORA-00942:表格或視觀圖不存在,以避免讓有不良企圖的使用者得知物件存在,只是沒 有權限而已。*/ SQL> CONNECT system/oracle Connected. SQL> GRANT SELECT ANY TABLE TO gigi; /*SELECT ANY TABLE可以查詢任何綱要的表格或視觀圖。*/ SQL> CONNECT gigi/oracle Connected. SQL> SELECT * FROM session_privs; --SESSION_PRIVS可以查知目前可以使用那些系統權限 PRIVILEGE ----------------------------------------
  • 35. Chapter 7 User And Privilege Oracle Database 11g 資料庫管理入門 CREATE SESSION SELECT ANY TABLE SQL> SELECT COUNT(*) FROM hr.employees; --需要安裝範例綱要 COUNT(*) --------------- 107 SQL> SELECT COUNT(*) FROM sh.sales; --需要安裝範例綱要 COUNT(*) --------------- 918843 SQL> SELECT COUNT(*) FROM dba_tables; SELECT COUNT(*) FROM dba_tables * ERROR at line 1: ORA-00942: table or view does not exist /* O7_DICTIONARY_ACCESSIBILTY=FALSE時,ANY不包含SYS綱要,所以SELECT ANY TABLE無法 查詢到資料辭典視觀圖。*/ SQL> SELECT COUNT(*) FROM sys.tab$; SELECT COUNT(*) FROM sys.tab$ * ERROR at line 1: ORA-00942: table or view does not exist /* O7_DICTIONARY_ACCESSIBILTY=FALSE時,ANY不包含SYS綱要,所以SELECT ANY TABLE無法 查詢到資料辭典表格。*/ SQL> CONNECT / AS SYSDBA Connected. SQL> GRANT SELECT ANY DICTIONARY TO gigi; Grant succeeded. SQL> REVOKE SELECT ANY TABLE FROM gigi; Revoke succeeded. SQL> CONNECT gigi/oracle Connected. SQL> SELECT * FROM session_privs; PRIVILEGE ---------------------------------------- CREATE SESSION SELECT ANY DICTIONARY SQL> SELECT COUNT(*) FROM hr.employees; SELECT COUNT(*) FROM hr.employees * ERROR at line 1: ORA-00942: table or view does not exist SQL> SELECT COUNT(*) FROM dba_tables;
  • 36. Chapter 7 User And Privilege Oracle Database 11g 資料庫管理入門 COUNT(*) --------------- 2522 SQL> SELECT COUNT(*) FROM sys.tab$; COUNT(*) --------------- 2587 SQL> CONNECT system/oracle Connected. SQL> REVOKE SELECT ANY DICTIONARY FROM gigi; Revoke succeeded. SQL> GRANT SELECT_CATALOG_ROLE TO gigi; Grant succeeded. SQL> CONNECT gigi/oracle Connected. SQL> SELECT * FROM session_privs; PRIVILEGE ---------------------------------------- CREATE SESSION SQL> SELECT * FROM session_roles; ROLE ------------------------------ CONNECT SELECT_CATALOG_ROLE HS_ADMIN_ROLE SQL> SELECT COUNT(*) FROM hr.employees; SELECT COUNT(*) FROM hr.employees * ERROR at line 1: ORA-00942: table or view does not exist SQL> SELECT COUNT(*) FROM dba_tables; COUNT(*) --------------- 2522 SQL> SELECT COUNT(*) FROM sys.tab$; SELECT COUNT(*) FROM sys.tab$ * ERROR at line 1: ORA-00942: table or view does not exist 由以上的範例得知,SELECT ANY TABLE 無法查詢資料辭典表格或資料辭典視觀圖,但可以查詢除 SYS 綱要外的所有表格與視觀圖。而 SELECT ANY DICTIONARY 可以用來查詢資料辭典表格或資料辭
  • 37. Chapter 7 User And Privilege Oracle Database 11g 資料庫管理入門 典視觀圖,但卻無法用來非 SYS 綱要外的表格或視觀圖上。因此資料庫管理者在授與 SELECT ANY TABLE 與 SELECT ANY DICTIONARY 時,要依據使用者的需求授與其適當的權限即可。 7.4.2 物件權限(Object Privilege) 物件權限是給予使用者對某個綱要物件進行某種操作的權限,物件權限依不同的物件型態有不同的物件權 限。例如:表格物件有 ALTER、DELETE、INDEX、INSERT、SELECT、UPDATE、REFERENCES、 ON COMMIT REFRESH、QUERY REWRITE、DEBUG、FLASHBACK 等 11 種權限,而函數 (Function)物件或程序(Procedure)物件則有 EXECUTE 與 DEBUG 兩種。在 Oracle Database 11g 時, 共有 26 種不同型態的物件權限。 7.4.3 授與權限(Grant Privilege) 使用 GRANT 指令,可以權限授與使用者、角色或 PUBLIC。PUBLIC 是一種特殊的角色,代表著資料庫 的所有人。一但權限授與給 PUBLIC 時,所有資料庫的使用者都可以得到此權限,可以簡化授權的操作, 但是卻帶來資料庫安全的風險,一般不建議使用這種方式。 SQL> CONNECT / AS SYSDBA SQL> GRANT CREATE SESSION to scott IDENTIFIED BY tiger; --建立一個測試使用者scott SQL> GRANT CREATE SESSION to green IDENTIFIED BY oracle; --授與系統權限 SQL> GRANT SELECT ANY TABLE,CREATE TABLE TO frank,scott; /*同時將SELECT ANY TABLE,CREATE TABLE系統權限授與frank與scott兩人,這兩人僅能使用SELECT ANY TABLE與CREATE TABLE權限,但不能授與或收回該權限。*/
  • 38. Chapter 7 User And Privilege Oracle Database 11g 資料庫管理入門 SQL> GRANT SELECT ANY TABLE,CREATE TABLE TO frank WITH ADMIN OPTION; /*除了將SELECT ANY TABLE,CREATE TABLE權限授與frank外,並且讓frank擁有管理SELECT ANY TA BLE與CREATE TABLE的權力,因此frank可以將SELECT ANY TABLE或CREATE TABLE授與任何人或角 色,而且也可以由任何人或角色身上收回這兩個系統權限。*/ --授與物件權限 SQL> CREATE TABLE frank.big1 AS SELECT * FROM DBA_OBJECTS; --建立範例表格 SQL> GRANT SELECT ON frank.big1 TO scott; /*授與frank綱要中表格big1上的SELECT權限給scott,但是scott僅能使用該權限,但不能將權限授與給他 人。*/ SQL> GRANT SELECT ON frank.big1 TO scott WITH GRANT OPTION; /*scott除了自己被授與frank綱要的big1表格上的SELECT 權限外,還可以將該權限授權給其他人。*/ SQL> CONNECT scott/tiger --切換身份為scott SQL> GRANT SELECT ON frank.big1 TO green; --scott將frank.big1的SELECT權限授與green 7.4.4 收回權限(Revoke Privilege) 權限既然可以被授與,當然也可以被收回。不過當收回權限時,依系統權限與物件權限有不同的方法。首 先收回系統權限時,使用者必須擁有該系統權限的 ADMIN OPTION,才能收回該系統權限。可以由 DBA_SYS_PRIVS 中查知系統權限授權給哪些人或哪些角色。 SQL> CONNECT / AS SYSDBA SQL> SELECT grantee,admin_option FROM dba_sys_privs 2 WHERE privilege='SELECT ANY TABLE'; GRANTEE ADM ------------------------------------------------------ ------- DBA YES MDSYS NO SYS YES IMP_FULL_DATABASE NO WKSYS NO EXP_FULL_DATABASE NO DATAPUMP_IMP_FULL_DATABASE NO OLAP_DBA NO FLOWS_030000 NO SYSTEM NO OLAPSYS NO FRANK YES SQL> REVOKE SELECT ANY TABLE FROM frank; --將SELECT ANY TABLE由frank身上收回 Revoke succeeded. SQL> SELECT grantee,admin_option FROM dba_sys_privs 2 WHERE privilege='SELECT ANY TABLE'; GRANTEE ADM ------------------------------------------------------ ------- DBA YES MDSYS NO SYS YES IMP_FULL_DATABASE NO WKSYS NO EXP_FULL_DATABASE NO
  • 39. Chapter 7 User And Privilege Oracle Database 11g 資料庫管理入門 DATAPUMP_IMP_FULL_DATABASE NO OLAP_DBA NO FLOWS_030000 NO SYSTEM NO OLAPSYS NO /* frank不在擁有SELECT ANY TABLE權限*/ 重疊收回(CASCADE REVOKE) 當物件權限被收回時,有一種系統權限沒有的特色:重疊收回。即收回某使用者被授與的物件權限時,所 有由該使用者所授權出去的物件權限都會被一起收回,而系統權限則須一個個的收回。不過如果欲收回的 物件權限不是由收回者所直接授與,則無法收回該物件權限。可以由 DBA_TAB_PRIVS/ALL_TAB_PRIVS/USER_TAB_PRIVS 查知物件權限的階層關係。 SQL> CONNECT / AS SYSDBA --查詢哪些人被授與frank.big1表格的SELECT權限 SQL> SELECT grantee,grantor,grantable FROM dba_tab_privs 2 WHERE owner='FRANK' AND table_name='BIG1'; GRANTEE GRANTOR GRA ------------------------------ ----------------------------------- ------- SCOTT FRANK YES GREEN SCOTT NO /*可以得知FRANK授權給SCOTT,而SCOTT再將權限授權給GREEN。關係為FRANK->SCOTT->GREEN*/ SQL> CONNECT frank/oracle --身份切換為frank Connected. SQL> SHOW USER USER is "FRANK" SQL> REVOKE SELECT ON frank.big1 FROM green; REVOKE SELECT ON frank.big1 FROM green * ERROR at line 1: ORA-01927: cannot REVOKE privileges you did not grant /*green的權限來自於scott,只能由scott收回green的權限。或者藉由CASCADE REVOKE機制,收回scott 的權限時,會先將green的權限收回。*/ SQL> SELECT grantee,grantor,grantable FROM user_tab_privs 2 WHERE table_name='BIG1'; GRANTEE GRANTOR GRA ------------------------------ ----------------------------------- ------- SCOTT FRANK YES GREEN SCOTT NO SQL> REVOKE SELECT ON big1 FROM scott; Revoke succeeded. SQL> SELECT grantee,grantor,grantable FROM user_tab_privs 2 WHERE table_name='BIG1'; no rows selected /*不僅是scott的物件權限被收回,同時由scott所授權出去的物件權限也一併被收回,這就是重疊收回(CASC ADE REVOKE)。不過只有在收回物件權限時,才會有此現象,收回系統權限必須一個一個慢慢收回。*/
  • 40. Chapter 7 User And Privilege Oracle Database 11g 資料庫管理入門 7.5 角色(Role) Oracle 資料庫藉由權限的授與與收回,讓被授權的使用者只能進行被授權的操作。不過當授與或收回權 限給個別使用者時,通常需要授與或收回多次,這樣會花費資料庫管理人員大量的時間與心力。而且如果 不小心將不該授與的權限授與給不適當的使用者,或未收回不再需要某些權限,這樣反而造成資料庫安全 的漏洞。因此 Oracle 資料庫可以利用角色來達到下面幾點好處: 簡化權限管理:避免權限管理的負擔與減少錯誤發生的機會。管理者只要先建立一個角色,再將某些權限 授予給該角色,最後將角色授予給使用者,則使用者便擁有該角色所被授與的權限。 動態權限管理:當使用者所被授與的角色,其權限有所變動時。使用者自然隨著角色權限的增減,而得到 或減少所能使用的權限。這樣資料庫管理者可以經由角色權限的變動,動態地讓使用者的權限增加或減少。 有選擇性的權限使用:資料庫管理者可以藉由角色的啟用(Enable)或關閉(Disable),讓使用者暫時擁有某 些權限,或暫時失去某些權限。同時角色啟用時,可以要求驗證,只有驗證通過後,才能使用該角色所帶 來的權限。 7.5.1 建立角色(Create Role) 建立角色的指令為 CREATE ROLE,較建立使用者更為簡單。因為角色只是權限的集合,沒有一些其他 的設定。不過角色可以加上驗證機制,避免使用者隨便自行啟用角色。 • 角色有以下的幾個特點: • 角色不能與現有角色或使用者相同名字。 • 角色為系統權限與物件權限的集合,而不是使用者的集合。 • 角色可以被授權給其他角色與使用者,或由其他角色與使用者處收回。 • 角色不能直接或間接地授權給自己。 • 角色授權與收回的 SQL 指令如同授權與收回系統權限一般。 • 角色不被任何人擁有,角色也沒有對應的綱要存在。 • 角色可以動態地啟用或關閉。 • 角色可以要求使用正確密碼才能啟動。 資料庫管理者可以由 DBA_ROLES 查知有哪些角色存在以及使否需要密碼才能啟動。 建立角色(Create Role)
  • 41. Chapter 7 User And Privilege Oracle Database 11g 資料庫管理入門 因為角色為完成某些工作所需的權限集合,所以當建立角色時,通常以工作職稱或應用程式為角色名字。 SQL> CREATE ROLE test_role_a; --建立一個不需要驗證即可啟用的角色 SQL> CREATE ROLE test_role_b --建立一個需要驗證才能啟用的角色 2 IDENTIFIED BY oracle; --建立一個區域角色(Local Role),角色啟用透過密碼進行驗證。 /*IDENTIFIED EXTERNALLY 建立一個外部角色(External Role),角色啟用透過作業系統進行驗證。*/ /*IDENTIFIED GLOALLY 建立一個全域角色(Global Role),角色啟用透過目錄服務(Directory Service)進行 驗證。*/ /*IDENTIFIED USING package_name 建立一個應用程式角色(Application Role),角色啟用透過套件(Pack age)進行驗證。*/ SQL> CREATE ROLE test_role_c; SQL> SELECT * FROM dba_roles WHERE role LIKE 'TEST_ROLE_%'; ROLE PASSWORD ------------------------------ ------------------ TEST_ROLE_A NO TEST_ROLE_B YES TEST_ROLE_C NO --將權限授權給角色,權限可以為物件或系統權限 SQL> GRANT CREATE PROCEDURE,CREATE ANY TABLE TO test_role_a; SQL> GRANT SELECT ANY TABLE TO test_role_b; SQL> GRANT CREATE MATERIALIZED VIEW TO test_role_c; SQL> GRANT SELECT ON frank.big1 TO test_role_c; --可以由ROLE_SYS_PRIVS查知每個角色被授與的系統權限 SQL> SELECT role,privilege,admin_option FROM role_sys_privs 2 WHERE role LIKE 'TEST_ROLE_%'; ROLE PRIVILEGE ADM ------------------------------ ---------------------------------------------- ------- TEST_ROLE_C CREATE MATERIALIZED VIEW NO TEST_ROLE_A CREATE ANY TABLE NO TEST_ROLE_A CREATE PROCEDURE NO TEST_ROLE_B SELECT ANY TABLE NO --可以由ROLE_TAB_PRIVS得到角色被授與的物件權限 SQL> SELECT role,owner,table_name,privilege,grantable 2 FROM role_tab_privs 3 WHERE role LIKE 'TEST_ROLE_%'; ROLE OWNER TABLE_NAME PRIVILEGE GRA -------------------- --------------------- ---------------------------------- ----------------------- -------- TEST_ROLE_C FRANK BIG1 SELECT NO --將角色授權給使用者 SQL> GRANT test_role_a,test_role_b TO frank; SQL> GRANT test_role_c TO frank WITH ADMIN OPTION; /*將frank不僅能使用test_role_c所帶來的權限,也可將test_role_c角色授權給其他使用者或角色,或由其他 角色或使用者處收回test_role_c角色。*/ --透過DBA_ROLE_PRIVS可以得到角色授權給哪些使用者、角色,以及是否有ADMIN OPTION SQL> SELECT * FROM dba_role_privs 2 WHERE granted_role LIKE 'TEST_ROLE_%';
  • 42. Chapter 7 User And Privilege Oracle Database 11g 資料庫管理入門 GRANTEE GRANTED_ROLE ADM DEF ------------------------------ ------------------------------ ------- ------- FRANK TEST_ROLE_B NO YES SYS TEST_ROLE_C YES YES --因為TEST_ROLE_C為SYS所建立 FRANK TEST_ROLE_C YES YES --ADM=YES表示有ADMIN OPTION SYS TEST_ROLE_B YES YES FRANK TEST_ROLE_A NO YES SYS TEST_ROLE_A YES YES 修改角色(Alter Role) 當角色建立後,資料庫管理者只能更改驗證的方法,其實也沒有其他設定可以修改。 SQL> ALTER ROLE test_role_a IDENTIFIED BY oracle; SQL> SELECT * FROM dba_roles WHERE role='TEST_ROLE_A'; ROLE PASSWORD ------------------------------ ----------------- TEST_ROLE_A YES SQL> ALTER ROLE test_role_a NOT IDENTIFIED; SQL> SELECT * FROM dba_roles WHERE role='TEST_ROLE_A'; ROLE PASSWORD ------------------------------ ----------------- TEST_ROLE_A NO 刪除角色(Drop Role) 當角色被刪除時,Oracle 資料庫自動將角色由被授權的使用者與角色處收回,然後才刪除角色。如果角 色被刪除時,已經被使用者啟用,則已啟用的角色所帶來的權限不受影響,可以繼續使用那些權限。 SQL> DROP ROLE test_role; 7.5.2 預設角色(Default Role) 預設角色為當使用者登入資料庫後,會自動生效的角色。通常將角色授權給使用者時,這個角色便成為預 設角色。可是有時候使用者被授與角色,是因為備援的關係,例如副主管也會被授與主管的權限,因為當 主管不在辦公室時,則副主管必須能夠代行主管權責。可是平常主管在辦公室時,副主管則不能也不該使 用主管權限。所以資料庫管理者可以建立一個主管角色並加上密碼驗證,然後將主管角色授與副主管,但 是不要讓主管角色為副主管的預設角色。因此平常副主管登入資料庫時,僅擁有自己的角色與權限,一但 當主管離開辦公室時,副主管便可以利用密碼將主管角色生效,便可以代理主管的工作,卻不會同時有兩 個人同時握有主管權限造成雙頭馬車的問題。 資料庫管理者可以由 DBA_ROLE_PRIVS 來得到使用者所被授與的角色及預設角色為何。 SQL> CONNECT / AS SYSDBA SQL> SELECT granted_role,default_role FROM dba_role_privs 2 WHERE grantee='FRANK'; GRANTED_ROLE DEF ------------------------------ ------- TEST_ROLE_B YES TEST_ROLE_C YES TEST_ROLE_A YES
  • 43. Chapter 7 User And Privilege Oracle Database 11g 資料庫管理入門 --使用frank身份登入 [oracle@ELinux ~]$ sqlplus frank/oracle SQL> SHOW USER USER is "FRANK" SQL> SELECT * FROM session_roles; --此階段作業目前啟用的角色 ROLE ------------------------------ TEST_ROLE_A TEST_ROLE_B TEST_ROLE_C /*因為test_role_a,test_role_b,test_role_c都是預設角色,所以即使test_role_b需要驗證才能啟用,但是 預設角色不在此限,因為預設角色為登入後自動啟用,不須另外啟用。*/ SQL> SELECT * FROM session_privs; --此階段作業目前可以使用的系統權限 PRIVILEGE ---------------------------------------- CREATE SESSION CREATE TABLE CREATE ANY TABLE SELECT ANY TABLE CREATE PROCEDURE CREATE MATERIALIZED VIEW SELECT ANY DICTIONARY 7 rows selected. SQL> exit; --結束此階段作業 修改使用者的預設角色 資料庫管理者可以事後修改使用者的預設角色,這個操作不會將角色收回,只是設定那些角色在階段作業 建立時,不會自動啟用,需要額外使用 SET ROLE 啟用角色。 SQL> SHOW USER USER is "SYS" SQL> ALTER USER frank DEFAULT ROLE NONE; --將所有的被授與角色都變成不是預設角色 SQL> SELECT granted_role,default_role FROM dba_role_privs 2 WHERE grantee='FRANK'; GRANTED_ROLE DEF ------------------------------ ------- TEST_ROLE_B NO TEST_ROLE_C NO TEST_ROLE_A NO SQL> ALTER USER frank DEFAULT ROLE test_role_b,test_role_c; /*將test_role_b與test_role_c設定為預設角色,其餘被授與的角色為非預設角色。*/ SQL> SELECT granted_role,default_role FROM dba_role_privs 2 WHERE grantee='FRANK'; GRANTED_ROLE DEF ------------------------------ ------- TEST_ROLE_B YES TEST_ROLE_C YES
  • 44. Chapter 7 User And Privilege Oracle Database 11g 資料庫管理入門 TEST_ROLE_A NO SQL> ALTER USER frank DEFAULT ROLE ALL; --將所有被授與的角色都設定為預設角色 SQL> SELECT granted_role,default_role FROM dba_role_privs 2 WHERE grantee='FRANK'; GRANTED_ROLE DEF ------------------------------ ------ TEST_ROLE_B YES TEST_ROLE_C YES TEST_ROLE_A YES SQL> ALTER USER frank DEFAULT ROLE ALL EXCEPT test_role_b,test_role_c; /*除了test_role_b與test_role_c外,其餘被授與的角色都設為預設角色。*/ SQL> SELECT granted_role,default_role FROM dba_role_privs 2 WHERE grantee='FRANK'; GRANTED_ROLE DEF ------------------------------ ------ TEST_ROLE_B NO TEST_ROLE_C NO TEST_ROLE_A YES 7.5.3 啟用角色(Set Role) 當階段作業建立後,Oracle 資料庫會自動啟用使用者的預設角色。使用者可以自行查詢 SESSION_ROLES 得知目前階段作業中已啟用的角色,也可以透過 SESSION_PRIVS 知道可以使用那些 系統權限。然而不是預設角色的啟用,則需要使用 SET ROLE 指令。可是 SET ROLE 指令也可以將某些 角色關閉,因為 SET ROLE 用來設定目前階段作業欲啟用的角色。若一個已啟用的角色,沒有被後續的 SET ROLE 指令指明,則 Oracle 資料庫會將該角色關閉。 [oracle@ELinux ~]$ sqlplus frank/oracle SQL> SHOW USER USER is "FRANK" SQL> SELECT * FROM session_roles; ROLE ------------------------------ TEST_ROLE_A --只有test_role_a為預設角色 SQL> SET ROLE test_role_c; --將啟用test_role_c,其他角色必須關閉 SQL> SELECT * FROM session_roles; ROLE ------------------------------ TEST_ROLE_C --只有test_role_c角色被啟用,test_role_b角色反而被關閉 SQL> SET ROLE ALL; --因為test_role_b需要驗證,不能使用ALL SET ROLE ALL * ERROR at line 1: ORA-01979: missing or invalid password for role 'TEST_ROLE_B'
  • 45. Chapter 7 User And Privilege Oracle Database 11g 資料庫管理入門 SQL> SET ROLE test_role_a,test_role_b IDENTIFIED BY oracle,test_role_c; /*要求啟用test_role_a,test_role_b,test_role_c這幾個角色*/ SQL> SELECT * FROM session_roles; ROLE ------------------------------ TEST_ROLE_A TEST_ROLE_B TEST_ROLE_C SQL> SET ROLE NONE; --關閉所有角色 SQL> SELECT * FROM session_roles; no rows selected SQL> SET ROLE ALL EXCEPT test_role_b; --啟用所有被授與的角色,除了test_role_b SQL> SELECT * FROM session_roles; ROLE ------------------------------ TEST_ROLE_A TEST_ROLE_C SQL> SET ROLE dba; --只能啟用已經被授與的角色 SET ROLE dba * ERROR at line 1: ORA-01924: role 'DBA' not granted or does not exist
  • 46. Chapter 7 User And Privilege Oracle Database 11g 資料庫管理入門 7.5.4 事先定義的角色(Predefined Role) 所謂事先定義的角色,是指那些在建立資料庫的同時,Oracle 資料庫預先建立與授與權限的角色,主要 是為了減輕資料庫管理者的負擔,不需要建立角色與授與權限給角色即可立刻使用。Oracle Database 11g 中的預設角色有:AQ_ADMINISTRATOR_ROLE、AQ_USER_ROLE、CONNECT、DBA、 DELETE_CATALOG_ROLE、EXECUTE_CATALOG_ROLE、EXP_FULL_DATABASE、 HS_ADMIN_ROLE、IMP_FULL_DATABASE、RECOVERY_CATALOG_OWNER、RESOURCE、 SCHEDULER_ADMIN、SELECT_CATALOG_ROLE、XDBADMIN、XDB_SET_INVOKER、 XDB_WEBSERVICES 、 XDB_WEBSERVICES_OVER_HTTP 、 XDB_WEBSERVICES_WITH_PUBLIC 。 這些角色中以 CONNECT 與 RESOURCE 最為人所熟知。許多資料庫管理者建立使用者後,通常都會立 刻授予 CONNECT 角色給使用者,這樣使用者使用如建立階段作業(CREATE SESSION)、建立表格 (CREATE TABLE)等基本權限。若此使用者是程式設計人員,那麼 DBA 就會將 RESOURCE 角色也授予 使用者,讓其擁有一些開發資料庫程式所需要的權限。事實上有許多 DBA 根本不知道他自己到底給予了 使用者那些權限,只是依循以前的步驟。也不知道這些角色中,其實隱藏著一些安全漏洞。 CONNECT 如同之前所言,角色是為了簡化權限的管理。所以當 DBA 授予某個角色給使用者時,當然必須先了解這 個角色,到底是由那些權限所組成的。DBA 可以查詢下列的視觀圖(VIEW)來得到這些資訊。通常是查詢 ROLE_SYS_PRIVS(系統權限授與給那些角色)或 DBA_SYS_PRIVS(系統權限授與給那些角色或使用者): SQL> CONNECT system/oracle --此處使用system身份即可 SQL> show user USER 為 "SYSTEM" SQL> DESC role_sys_privs Name Null? Type ----------------------------------------- ----------------------- ---------------------------------------- ROLE NOT NULL VARCHAR2(30) PRIVILEGE NOT NULL VARCHAR2(40) ADMIN_OPTION VARCHAR2(3) SQL> DESC dba_sys_privs Name Null? Type ----------------------------------------- ----------------------- ---------------------------------------- PRIVILEGE NOT NULL VARCHAR2(40) ADMIN_OPTION VARCHAR2(3) 不過有一個需要注意的地方,那就是查詢 ROLE_SYS_PRIVS 中,無法找到 CONNECT 或 RESOURCE 兩個角色的資訊,必須查詢 DBA_SYS_PRIVS 才可以得到有關的資訊。 /*在Oracle Database 10g之前的版本*/ SQL> select privilege from role_sys_privs where role='CONNECT'; 沒有任何資料列被選取 SQL> select privilege from dba_sys_privs where grantee='CONNECT'; PRIVILEGE ---------------------------------------- CREATE SESSION CREATE SYNONYM CREATE SEQUENCE CREATE DATABASE LINK 已選取 8 個資料列.
  • 47. Chapter 7 User And Privilege Oracle Database 11g 資料庫管理入門 SQL> select privilege from role_sys_privs where role='RESOURCE'; 沒有任何資料列被選取 SQL> select privilege from dba_sys_privs where grantee='RESOURCE'; PRIVILEGE ---------------------------------------- CREATE TYPE CREATE TABLE CREATE CLUSTER CREATE TRIGGER CREATE OPERATOR CREATE SEQUENCE CREATE INDEXTYPE CREATE PROCEDURE 已選取 8 個資料列. /*以上結果在Oracle Database 9i資料庫方為如此*/ 所以當使用者被授予 CONNECT 角色後,他便擁有 CREATE VIEW,CREATE TABLE,ALTER SESSION,CREATE CLUSTER,CREATE SESSION,CREATE SYNONYMN,CREATE SEQUENCE,CREATE DATABASE LINK 等權限,這也就是為何要授予 CONNECT 角色給一般使用者 的原因,可以簡化權限管理的複雜度。 但是在 Oracle Database 10g R2 之後,CONNECT 角色所內含的權限僅剩下 CREATE SESSION 一個, 其餘的權限都不再被預設授予給 CONNECT 角色。所以如果 DBA 還是因循過去的方法建立使用者,那麼 這個使用者只能建立連線但無法進行其他的動作,若 DBA 不能深究授予 CONNECT 角色的原因,一但出 現權限不足的問題,就無法很快地解決問題。 SQL> show user USER 為 "SYSTEM" SQL> select privilege from dba_sys_privs where grantee='CONNECT'; PRIVILEGE ---------------------------------------- CREATE SESSION SQL> create user frank identified by oracle; 已建立使用者. SQL> grant connect to frank; 順利授權. SQL> connect frank/oracle 已連線. SQL> show user USER 為 "FRANK" SQL> select * from session_roles; ROLE ------------------------------ CONNECT SQL> select * from session_privs; PRIVILEGE ---------------------------------------- CREATE SESSION 為了解決 Oracle Database 10g R2 後 CONNECT 角色的內容更動,DBA 可以利用下列兩種方式來解決 所遇到的問題: DBA 另外建立一個新的角色,將其餘的權限(CREATE VIEW,CREATE TABLE,ALTER SESSION,CREATE CLUSTER, CREATE SYNONYMN,CREATE SEQUENCE,CREATE DATABASE
  • 48. Chapter 7 User And Privilege Oracle Database 11g 資料庫管理入門 LINK)授予給新建的角色,之後找到有那些使用者或角色已經被授予 CONNECT 角色,最後將新建的角 色授予給那些使用者即可。 SQL> show user USER 為 "SYSTEM" SQL> create role new_connect; SQL> grant create table,create view,create cluster,create synonym,create sequence,create database li nk, alter session to new_connect; 順利授權. SQL> select grantee from dba_role_privs where granted_role='CONNECT'; GRANTEE ------------------------------ WMSYS IX PM OLAP_USER MDDATA FRANK SYS EXFSYS MDSYS SCOTT 已選取 10 個資料列. SQL> grant new_connect to frank; 順利授權. SQL> connect frank/oracle 已連線. SQL> show user USER 為 "FRANK" SQL> select * from session_roles; ROLE ------------------------------ CONNECT NEW_CONNECT SQL> select * from session_privs; PRIVILEGE ---------------------------------------- CREATE SESSION ALTER SESSION CREATE TABLE CREATE CLUSTER CREATE SYNONYM CREATE VIEW CREATE SEQUENCE CREATE DATABASE LINK 已選取 8 個資料列. 執行%ORACLE_HOME%rdbmsadminrstrconn.sql(Windows 平台)或 $ORACLE_HOME/rdbms/admin/rstrconn.sql(UNIX 平台),將 CREATE VIEW,CREATE TABLE,ALTER SESSION,CREATE CLUSTER, CREATE SYNONYMN,CREATE SEQUENCE,CREATE DATABASE LINK 再授予給 CONNECT 角色,使 CONNECT 角色的內容恢復到 Oracle Database10gR2 之前的樣子。 SQL> show user USER 為 "SYSTEM" SQL> select privilege from dba_sys_privs where grantee='CONNECT';
  • 49. Chapter 7 User And Privilege Oracle Database 11g 資料庫管理入門 PRIVILEGE ---------------------------------------- CREATE SESSION SQL>@$ORACLE_HOME/rdbms/admin/rstrconn.sql 順利授權 確認完成 SQL> select privilege from dba_sys_privs where grantee='CONNECT'; PRIVILEGE ---------------------------------------- CREATE VIEW CREATE TABLE ALTER SESSION CREATE CLUSTER CREATE SESSION CREATE SYNONYM CREATE SEQUENCE CREATE DATABASE LINK 已選取 8 個資料列. RESOURCE 由之前的資訊可以得知,RESOURCE 角色擁有 CREATE TYPE,CREATE TABLE,CREATE CLUSTER,CREATE TRIGGER,CREATE OPERATOR,CREATE SEQUENCE,CREATE INDEXTYPE,CREATE PROCEDURE 這些權限,所以被授予這個角色的使用者,就間接擁有這些權限。 這些權限大多數是當進行資料庫程式開發時,建立一些資料庫物件所必須的權限,所以一般的 DBA 通常 會直接授予 RESOURCE 角色給程式設計人員,讓他們可以順利地進行開發工作。但是在建立資料庫物件 之前,使出者必須先要建立資料庫連線,也就是同時必須擁有 CREATE SESSION 的權限。也就是如此, 就形成文章前面所形容的情形,當 DBA 建立一個新的使用者時,便會順便授予 CONNECT 與 RESOURCE 兩個角色給使用者,讓使用者可以順利地進行他的工作。不過在 Oracle 資料庫中,建立 SEGMENT(即需要空間放資料的物件,如 TABLE,CLUSTER,INDEX 等等)物件時,除了要建立相關物件 的權限外,還要擁有該物件放所放置的表格空間(TABLESPACE)上的空間配額(QUOTA)未超過。而空間 配額的設定可以在建立使用者的同時或之後再更改配額,不過重要是,空間配額預設是沒有,所以沒有設 定就沒有配額。 SQL> show user USER 為 "SYSTEM" SQL> create user testuser1 identified by oracle; 已建立使用者. SQL> grant create table to testuser1; 順利授權. SQL> connect testuser/oracle ERROR: ORA-01045: user TESTUSER lacks CREATE SESSION privilege; logon denied 警告: 您已不再與 ORACLE 相連 SQL> connect system/oracle 已連線. SQL> show user USER 為 "SYSTEM" SQL> grant create session to testuser1; 順利授權. SQL> connect testuser/oracle 已連線. SQL> show user USER 為 "TESTUSER1" SQL> select * from session_roles;
  • 50. Chapter 7 User And Privilege Oracle Database 11g 資料庫管理入門 沒有任何資料列被選取 SQL> select * from session_privs; PRIVILEGE ---------------------------------------- CREATE SESSION CREATE TABLE SQL> create table test1 (a number) tablespace users; create table test1 (a number) tablespace users * ERROR 在行 1: ORA-01950: 沒有表格空間 'USERS' 的權限 SQL> connect system/oracle 已連線. SQL> alter user testuser1 quota 10M on users; 已更改使用者. SQL> connect testuser1/oracle@o10gr2 已連線. SQL> show user USER 為 "TESTUSER1" SQL> create table test1 (a number) tablespace users; 已建立表格. 當授予 RESOURCE 角色給使用者時,有個相信是絕大多數的 DBA 都不知道的安全漏洞,那就是使用者 可以不需任何表格空間的配額,只要有建立物件的權限,即可在任何的表格空間上建立物件。這是因為當 授予 RESOURCE 角色時,Oracle 資料庫會順便授與 UNLIMITED TABLESPACE 給使用者,擁有此權 限的使用者不需要配額即可將物件建立在任何的表格空間上。除了失去原本設計配額這項屬性的意義外, 同時有可能造成整個資料庫中,物件胡亂放置的問題,影響資料庫的管理與安全。 SQL> show user USER 為 "SYSTEM" SQL> create user testuser2 identified by oracle; 已建立使用者. SQL> select privilege from dba_sys_privs where grantee='TESTUSER2'; 沒有任何資料列被選取 SQL> grant connect,resource to testuser2; 順利授權. SQL> select privilege from dba_sys_privs where grantee='TESTUSER2'; PRIVILEGE ---------------------------------------- UNLIMITED TABLESPACE SQL> select privilege from dba_sys_privs where grantee='CONNECT'; PRIVILEGE ---------------------------------------- CREATE SESSION SQL> select privilege from dba_sys_privs where grantee='RESOURCE'; PRIVILEGE ---------------------------------------- CREATE TRIGGER CREATE SEQUENCE CREATE TYPE CREATE PROCEDURE CREATE CLUSTER CREATE OPERATOR CREATE INDEXTYPE CREATE TABLE 已選取 8 個資料列. SQL> connect testuser2/oracle@o10gr2;
  • 51. Chapter 7 User And Privilege Oracle Database 11g 資料庫管理入門 已連線. SQL> show user USER 為 "TESTUSER2" SQL> select * from session_roles; ROLE ------------------------------ CONNECT RESOURCE SQL> select * from session_privs; PRIVILEGE ---------------------------------------- CREATE SESSION UNLIMITED TABLESPACE CREATE TABLE CREATE CLUSTER CREATE SEQUENCE CREATE PROCEDURE CREATE TRIGGER CREATE TYPE CREATE OPERATOR CREATE INDEXTYPE 已選取 10 個資料列. 如何解決這個 Well Known Bug(內行人都知道)? • 直接將”UNLIMITED TABLESPACE”收回即可。 SQL> show user USER 為 "SYSTEM" SQL> select privilege from dba_sys_privs where grantee='TESTUSER2'; PRIVILEGE ---------------------------------------- UNLIMITED TABLESPACE SQL> revoke unlimited tablespace from testuser2; 順利撤銷. SQL> select privilege from dba_sys_privs where grantee='TESTUSER2'; 沒有任何資料列被選取 SQL> connect testuser2/oracle@o10gr2 已連線. SQL> show user USER 為 "TESTUSER2" SQL> select * from session_roles; ROLE ------------------------------ CONNECT RESOURCE SQL> select * from session_privs; PRIVILEGE ---------------------------------------- CREATE SESSION CREATE TABLE CREATE CLUSTER CREATE SEQUENCE CREATE PROCEDURE CREATE TRIGGER CREATE TYPE CREATE OPERATOR CREATE INDEXTYPE
  • 52. Chapter 7 User And Privilege Oracle Database 11g 資料庫管理入門 已選取 9 個資料列. • 新建一個角色,取代 RESOURCE 原本的功能 。 SQL> show user USER 為 "SYSTEM" SQL> create role new_resource; 已建立角色. SQL> select privilege from dba_sys_privs where grantee='RESOURCE'; PRIVILEGE ---------------------------------------- CREATE TRIGGER CREATE SEQUENCE CREATE TYPE CREATE PROCEDURE CREATE CLUSTER CREATE OPERATOR CREATE INDEXTYPE CREATE TABLE 已選取 8 個資料列. SQL> grant create trigger,create sequence,create type,create procedure,create cl uster,create operator,create indextype,create table to new_resource; 順利授權. SQL> select privilege from dba_sys_privs where grantee='NEW_RESOURCE'; PRIVILEGE ---------------------------------------- CREATE OPERATOR CREATE TRIGGER CREATE CLUSTER CREATE TABLE CREATE PROCEDURE CREATE INDEXTYPE CREATE SEQUENCE CREATE TYPE 已選取 8 個資料列. SQL> create user testuser3 identified by oracle; 已建立使用者. SQL> select privilege from dba_sys_privs where grantee='TESTUSER3'; 沒有任何資料列被選取 SQL> grant connect,new_resource to testuser3; 順利授權. SQL> select privilege from dba_sys_privs where grantee='TESTUSER3'; 沒有任何資料列被選取 SQL> connect testuser3/oracle@o10gr2; 已連線. SQL> show user USER 為 "TESTUSER3" SQL> select * from session_roles; ROLE ------------------------------ CONNECT NEW_RESOURCE SQL> select * from session_privs; PRIVILEGE ---------------------------------------- CREATE SESSION CREATE TABLE CREATE CLUSTER
  • 53. Chapter 7 User And Privilege Oracle Database 11g 資料庫管理入門 CREATE SEQUENCE CREATE PROCEDURE CREATE TRIGGER CREATE TYPE CREATE OPERATOR CREATE INDEXTYPE 已選取 9 個資料列. 結論 資料庫安全對資料庫管理者來說是非常重要的一件事,而且資料庫的安全設定,應該早在建立資料庫之前, 就應該規劃完成。同時應用程式存取資料庫的安全設定,也應該在設計應用程式時就加以考慮,而不是留 到應用程式上線後才開始規劃。經過本章節的說明,相信資料庫管理者已經了解如何建立一個新的資料庫 使用者,同時授與使用者所需要的權限。並且使用設定檔要求使用者定期更換密碼、限制密碼的重複使用 與要求密碼的複雜程度等。然而本章只介紹資料庫安全的系統安全與資料安全的部份,至於稽核與資料檔 安全等就留待未來介紹。