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 的認證方式為主。






沒有留言:

張貼留言