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 查詢得知。


沒有留言:

張貼留言