2020年12月30日 星期三

7.3 Oracle Profile

Oracle Profile主要是用來限制資料庫使用者對於資料庫資源的使用,以及用來設定使用者的密碼安全性原則,資料庫預設Profile的名稱為 “Default” ,如果在使用者建立時沒有特別設定Profile,那麼就會自動套用到 “Default” 這個 Profile。除了 “Default” 這個 Profile 外,我們可以針對資料庫使用者的特性來建立適合的Profile來套用,Profile可以設定的東西分成資源相關與密碼相關兩類。


與資源相關的Profile設定如下:

  • SESSIONS_PER_USER: 限制單一使用者可以開啟session的數量。

  • CPU_PER_SESSION: 限制單一session可使用的cpu time(單位0.01秒)。

  • CPU_PER_CALL: 限制執行call行動時(例如: parse、execute,fetch…等作業)可使用的 cpu time(單位0.01秒)。

  • CONNECT_TIME: 限制單一session可以待在資料庫裡面的總時間(單位分鐘)。

  • IDLE_TIME: 限制單一session在資料庫裡面可以idle(inactive)的時間(單位分鐘),如果使用者超過了IDLE_TIME後再執行命令,則會與資料庫連線中斷;如果使用者超過了IDLE_TIME並且不再做任何動作,則session的狀態會變成 “SNIPED” ,資料庫不會自動清理這些session,DBA必須手動將這些session kill掉。

  • LOGICAL_READ_PER_SESSION: 限制單一session可以從Memory或Disk中讀取多少個Data Block。

  • LOGICAL_READS_PER_CALL: 限制執行call行動時(例如: parse、execute,fetch…等作業)可以從Memory或Disk中讀取多少個Data Block。

  • PRIVATE_SGA: 限制單一session可以從SGA分配到多少shared_pool。

  • COMPOSITE_LIMIT: 限制單一session可以使用的總資源,單位為service units,此單位表示為上述各項資源設定的加總。


在Profile設定了各項資源限制之後,必須將資料庫參數resource_limit設定為TRUE,這些資源的限制才會生效。


與密碼相關的Profile設定如下:

  • FAILED_LOGIN_ATTEMPTS: 登入失敗幾次鎖定帳號。

  • PASSWORD_LIFE_TIME: 幾天後更換密碼。

  • PASSWORD_LOCK_TIME: 帳號鎖定經過幾天之後自動解鎖。

  • PASSWORD_GRACE_TIME: 密碼到期後還能再使用幾天。

  • PASSWORD_REUSE_TIME: 同樣的密碼經過幾天可以再重複使用。

  • PASSWORD_REUSE_MAX: 密碼要變更過多少次才可以再重複使用同樣的密碼,如果有設定PASSWORD_REUSE_TIME,此密碼還須等到過了REUSE TIME才能再使用。

  • PASSWORD_VERIFY_FUNCTION: 用來設定密碼複雜性原則,此原則是透過建立Function來定義,Oracle 11g提供了verify_function_11G,於 $ORACLE_HOME/rdbms/admin 底下執行utlpwdmg.sql來建立,verify_function_11G限制密碼必須要有下列原則:

  • 密碼長度不可少於8個字。

  • 密碼不得與使用者名稱同或逆向拼寫。

  • 密碼不得包含伺服器名稱。

  • 密碼不得包含 oracle關鍵字。

  • 不得為常見密碼如 welcome1, password…等。

  • 密碼必須含數字與字母。

  • 必須與舊密碼三個字不同。

到了Oracle 12c之後又增加了ora12c_verify_function、ora12c_strong_verify_function、ora12c_stig_verify_function,對於密碼複雜度的要求又更為嚴格,在Oracle 12c之後必須使用$ORACLE_HOME/rdbms/admin 底下的catpvf.sql來建立這些Function,執行catpvf.sql會建立所有可使用的verify function(verify_function_11G、ora12c_verify_function、ora12c_strong_verify_function,ora12c_stig_verify_function),有了這些Verify Function之後只要在Profile裡面設定要使用的Function就可以了。


