天天看點

DB2中的權限

DB2 中有三種主要的安全機制,可以幫助 DBA 實作資料庫安全計劃:身份驗證(authentication)、授權(authorization) 和特權(privilege)。

身份驗證是使用者在嘗試通路 DB2 執行個體或資料庫時遇到的第一種安全特性。DB2 身份驗證與底層作業系統的安全特性緊密協作來檢驗使用者 ID 和密碼。DB2 還可以利用 Kerberos 這樣的安全協定對使用者進行身份驗證。

授權決定使用者和/或使用者組可以執行的操作以及他們可以通路的資料對象。使用者執行進階資料庫和執行個體管理操作的能力由指派給他們的權限決定。在 DB2 中有 5 種不同的權限級别:SYSADM、SYSCTRL、SYSMAINT、DBADM 和 LOAD。

特權的粒度比授權要細,可以配置設定給使用者和/或使用者組。特權定義使用者可以建立或删除的對象。它們還定義使用者可以用來通路對象(比如表、視圖、索引和包)的指令。DB2 9 中新增的一個概念是基于标簽的通路控制(LBAC),它允許以更細的粒度控制誰有權通路單獨的行和/或列。

1.DB2身份驗證

DB2 使用身份驗證類型 決定在什麼地方進行身份驗證。例如,在客戶機 - 伺服器環境中,是客戶機還是伺服器檢驗使用者的 ID 和密碼?在客戶機 - 網關 - 主機環境中,是客戶機還是主機檢驗使用者的 ID 和密碼? 可以在DBM CFG中指定相應的驗證類型:

DB2 GET DBM CFG

Server Connection Authentication          (SRVCON_AUTH) = KERBEROS

Database manager authentication        (AUTHENTICATION) = SERVER_ENCRYPT

那麼在連接配接執行個體時會使用 SERVER_ENCRYPT。但是在連接配接資料庫時會使用 KERBEROS 身份驗證。

在客戶機 - 網關 - 主機環境中,這些身份驗證選項在客戶機和網關上設定,而不是在主機上。

類型 描述
SERVER 身份驗證在伺服器上進行。
SERVER_ENCRYPT 身份驗證在伺服器上進行。密碼在客戶機上進行加密,然後再發送到伺服器。
CLIENT 身份驗證在客戶機上進行.
*KERBEROS 由 Kerberos 安全軟體執行身份驗證。
*KRB_SERVER_ENCRYPT 如果客戶機設定是 KERBEROS,那麼由 Kerberos 安全軟體執行身份驗證。否則使用 SERVER_ENCRYPT。
DATA_ENCRYPT 身份驗證在伺服器上進行。伺服器接受加密的使用者 ID 和密碼,并對資料進行加密。這個選項的操作方式與 SERVER_ENCRYPT 相同,但是資料也要加密。
DATA_ENCRYPT_CMP 身份驗證方式與 DATA_ENCRYPT 相同,但是允許不支援 DATA_ENCRYPT 的老式客戶機使用 SERVER_ENCRYPT 身份驗證進行連接配接。在這種情況下,資料不進行加密。如果進行連接配接的客戶機支援 DATA_ENCRYPT,就會進行資料加密,而不能降級到 SERVER_ENCRYPT 身份驗證。這個身份驗證類型隻在伺服器的資料庫管理程式配置檔案中是有效的,而且在客戶機或網關執行個體上使用 CATALOG DATABASE 時是無效的。
GSSPLUGIN 身份驗證方式由一個外部 GSS-API 插件決定。
GSS_SERVER_ENCRYPT 身份驗證方式由一個外部 GSS-API 插件決定。在客戶機不支援伺服器的 GSS-API 插件之一的情況下,使用 SERVER_ENCRYPT 身份驗證。

2.授權

授權由特權組和進階資料庫管理程式(執行個體級)維護和實用操作組成。在 DB2 可用的 5 種權限中,SYSADM、SYSCTRL 和 SYSMAINT 是執行個體級權限。這意味着它們的範圍包含執行個體級指令以及針對這個執行個體中的所有資料庫的指令。這些權限隻能配置設定給組;可以通過 DBM CFG 檔案配置設定這些權限。

針對特定資料庫的 DBADM 和 LOAD 權限可以配置設定給使用者或使用者組。可以使用 GRANT 指令顯式地配置設定這些權限。