在了解這些項目之後,我們就可以利用這些項目來建立客製化的Profile,例如建立一個限制IDLE_TIME為30分鐘、60天需變更密碼,以及密碼複雜度為verify_function_11G的Profile:

SQL> create profile user_profile limit

      IDLE_TIME 30

      PASSWORD_LIFE_TIME 60

      PASSWORD_VERIFY_FUNCTION verify_function_11G;


如果要更改Profile可使用alter指令,例如將上述Profile的密碼複雜度原則變更為ora12c_verify_function:

SQL> alter profile user_profile limit

      PASSWORD_VERIFY_FUNCTION ora12c_verify_function;


我們可以透過查詢dba_profiles來檢視Profile所設定的屬性:


目前企業對於使用者密碼的安全性要求較高,因此Profile在密碼原則的運用上還是比較多的。




2020年12月22日 星期二

7.2 資料庫權限

在建立完使用者之後,必須賦予使用者各種權限才能夠在資料庫裡面進行操作,Oracle 資料庫的權限大致上可分為系統權限與物件權限。系統權限大部分與 create 、 drop 、 alter 或者是 any 有關,例如 create session、drop user 、 alter system 、 select any table …等都屬於是系統權限,相關資訊可以從 dba_sys_privs 這裡才查詢;物件權限就是授權使用者能夠存取物件的權限,例如賦予select 、 insert 、 delete 、 update Table 的權限,或是 execute 某個 Procedure 或 Package 的權限等。除此之外還有一些特殊的權限,例如 dba 為資料庫管理者的權限,dba 擁有大部分的系統權限,可以說是除 sys 之外的最高權限; sysdba 為資料庫最高權限的使用者,可以在資料庫做任何事,包括啟動與關閉資料庫…等,sysdba 只有 sys 這個使用者可以使用,即便將 sysdba 授予給一般使用者,在使用 sysdba 登入之後仍然會切換成 sys;sysasm 為 ASM Instance 的管理者權限;而在 Oracle 12c 之後又多出了 sysdg (Data Guard 管理者)、sysbackup (備份管理者)、syskm (金鑰管理者. key management) 這些權限。


權限的授予與移除使用的是 grant 與 revoke 兩個命令:

SQL> grant create session to scott;

      (授予 scott 有 create session 權限)

SQL> revoke create view from scott;

      (移除 scott 的 create view 權限)

SQL> grant select on hr.emp to scott;

      (授予 scott 可以查詢 hr.emp 的權限)


而在 grant 權限的同時,可以加上 with admin option 或者是 with grant option ,意思是授予你權限之後,你可以再把此權限再授予給其他人:

SQL> grant select on hr.emp to scott with admin option;

      (授予 scott select hr.emp 的權限,且 scott 可以再授予別人 select hr.emp)

SQL> grant select on hr.emp to scott with grant option;

      (授予 scott select hr.emp 的權限,且 scott 可以再授予別人 select hr.emp)


兩者的差別在於移除中間人的權限之後,使用 with admin option 的第三人權限不會消失;而使用 with grant option 的第三人權限會消失。


例如 HR 使用 with admin option 授予權限給 Scott,而 Scott 再授予權限給 Jery,如果此時 HR 把 Scott 的權限收回,這時候已經授予給 Jery 的權限不會一起被收回:


同樣的狀況如果 HR 使用的是 with grant option ,那麼將 Scott 的權限收回後,Jery 的權限也會一併的被收回:


為了避免一個使用者授予太多權限造成管理上過於複雜,可以使用 Role 來簡化權限的授予,首先須建立一個 Role,然後將權限授予給這個 Role,最後再將 Role 授予給使用者,例如建立一個具有開發者權限的 Role 並將其授予給 Scott:

SQL> create role apuser;

      (建立名為 apuser 的 role)

SQL> grant create any table to apuser;

      grant create any procedure to apuser;

      grant unlimited tablespace to apuser;

      (授予 apuser 建立物件的權限)

SQL> grant apuser to scott;

      (將 apuser 群組授予給 Scott)


資料庫在建立完成後系統已經有一些預設的Role 存在,例如之前提到的dba 就是一個擁有大部分系統權限的Role,而其中最常使用的就是 connect 與 resource 這個兩 role 了。connect 這個 Role 在早期包含了部分的開發者權限,具有 create session 、 create table 、 create view 、 create synonym 、 create cluster 、 create database link 、 create sequence , alter session 這些權限,connect 顧名思義就是只要連線的意思,賦予它這麼多權限有點不太合適,因此在 Oracle 10gR2 之後便取消了其它權限,connect 只有 create session 這麼一個權限了。resource 就是具有開發者權限的 Role,本身包含了 unlimited tablespace 的權限。這邊值得注意的是,create view 這個權限原先是包含在 connect 裡面的, Oracle 10gR2 移除掉 connect 的其它權限後,並沒有把 create view 添加在 resource 裡面,所以開發者如果需要 create view 的權限,必須要額外再授予。


我們從 dba_roles 可以查詢目前資料庫有多少個 role,不過在 Oracle 12c 以前並沒有辦法從 dba_roles 裡面得知哪些是資料庫預設的哪些是使用者自行建立的,只能透過經驗來判斷哪些是系統預設的 Role;到了 Oracle 12c 之後,dba_roles 添增了 ORACLE_MAINTAINED 欄位,只要查詢 ORACLE_MAINTAINED='Y' 的 Role 就表示為系統預設的了。


由於 Role 是一連串的權限組合而成,將 Role 授予給使用者等於是賦予了一連串的權限,為了增加安全性,可以在建立 Role 的時候加上密碼,避免 Role 被不正常的使用,例如建立一個具有查詢 hr.employees 權限的 Role 並加上密碼為"oracle"的密碼:


在被加上密碼的 Role 在使用時必須要輸入密碼,否則這個 Role 的權限就不會生效:

Role 的相關權限可以從 dba_role_privs 查詢得知。


2020年12月17日 星期四

7.1 資料庫使用者

要連線進入 Oracle 資料庫時,必須要使用一組存在資料庫裏面的帳號與密碼來進行登入的動作,在資料庫建立完成時,只有系統使用者帳號,必須再創立其他使用者帳號給一般用戶或者是應用程式來做使用。預設的系統使用者帳號有 SYS、SYSTEM、SYSMAN與DBSNMP,SYS為資料庫裡面最高權限使用者,相當於 Unix 系統的 root,登入時必須以 sysdba 權限登入;SYSTEM 為次高權限使用者;SYSMAN 為 Enterprise Manager Repository管理者,只有在 11g 版本的資料庫上且有設定 Database Control 時才會有這個帳號,除此之外只有在 Oracle Enterprise Manager (OEM) 的 Repository Database 才會有這個帳號;DBSNMP , OEM 會使用此帳號來登入資料庫,做為監控所用,如果沒有安裝或使用 OEM ,那麼這個帳號在資料庫會是鎖定 (Lock) 的狀態。除了這些系統帳號之外,若是在建立資料庫的時候安裝了各種元件 (Component) ,那麼這些元件分別也有一些預設的使用者帳號如下:


Oracle 元件

相關使用者

Application Express (APEX)

FLOWS_FILES, APEX_開頭的使用者

Oracle Text

CTXSYS

Oracle Workspace Manager

WMSYS

Oracle Spatial 

MDSYS,MDDATA,MDSYS,SPATIAL_CSW_ADMIN_USR,SPATIAL_WFS_ADMIN_USR

Oracle Multimedia

ORDSYS

OLAP

OLAPSYS

Oracle Warehouse Builder

OWBSYS

Expression Filter

EXFSYS

XDB

XDB

Oracle Workspace Manager

WMSYS

Oracle Configuration Manager

ORACLE_OCM


如果透過 dbca建立資料庫的時候選擇 “General Purpose and Transaction Processing” ,預設就會安裝這些元件,而建出來的資料庫預設就會有那麼多的使用者了。因為這些元件有些並不是我們會使用到的功能,因此建議選擇 “Customer Database” ,不要去安裝不必要的元件,這樣也不會有太多的預設使用者,管理起來也比較方便。