獲得 SYSADM 權限

SYSADM 權限由 DBM CFG 檔案中的 SYSADM_GROUP 參數控制。在 Windows 上,在建立執行個體時,這個參數設定為 Administrator(但是,如果發出指令

db2 get dbm cfg

,它看起來是空的)。在 UNIX 上,它設定為建立這個執行個體的使用者的主組。

因為隻允許 SYSADM 使用者更新 DBM CFG 檔案,是以隻有他們能夠向其他組授予任何 SYS* 權限。以下示例示範如何向 db2grp1 組授予 SYSADM 權限:

db2 update dbm cfg using SYSADM_GROUP db2grp1      

獲得 SYSCTRL 權限

擁有 SYSCTRL 權限的使用者可以在執行個體中執行所有管理和維護指令。但是,與 SYSADM 使用者不同,他們不能通路資料庫中的任何資料,除非他們被授予了通路資料所需的特權。SYSCTRL 使用者可以對執行個體中的任何資料庫執行的指令示例如下:

  • db2start/db2stop

  • db2 create/drop database

  • db2 create/drop tablespace

  • db2 backup/restore/rollforward database

  • db2 runstats

    (針對任何表)
  • db2 update db cfg for database dbname

擁有 SYSADM 權限的使用者可以使用以下指令将 SYSCTRL 配置設定給一個組:

db2 update dbm cfg using SYSCTRL_GROUP group name
                      

獲得 SYSMAINT 權限

擁有 SYSMAINT 權限的使用者可以發出的指令是擁有 SYSCTRL 權限的使用者可以發出的指令的子集。SYSMAINT 使用者隻能執行與維護相關的任務,比如:

  • db2start/db2stop

  • db2 backup/restore/rollforward database

  • db2 runstats

  • db2 update db cfg for database dbname

注意,擁有 SYSMAINT 權限的使用者不能建立或删除資料庫或表空間。他們也不能通路資料庫中的任何資料,除非他們被顯式地授予通路資料所需的特權。

如果您擁有 SYSADM 權限,那麼可以使用以下指令将 SYSMAINT 權限配置設定給一個組:

db2 update dbm cfg using SYSMAINT_GROUP group name
                      

獲得 DBADM 權限

DBADM 權限是一個資料庫級權限,而不是執行個體級權限。DBADM 使用者對一個資料庫有幾乎完全的控制能力。DBADM 使用者不能執行某些維護或管理任務,比如:

  • drop database

  • drop/create tablespace

  • backup/restore database

  • update db cfg for database db name

但是,他們可以執行以下任務:

  • db2 create/drop table

  • db2 grant/revoke

    (任何特權)
  • db2 runstats

    (任何表)

DBADM 使用者還被自動地授予對資料庫對象及其内容的所有特權。因為 DBADM 權限是一個資料庫級權限,是以它可以被配置設定給使用者和使用者組。以下指令示範授予 DBADM 權限的不同方法。

  • db2 create database test

    這個指令将資料庫 test 上的 DBADM 權限隐式地授予發出此指令的使用者。
  • db2 connect to sample db2 grant dbadm on database to user tst1

    這個指令隻能由 SYSADM 使用者發出;它向使用者 tst1 授予示例資料庫上的 DBADM 權限。注意,在授予 DBADM 權限之前,發出這個指令的使用者必須連接配接到示例資料庫。
  • db2 grant dbadm on database to group db2grp1

    這個指令将 DBADM 權限授予 db2grp1 組中的每個使用者。同樣,隻有 SYSADM 使用者能夠發出這個指令。

獲得 LOAD 權限

LOAD 權限是一個資料庫級權限,是以它可以被配置設定給使用者和使用者組。顧名思義,LOAD 權限允許使用者對表發出 LOAD 指令。當用大量資料填充表時,LOAD 指令通常用來替代插入或導入指令,它的速度更快。根據您希望執行的 LOAD 操作類型,僅僅擁有 LOAD 權限可能還不夠。可能還需要表上的特定特權。

擁有 LOAD 權限的使用者可以運作以下指令:

  • db2 quiesce tablespaces for table

  • db2 list tablespaces

  • db2 runstats

  • db2 load insert

    (必須有表上的插入特權)
  • db2 load restart/terminate after load insert

  • db2 load replace

    (必須有表上的插入和删除特權)
  • db2 load restart/terminate after load replace

隻有擁有 SYSADM 或 DBADM 權限的使用者能夠對使用者或使用者組授予或撤消 LOAD 權限。以下示例示範 LOAD 權限如何允許我們的使用者使用

LOAD

指令将資料裝載進 sales 表中。假設已經發出了指令

db2 connect to sample

  • db2 grant load on database to user tst1 db2 grant insert on table sales to user tst1

    有了 LOAD 權限和插入特權,tst1 就可以對 sales 表發出

    LOAD INSERT

    LOAD RESTART

    ,或者在

    LOAD INSERT

    之後發出

    TERMINATE

  • db2 grant load on database to group grp1 db2 grant delete on table sales to group grp1 db2 grant insert on table sales to group grp1

    有了 LOAD 權限以及删除和插入特權,grp1 的任何成員就可以對 sales 表發出

    LOAD REPLACE

    LOAD RESTART

    LOAD REPLACE

    TERMINATE

    。 

3.特權

使用者可以擁有的資料庫級特權有:

  • CREATETAB: 使用者可以在資料庫中建立表。
  • BINDADD: 使用者可以使用 BIND 指令在資料庫中建立包。
  • CONNECT: 使用者可以連接配接資料庫。
  • CREATE_NOT_FENCED: 使用者可以建立 unfenced 使用者定義函數(UDF)。
  • IMPLICIT_SCHEMA: 使用者可以在資料庫中隐式地建立模式,而不需要使用 CREATE SCHEMA 指令。
  • LOAD: 使用者可以将資料裝載進表中。
  • QUIESCE_CONNECT: 使用者可以通路處于靜默(quiesced)狀态的資料庫。
  • CREATE_EXTERNAL_ROUTINE: 使用者可以建立供應用程式和資料庫的其他使用者使用的過程。

資料庫對象 包括表、視圖、索引、模式和包。幸運的是,大多數對象級特權的意義無需解釋。下表總結了這些特權。

特權名稱 相關對象
CONTROL 表、視圖、索引、包、别名、不同的類型、使用者定義函數、序列 提供對對象的全部權限。擁有這種特權的使用者還可以向其他使用者授予或撤消對對象的特權。
DELETE 表、視圖 允許使用者從對象中删除記錄。
INSERT 允許使用者通過 INSERT 或 IMPORT 指令将記錄插入對象中。
SELECT 提供使用選擇語句來檢視對象内容的能力。
UPDATE 允許使用者使用更新語句修改對象中的記錄。
ALTER 允許使用者使用更改語句更改對象定義。
INDEX 允許使用者使用建立索引語句在對象上建立索引。
REFERENCES 提供在對象上建立或删除外鍵限制的能力。
BIND 允許使用者重新綁定現有的包。
EXECUTE 包、過程、函數、方法 允許使用者執行包和例程。
ALTERIN 模式 允許使用者修改模式中的對象定義。
CREATEIN 允許使用者在模式中建立對象。
DROPIN 允許使用者删除模式中的對象。

關于對象級特權的資訊存儲在系統編目視圖中。視圖名稱是

syscat.tabauth

syscat.colauth

syscat.indexauth

syscat.schemaauth

syscat.routineauth

syscat.packageauth

顯式特權

可以使用 GRANT 和 REVOKE 指令顯式地 對使用者或組授予或撤消特權。我們來看看如何在各種對象上使用這些指令。

作為擁有 Administrator 權限的使用者登入 Windows,打開兩個 DB2 指令視窗。在這兩個視窗中,確定将

db2instance

變量設定為

DB2

在第一個視窗中發出以下命»¤:

db2 connect to sample      

現在,在第二個視窗中發出以下指令:

db2 connect to sample user test1 using password
                          

請記住,第一個視窗中的指令是由一個擁有 SYSADM 權限的使用者發出的。第二個視窗中的指令是由 tst1 發出的,這個使用者對示例資料庫沒有特殊的權限或特權。注意,與示例資料庫中的表相關聯的模式名是發出

db2sampl

指令的使用者的名稱。在這些示例中,這個使用者是 GMILNE。

db2 select * from gmilne.org
      

應該會看到以下響應:

SQL0551N  "TEST1" does not have the privilege to perform operation "SELECT" 
on object "GMILNE.ORG".
      

為了糾正這種狀況,在第一個視窗中發出以下指令:

db2 grant select on table gmilne.org to user test1
      

現在,前面的指令就會成功!接下來,在第二個視窗中發出一個更複雜的指令:

db2 insert into gmilne.org values (100, 'Tutorial', 1, 'Eastern', 'Toronto')
      

同樣會看到錯誤消息:

SQL0551N  "TEST1" does not have the privilege to perform operation  "INSERT" 
on object "GMILNE.ORG"
      

是以,在第一個視窗中輸入以下指令:

db2 grant insert on table gmilne.org to group db2grp1
      

原來失敗的 INSERT 指令現在應該會成功完成,因為 test1 是 db2grp1 組的成員。

現在,在第二個視窗中輸入以下指令:

db2 drop table gmilne.emp_photo
      
SQL0551N  "TEST1" does not have the privilege to perform operation "DROP TABLE"
on object "GMILNE.EMP_PHOTO".
      

是以,我們要授予這個特權。在第一個視窗中輸入以下指令:

db2 grant dropin on schema gmilne to all
      

DROP TABLE

指令現在應該會成功完成。

既然已經完成了示例,就可以撤消剛才授予的特權。在第一個視窗中發出以下指令:

db2 revoke select on table gmilne.org from user test1
db2 revoke insert on table gmilne.org from group db2grp1
db2 revoke dropin on schema gmilne from all
      

注意,從組中撤消特權不一定會從這個組的所有成員撤消它。例如,以下指令可以用來從 db2grp1 撤消對 gmilne.org 表的所有特權(CONTROL 除外):

db2 revoke all on table gmilne.org from group db2grp1
      

但是,test1 使用者(他是 db2grp1 的成員)仍然擁有對這個表的選擇特權,因為他或她是被直接授予這個特權的。

隐式特權

當發出某些指令時,DB2 可能會自動地授予特權,而不需要像前面看到的那樣發出顯式的 GRANT 語句。下表總結了會導緻資料庫管理程式隐式地授予特權的一些指令。注意,當删除建立的對象時,這些特性會隐式地撤消。但是,當顯式地撤消更進階的特權時,不會撤消它們。

發出的指令 授予的特權 被授予特權的使用者

CREATE TABLE mytable

mytable 上的 CONTROL 發出指令的使用者

CREATE SCHEMA myschema

myschema 上的 CREATEIN、ALTERIN 和 DROPIN,以及将這些特權授予其他使用者的能力

CREATE VIEW myview

myview 上的 CONTROL(隻有在使用者擁有 myview 定義中引用的所有表和視圖上的 CONTROL 特權的情況下)

CREATE DATABASE mydb

mydb 的系統編目表上的 SELECT,mydb 上的 IMPLICIT_SCHEMA * PUBLIC**

*當使用者建立資料庫時,隐式地授予這個使用者這個資料庫上的 DBADM 權限。獲得 DBADM 權限就會隐式地授予 CONNECT、CREATETAB、BINDADD、IMPLICIT_SCHEMA 和 CREATE_NOT_FENCED 特權。即使撤消了 DBADM 權限,這個使用者仍然會保留這些特權。

**PUBLIC 是一個特殊的 DB2 組,其中包括特定資料庫的所有使用者。與前面讨論過的其他組不同,PUBLIC 不必在作業系統級進行定義。在預設情況下,會向 PUBLIC 授予一些特權。例如,這個組自動接受資料庫上的 CONNECT 特權和編目表上的 SELECT 特權。可以對 PUBLIC 組發出 GRANT 和 REVOKE 指令,比如:

db2 grant select on table sysibm.systables to public
db2 revoke select on table sysibm.systables from public
			      

間接特權

當資料庫管理器執行包 時,可以間接獲得特權。包中包含一個或多個 SQL 語句,這些語句已經轉換為 DB2 用來在内部執行它們的格式。換句話說,包中包含可執行格式的多個 SQL 語句。如果包中的所有語句都是靜态的,那麼使用者隻需要有包上的 EXECUTE 特權,就能夠成功地執行包中的語句。

例如,假設 db2package1 執行以下靜态的 SQL 語句:

db2 select * from org
db2 insert into test values (1, 2, 3)
			      

在這種情況下,擁有 db2package1 上的 EXECUTE 特權的使用者會間接地獲得 org 表上的 SELECT 特權和 test 表上的 INSERT 特權。

繼續閱讀