要在資料庫建立一個使用者必須要有 create user 的權限,一般都是使用 SYS 來做建立,建立使用者必須要給予帳號名稱與密碼,另外可指定此帳號所使用的 Tablespace 、Profile…等,例如建立一個名為dbusr1且密碼為welcome1的使用者帳號:


SQL> create user dbuser1 identified by welcome1

     default tablespace tbs1

     temporary tablespace temp

     quota 100M on tbs1

     profile dbusr;


default tablespace 可不指定,預設為 users。

temporary tablespace 可不指定,預設為 temp。

quota 可不指定,預設為 0 ,表示使用者不能在這個 tablespace 上建立任何物件。

profile 可不指定,預設為 default。


在使用者創建後是沒有任何權限,最基本必須賦予 create session 的權限,這樣才可以用來登入資料庫。

SQL> grant create session to dbuser1;


若要更改使用者的選項,像是密碼或是 default / temporary tablespace 、profile…等,必須使用 alter user 命令:

SQL> alter user dbuser1 identified by oracle123;

(將使用者密碼改為 oracle123)

SQL> alter user default tablespace tbs2;

      (將使用者的預設 tablespace 改為 tbs2)

SQL> alter user dbuser1 account lock;

SQL> alter user dbuser1 account unlock;

      (將使用者帳號鎖定/解除鎖定)


DBA 可以透過 dba_users 來管理與查詢資料庫的使用者帳號:


對於資料庫來說,接受使用者的登入有三種認證方式,password 、 external 與 global。


  • Password:

以密碼的方式進行認證,建立使用者的時候使用 “identified by <密碼>” 就是使用 password 認證,例如:

SQL> create user scott identified by welcome1;

password 認證的密碼是存放在資料庫 sys.user$ 的表格當中,並以加密過的型態表示:


在早期的資料庫版本可以從 dba_users 裡面的 password 欄位查詢過加密過的密碼,但到了 11g 之後加強了安全性,dba_users 裡面已經查不到密碼了,必須直接查詢 sys.user$,然而 sys.user$ 中的 password 欄位也不是全部的使用者都可以查到密碼,取而代之的是 sys.user$ 中的 spare4 欄位,使用的是較複雜的加密密碼:


透過加密過的密碼仍然可以用來進行設定,使用的是 “identified by values”命令:


不過這種方式顯然存在著安全性的問題,例如可以先竄改某一使用者的密碼再以他的身分進行登入,隨後再用這種方式還原這個使用者的密碼,這樣這個帳號偷偷的被別人登入而使用者自己卻不會察覺,顯然是一個非常大的漏洞,因此官方文件都會建議建立使用者的時候必須輸入明確的密碼,不會特別提這種方式來建立。


  • External:

使用作業系統(OS)認證,只要登入作業系統就可以登入資料庫,登入資料庫不需要再額外提供密碼,例如我們常用的 “sqlplus / as sysdba” 就是一種作業系統認證,”as sysdba” 為資料庫最高權限的使用者,作業系統的使用者必須是 dba 群組(Unix 系統,Windows系統為ora_dba群組) 才可以使用這種方式進行登入,而這個可使用 “as sysdba” 的群組是在安裝 Oracle 資料庫的過程中就會設定:

如果忘記當初安裝時的設定,仍然可以從 $ORACLE_HOME/rdbms/lib 底下的 config.c 檔案中知道設定:


除了最高權限使用者可以進行作業系統認證外,一般的使用者也可以使用OS認證,必須在資料庫中設定 os_authent_prefix 參數,針對透過 OS 認證的帳號設定一個前置字元表示區分,然後使用 “identified by externally” 來建立使用者:


這樣子作業系統的使用者就可以不用輸入密碼,以OS認證的方式登入資料庫:


如果 OS 認證要透過 Listener 登入,必須再設定參數 remote_os_authent 為 TRUE 才可以:


  • Global:

由 LDAP 進行認證,以 “identified globally” 並指定 LDAP 相關資訊來建立使用者,例如:

SQL> create user scott identified globally as 'CN=pscott,OU=division1,O=example,C=US';


雖然 Oracle 提供了三種認證方式,不過最常使用的還是以第一種 password 的認證方式為主。