程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> DB2數據庫 >> DB2教程 >> DB2 9 基礎(730 考試)認證指南,第 2 部分: 安全性

DB2 9 基礎(730 考試)認證指南,第 2 部分: 安全性

編輯:DB2教程

DB2 安全

數據庫安全涉及的問題

數據庫安全是當今最重要的問題。您的數據庫可能允許顧客通過互聯網購買產品,它也可能包含用來預測業務趨勢的歷史數據;無論是哪種情況,公司都需要可靠的數據庫安全計劃。

數據庫安全計劃應該定義:

允許誰訪問實例和/或數據庫

在哪裡以及如何檢驗用戶的密碼

用戶被授予的權限級別

允許用戶運行的命令

允許用戶讀取和/或修改的數據

允許用戶創建、修改和/或刪除的數據庫對象

DB2 安全機制

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

身份驗證是用戶在嘗試訪問 DB2 實例或數據庫時遇到的第一種安全特性。DB2 身份驗證與底層操作系統的安全特性緊密協作來檢驗用戶 ID 和密碼。DB2 還可以利用 Kerberos 這樣的安全協議對用戶進行身份驗證。

授權決定用戶和/或用戶組可以執行的操作以及他們可以訪問的數據對象。用戶執行高級數據庫和實例管理操作的能力由指派給他們的權限決定。在 DB2 中有 5 種不同的權限級別:SYSADM、SYSCTRL、SYSMAINT、DBADM 和 LOAD。

特權的粒度比授權要細,可以分配給用戶和/或用戶組。特權定義用戶可以創建或刪除的對象。它們還定義用戶可以用來訪問對象(比如表、視圖、索引和包)的命令。DB2 9 中新增的一個概念是基於標簽的訪問控制(LBAC),它允許以更細的粒度控制誰有權訪問單獨的行和/或列。

要為本教程的下一節做好准備,需要在 DB2 實例中創建一個數據庫。確保 %DB2INSTANCE% 變量仍然設置為 DB2,然後使用命令 db2sampl drive 創建示例數據庫,這裡的 drive 是希望創建示例數據庫的驅動器的名稱。對於本教程中的示例,將在 D: 驅動器上創建示例數據庫:

D:SQLLIBBIN> db2sampl d:

客戶機、服務器、網關和主機

在考慮整個數據庫環境的安全性時,理解術語客戶機、服務器、網關 和主機 是相當重要的。數據庫環境常常由幾台不同的機器組成;必須在所有潛在的數據訪問點上保護數據庫。在處理 DB2 身份驗證時客戶機、服務器、網關和主機的概念尤其重要。

下圖說明了基本的客戶機 - 服務器 - 主機配置。

DB2 9 基礎(730 考試)認證指南,第 2 部分: 安全性

數據庫服務器 是數據庫實際所在的機器(在分區的數據庫系統上可能是多台機器)。DB2 數據庫客戶機 是對服務器上的數據庫執行查詢的機器。這些客戶機可以是本地的(駐留在與數據庫服務器相同的物理機器上),也可以是遠程的(駐留在單獨的機器上)。

如果數據庫駐留在運行 AS/400(iSeries)或 OS/390(zSerIEs)的大型機上,它就稱為主機 或主機服務器。網關 是一台運行 DB2 Connect 產品的機器。DB2 客戶機可以通過網關連接駐留在主機上的 DB2 數據庫。網關也稱為 DB2 Connect 服務器。安裝了 Enterprise Server Edition 產品的系統也內置了 DB2 Connect 功能。

DB2 身份驗證

什麼時候進行 DB2 身份驗證

DB2 身份驗證控制數據庫安全計劃的以下方面:

誰有權訪問實例和/或數據庫

在哪裡以及如何檢驗用戶的密碼

在發出 attach 或 connect 命令時,它在底層操作系統安全特性的幫助下完成這個任務。attach 命令用來連接 DB2 實例,connect 命令用來連接 DB2 實例中的數據庫。下面的示例展示了 DB2 對發出這些命令的用戶進行身份驗證的不同方式。這些示例在數據庫管理程序配置文件中使用默認的身份驗證類型 SERVER。下面的例 3 說明了如何使用 DB2 修改服務器操作系統上的密碼。

用創建 DB2 實例時使用的用戶 ID 登錄到安裝 DB2 的機器上。發出以下命令:

db2 attach to DB2

在這裡,隱式地執行身份驗證。使用登錄機器的用戶 ID,並假設這個 ID 已經經過了操作系統的檢驗。

db2 connect to sample user test1 using passWord
Database Connection Information
Database server    = DB2/NT 9.1.0
SQL authorization ID  = TEST1
Local database alias  = SAMPLE 

在這裡,顯式地執行身份驗證。用戶 test1 和密碼 passWord 由操作系統進行檢驗。用戶 test1 成功地連接到示例數據庫。

db2 connect to sample user test1 using passWord new chgpass confirm chgpass

與例 2 中一樣,用戶 ID test1 和密碼 password 由操作系統進行檢驗。然後,操作系統將 test1 的密碼從 passWord 改為 chgpass。因此,如果再次發出例 2 中的命令,它就會失敗。

DB2 身份驗證類型

DB2 使用身份驗證類型 決定在什麼地方進行身份驗證。例如,在客戶機 - 服務器環境中,是客戶機還是服務器檢驗用戶的 ID 和密碼?在客戶機 - 網關 - 主機環境中,是客戶機還是主機檢驗用戶的 ID 和密碼?

DB2 9 能夠根據用戶是試圖連接數據庫,還是執行實例連接和實例級操作,指定不同的身份驗證機制。在默認情況下,實例對於所有實例級和連接級請求使用一種身份驗證類型。這由數據庫管理程序配置參數 AUTHENTICATION 來指定。V9.1 中引入了數據庫管理程序配置參數 SRVCON_AUTH。這個參數專門處理對數據庫的連接。例如,如果在 DBM CFG 中進行以下設置:

DB2 GET DBM CFG
Server Connection Authentication     (SRVCON_AUTH) = KERBEROS
Database manager authentication    (AUTHENTICATION) = SERVER_ENCRYPT

那麼在連接實例時會使用 SERVER_ENCRYPT。但是在連接數據庫時會使用 KERBEROS 身份驗證。如果在服務器上沒有正確地初始化 KERBEROS,但是提供了有效的用戶 ID/密碼,那麼允許這個用戶連接實例,但是不允許他連接數據庫。

下表總結了可用的 DB2 身份驗證類型。在客戶機 - 網關 - 主機環境中,這些身份驗證選項在客戶機和網關上設置,而不是在主機上。本節將詳細討論如何設置這些選項。請回顧 客戶機、服務器、網關和主機 小節。

類型 描述 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 身份驗證。

*這些設置只對 Windows 2000、AIX、Solaris 和 Linux® 操作系統有效。

在服務器上設置身份驗證

在數據庫服務器上,在數據庫管理程序配置(DBM CFG)文件中使用 AUTHENTICATION 參數設置身份驗證。請記住,DBM CFG 文件是一個實例級配置文件。因此,AUTHENTICATION 參數影響這個實例中的所有數據庫。以下命令演示如何修改這個參數。

要查看配置文件中的身份驗證參數:db2 get dbm cfg

要將身份驗證參數修改為 server_encrypt:C:PROGRA~1SQLLIBBIN> db2 update dbm cfg using authentication server_encrypt
C:PROGRA~1SQLLIBBIN> db2stop
C:PROGRA~1SQLLIBBIN> db2start

某些身份驗證類型(比如 GSSPLUGIN、KERBEROS 和 CLIENT)要求設置其他數據庫管理程序配置參數,比如 TRUST_ALLCLNTS、SRV_PLUGIN_MODE 和 SRVCON_PW_PLUGIN。關於這些設置的更多細節見下文。

在網關上設置身份驗證

使用 catalog database 命令在網關上設置身份驗證。在這裡的示例中,我們將使用名為 myhostdb 的主機數據庫。

要將網關身份驗證類型設置為 SERVER,應該在網關機器上發出以下命令:

db2 catalog database myhostdb at node nd1 authentication SERVER
db2 terminate

注意,身份驗證不會在網關本身執行。在 DB2 Version 8 中,身份驗證必須在客戶機或主機數據庫服務器上執行。

在客戶機上設置身份驗證

我們來考慮兩台單獨的客戶機上的兩種情況。我們將一個客戶機配置為連接服務器機器上的數據庫(DB2 UDB LUW 分布式平台),另一個客戶機連接主機上的數據庫(例如 DB2 for zSerIEs)。

連接服務器數據庫的客戶機:在針對要連接的數據庫的數據庫目錄項中,客戶機身份驗證設置必須匹配數據庫服務器上的設置(但是 KRB_SERVER_ENCRYPT、DATA_ENCRYPT_CMP 和 GSS_SERVER_ENCRYPT 例外)。

我們假設服務器身份驗證類型設置為 SERVER。在客戶機上發出以下命令對名為 sample 的服務器數據庫進行編目:db2 catalog database sample at node nd1 authentication SERVER

如果沒有指定身份驗證類型,客戶機將默認使用 SERVER_ENCRYPT。

連接主機數據庫的客戶機:我們假設網關上的身份驗證類型設置為 SERVER。如果沒有指定身份驗證類型,那麼在通過 DB2 Connect 訪問數據庫時假設采用 SERVER_ENCRYPT 身份驗證。身份驗證在主機數據庫服務器上進行。從客戶機發出以下命令會導致客戶機向網關發送未加密的用戶 ID 和密碼:db2 catalog database myhostdb at node nd1 authentication SERVER

現在假設網關上的身份驗證類型設置為 SERVER_ENCRYPT。身份驗證同樣在主機數據庫服務器上進行。用戶 ID 和密碼在客戶機上進行加密,然後再發送到網關,並在網關上進行加密,然後再發送到主機。這是默認的做法。

處理不可信的客戶機

如果服務器或網關將身份驗證類型設置為 CLIENT,那麼這意味著期望客戶機對用戶的 ID 和密碼進行身份驗證。但是,一些客戶機的操作系統沒有本機安全特性。這種不可信的 客戶機包括在 Windows 98 和 Windows ME 上運行的 DB2。DB2 V9.1 不支持 Windows 98 或 Windows ME,但是它支持低版本的客戶機,所以仍然可能必須處理不可信的 V8 客戶機。

在 DBM CFG 文件中有兩個額外參數,用於在服務器或網關身份驗證方法設置為 CLIENT,而不可信的客戶機試圖連接數據庫或 DB2 實例時,決定應該在哪裡進行身份驗證。這些參數是 TRUST_ALLCLNTS 和 TRUST_CLNTAUTH 參數。

當服務器或網關身份驗證類型為 CLIENT 時,除了 TRUST_ALLCLNTS 和 TRUST_CLNTAUTH 參數之外,還有兩個因素會起作用。第一個因素是用戶 ID 和密碼是否是顯式提供的,第二個因素是進行連接的客戶機的類型。有三種 DB2 客戶機:

不可信的客戶機:如上所述

主機客戶機:運行在 zSerIEs 這樣的主機操作系統上的客戶機

可信客戶機:運行在具有本機安全特性的非主機操作系統(比如 Windows NT、2000、2003、XP 以及所有形式的 Unix / Linux)上的客戶機

當身份驗證設置為 CLIENT 時

下表總結了如果服務器的身份驗證類型設置為 CLIENT,那麼在每種類型的客戶機向服務器發出連接命令時將在哪裡進行身份驗證。

是否提供了 ID/密碼? TRUST_ALLCLNTS TRUST_CLNTAUTH 不可信的客戶機 可信的客戶機 主機客戶機 No Yes CLIENT CLIENT CLIENT CLIENT No Yes SERVER CLIENT CLIENT CLIENT No No CLIENT SERVER CLIENT CLIENT No No SERVER SERVER CLIENT CLIENT No DRDAONLY CLIENT SERVER SERVER CLIENT No DRDAONLY SERVER SERVER SERVER CLIENT Yes Yes CLIENT CLIENT CLIENT CLIENT Yes Yes SERVER SERVER SERVER SERVER Yes No CLIENT SERVER CLIENT CLIENT Yes No SERVER SERVER SERVER SERVER Yes DRDAONLY CLIENT SERVER SERVER CLIENT Yes DRDAONLY SERVER SERVER SERVER SERVER

DRDAONLY 意味著只信任主機客戶機,而不管使用 DRDA 進行連接的 DB2 Version 8 客戶機。

下面的示例說明如何在服務器和客戶機上設置身份驗證類型和參數:

在服務器上設置身份驗證:

db2 update dbm cfg using authentication clIEnt
db2 update dbm cfg using trust_allclnts yes
db2 update dbm cfg using trust_clntauth server
db2stop
db2start

在客戶機上設置身份驗證:

db2 catalog database sample at node nd1 authentication clIEnt

在上面的示例中,如果從任何客戶機發出命令db2 connect to sample

那麼身份驗證在客戶機上進行。如果從任何客戶機發出命令db2 connect to sample user test1 using passWord

那麼身份驗證在服務器上進行。

DB2 的安全插件架構

DB2 V8.2 引入了安全插件的概念。這個概念在 DB2 V9.1 中得到了進一步增強。通過使用標准的 GSS-API 調用,用戶可以編寫一個安全插件並將對用戶 ID 進行身份驗證的工作交給一個外部安全程序。這種方式的一個示例是 DB2 本身的 KERBEROS 身份驗證。在一台機器上安裝 DB2 ESE 或應用程序開發客戶機時,安裝過程中將有一些示例應用程序代碼放入實例目錄,如果查看 samplessecurityplugins 目錄,就會看到如何編寫安全插件的示例。本節將概述如何在 DB2 安全架構中使用插件,但是不討論如何編寫或編譯插件本身。

Kerberos 身份驗證

Kerberos 身份驗證為 DB2 提供了一種無需通過網絡發送用戶 ID 和密碼的用戶身份驗證方法。Kerberos 安全協議作為第三方身份驗證服務執行身份驗證,它使用傳統的密碼術創建一個共享的密鑰。這個密鑰成為用戶的憑證,在請求本地或網絡服務時在所有情況下都使用它檢驗用戶的身份。通過使用 Kerberos 安全協議,可以實現對遠程 DB2 數據庫服務器的單點登錄。

首先,討論如何設置 DB2 來使用 Kerberos 身份驗證。如上所述,Kerberos 身份驗證在 DB2 中是使用插件架構實現的。默認的 kerberos 插件的源代碼在 samples/security/plugins 目錄中,稱為 IBMkrb5.c。在 DB2 中使用 Kerberos 之前,必須在客戶機和服務器上啟用和支持 Kerberos。為此,必須滿足以下條件:

客戶機和服務器必須屬於同一個域(用 Windows 術語來說,是可信域)。

必須設置適當的主體(Kerberos 中的用戶 ID)。

必須創建服務器的 keytab 文件,實例所有者必須能夠讀這個文件。

所有機器必須有同步的時鐘。

可以在 Kerberos 產品附帶的文檔中找到關於設置 Kerberos 的更多信息。

為了在 DB2 中啟用 Kerberos 身份驗證,必須先告訴客戶機在哪裡尋找將使用的 Kerberos 插件。在客戶機上,運行以下命令:

DB2 UPDATE DBM CFG USING CLNT_KRB_PLUGIN IBMkrb5
DB2 TERMINATE

在這個示例中,使用默認的 KERBEROS 插件。如果使用的 Kerberos 實現需要特殊功能的話,DBA 可以修改這個插件來執行特殊功能。

還可以告訴客戶機它正在針對哪個服務器主體進行身份驗證。這個選項可以避免 Kerberos 身份驗證的第一步,即客戶機尋找它要連接的實例的服務器主體。在客戶機上對數據庫進行編目時可以指定 AUTHENTICATION 參數。它的格式是:DB2 CATALOG DB dbname AT NODE node name AUTHENTICATION KERBEROS TARGET PRINCIPAL
  service/host@REALM

這一步是可選的。

DB2 CATALOG DB sample AT NODE testnd AUTHENTICATION KERBEROS TARGET PRINCIPAL
  gmilne/[email protected]

設置 Kerberos 身份驗證的下一步是設置服務器。srvcon_gssplugin_list 參數可以設置為支持的 GSS-API 插件的列表,但是只允許有一個 Kerberos 插件。如果這個列表中沒有 Kerberos 插件,那麼自動地使用默認的 IBMkrb5 插件。如果希望允許所有身份驗證(實例連接和數據庫連接)使用 Kerberos,那麼執行以下命令:

DB2 UPDATE DBM CFG USING AUTHENTICATION KERBEROS
or
DB2 UPDATE DBM CFG USING AUTHENTICATION KRB_SERVER_ENCRYPT

如果只希望 DB2 使用 Kerberos 對數據庫連接進行身份驗證(對實例連接使用 SERVER),那麼執行以下命令:

DB2 UPDATE DBM CFG USING SVRCON_AUTH KERBEROS
or
DB2 UPDATE DBM CFG USING SVRCON_AUTH KRB_SERVER_ENCRYPT

根據實例的位長度(32 或 64 位),DB2 將在實例啟動時自動地裝載 IBMkrb5 插件。

其他身份驗證設置

如果查看 V9.1 實例中的 DBM CFG,會看到影響 DB2 對用戶 ID 進行身份驗證的方式的各種設置。正如前面提到的,有針對標准操作系統用戶 ID 身份驗證的設置(CLIENT、SERVER、SERVER_ENCRYPT、DATA_ENCRYPT、DATA_ENCRYPT_CMP),還有將身份驗證工作交給外部程序的插件(KERBEROS、KRB_SERVER_ENCRYPT、GSSPLUGIN、GSS_SERVER_ENCRYPT)。本節專門介紹其他一些配置變量如何影響對用戶的身份驗證。

ClIEnt Userid-PassWord Plugin     (CLNT_PW_PLUGIN) =
Group Plugin               (GROUP_PLUGIN) =
GSS Plugin for Local Authorization  (LOCAL_GSSPLUGIN) =
Server Plugin Mode          (SRV_PLUGIN_MODE) = UNFENCED
Server List of GSS Plugins   (SRVCON_GSSPLUGIN_LIST) =
Server Userid-PassWord Plugin    (SRVCON_PW_PLUGIN) =
Cataloging allowed without authority  (CATALOG_NOAUTH) = NO
Bypass federated authentication      (FED_NOAUTH) = NO

在上面的列表中,去掉了已經討論過的參數。

CLNT_PW_PLUGIN 這個參數在客戶端的 DBM CFG 中指定。它指定用來進行客戶機和本地身份驗證的客戶機插件的名稱。 GROUP_PLUGIN 默認值是空(NULL)。將它設置為用戶定義的插件就會調用這個插件進行所有組枚舉,而不依賴於操作系統的組查找。這與後面討論的授權部分相關。 LOCAL_GSSPLUGIN 這個參數指定默認的 GSS-API 插件庫的名稱,當數據庫管理程序配置的身份驗證參數值設置為 GSSPLUGIN 或 GSS_SERVER_ENCRYPT 時,這個庫用來進行實例級的本地授權。 SRV_PLUGIN_MODE (YES/NO)這個參數的默認設置是 NO。當改為 YES 時,以 FENCED 模式啟動 GSS-API 插件,其工作方式類似於 FENCED 存儲過程。FENCED 插件的崩潰不會導致 DB2 實例崩潰。在插件還處於開發階段時,建議以 fenced 模式運行它們,這樣的話插件中的邏輯問題和內存洩漏就不會導致實例崩潰。在確定插件是可靠的之後,應該以 unfenced 模式運行以提高性能。 SRVCON_GSSPLUGIN_LIST 一個插件列表,當使用 KERBEROS、KRB_SERVER_ENCRYPT、GSSPLUGIN 或 GSS_SERVER_ENCRYPT 時,服務器上的數據庫管理程序在身份驗證期間將使用這些插件。列表中的每個插件應該用逗號(‘,’)分隔,它們之間沒有空格。插件按照優先次序列出,首先使用列表中的第一個插件對發送的用戶 ID/密碼進行身份驗證。只有當列出的所有插件都返回了錯誤時,DB2 才會向用戶返回身份驗證錯誤。 SRVCON_PW_PLUGIN 在指定 CLIENT、SERVER 或 SERVER_ENCRYPT 身份驗證時,這個參數允許用戶修改 DB2 用來檢驗用戶 ID 和密碼的默認身份驗證方法。在默認情況下,它的值是 NULL,因此使用默認的 DB2 方法。 CATALOG_NOAUTH (YES/NO)默認值是 NO。將這個參數修改為 YES 就允許不屬於 SYSADM、SYSCTRL 或 SYSMAINT 組成員的用戶修改機器上的 Database、Node、Admin 和 DCS 編目。如果登錄的用戶使用不可信客戶機(定義見上文),或者登錄所用的用戶 ID 不允許連接數據庫或實例,但是用戶又必須在客戶機上進行編目,只有在這種情況下這個參數才是有用的。 FED_NOAUTH 如果 fed_noauth 設置為 yes,身份驗證設置為 server 或 server_encrypt,聯邦設置為 yes,那麼在實例上避免進行身份驗證。它假設身份驗證在數據源上進行。當 fed_noauth 設置為 yes 時系統會發出警告。在客戶機和 DB2 服務器上都不進行身份驗證。知道 SYSADM 身份驗證名稱的任何用戶都擁有聯邦服務器的 SYSADM 權限。

DB2 授權

授權簡介

DB2 授權控制數據庫安全計劃的以下方面:

用戶被授予的權限級別

允許用戶運行的命令

允許用戶讀取和/或修改的數據

允許用戶創建、修改和/或刪除的數據庫對象

授權由特權組和高級數據庫管理程序(實例級)維護和實用操作組成。在 DB2 可用的 5 種權限中,SYSADM、SYSCTRL 和 SYSMAINT 是實例級權限。這意味著它們的范圍包含實例級命令以及針對這個實例中的所有數據庫的命令。這些權限只能分配給組;可以通過 DBM CFG 文件分配這些權限。

針對特定數據庫的 DBADM 和 LOAD 權限可以分配給用戶或用戶組。可以使用 GRANT 命令顯式地分配這些權限。

以下幾節描述如何分配每種權限以及允許擁有此權限的用戶執行哪些命令。注意,任何提到組成員關系的地方都假設在操作系統級上已經定義了這些用戶和組名。

用戶可以通過發出以下命令來判斷自己擁有哪些權限和數據庫級特權:

db2 get authorizations

獲得 SYSADM 權限

DB2 中的 SYSADM 權限就像是 UNIX 上的根權限或 Windows 上的 Administrator 權限。對一個 DB2 實例擁有 SYSADM 權限的用戶能夠對這個實例、這個實例中的任何數據庫以及這些數據庫中的任何對象發出任何 DB2 命令。他們還能夠訪問數據庫中的數據以及對其他用戶授予或撤消特權或權限。只允許 SYSADM 用戶更新 DBM CFG 文件。

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

請記住,這一修改直到實例停止並重新啟動之後才會生效。還要記住,如果您當前不是作為 db2grp1 組的成員登錄的,那麼就無權重新啟動實例!您必須注銷並用正確的組中的 ID 重新登錄,或者將自己當前的 ID 添加進 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。

DB2 特權

數據庫和對象特權

在前一節中,簡要地提到了特權的概念。特權大體上分成兩類:數據庫級特權(針對數據庫中的所有對象)和對象級特權(與特定的對象相關聯)。

用戶可以擁有的數據庫級特權有:

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 特權。

基於標簽的訪問控制

DB2 9 中新增的一個概念是基於標簽的訪問控制(LBAC)。LBAC 為 DBA 提供了在表的行或列級限制讀/寫特權的能力。

在以前,進行這種限制的惟一方法是創建一個視圖,授權用戶使用這個視圖,並撤消對基表的訪問權。

本教程只演示 LBAC 安全場景的一個示例。關於 LBAC 的更詳細解釋,請參考 developerWorks 上的 DB2 Label-Based Access Control, a practical guide, Part 1: Understand the basics of LBAC in DB2。

LBAC 由安全管理員 通過創建安全策略來設置。每個表只能由一個安全策略來控制,但是系統中可以有任意數量的安全策略。設置 LBAC 需要幾個步驟。必須做的第一件事情是,決定對於您的數據需要什麼類型的訪問控制。

我們做出以下假設。在您的組織中有三類人。

名稱 在組織中的角色 Jane 人力資源執行官 Joe D11 和 E21 部門的經理 Frank 團隊主管 - A00 部門

現在,在組織的數據庫中有一個定義職員信息的表。這個表類似於 SAMPLE 數據庫中的 EMP 表。它包含關於職員和他們所屬的部門的數據。它現在的定義如下:

        db2 => describe select * from emp
SQLDA Information
sqldaid : SQLDA   sqldabc: 896 sqln: 20 sqld: 14
Column Information
sqltype        sqllen sqlname.data          sqlname.length
-------------------- ------ ------------------------------ --------------
452  CHARACTER      6 EMPNO                    5
448  VARCHAR       12 FIRSTNME                   8
453  CHARACTER      1 MIDINIT                   7
448  VARCHAR       15 LASTNAME                   8
453  CHARACTER      3 WORKDEPT                   8
453  CHARACTER      4 PHONENO                   7
385  DATE        10 HIREDATE                   8
453  CHARACTER      8 JOB                     3
500  SMALLINT       2 EDLEVEL                   7
453  CHARACTER      1 SEX                     3
385  DATE        10 BIRTHDATE                  9
485  DECIMAL      9, 2 SALARY                    6
485  DECIMAL      9, 2 BONUS                    5
485  DECIMAL      9, 2 COMM                     4

組織會定期對規則進行審計。審計指出,職員不應該能夠訪問機密的數據。規則規定,執行官對所有職員記錄有完全的讀/寫訪問權,經理對自己部門的職員記錄有讀/寫訪問權,而團隊主管只能讀取部門中他們領導的職員的記錄。

我們要設置 LBAC 安全策略來實現這些規則。

定義安全策略和標簽,並將安全標簽授予用戶

在 EMP 表中添加安全標簽列並將安全策略連接到它

定義安全策略和標簽

為了定義安全策略和標簽,需要 SECADM 權限。

步驟 1a. 創建安全標簽組件

首先,需要決定對於這個策略最合適的安全組件類型。在這個示例中,最合適的策略類型是 “TREE”。Tree 策略意味著可以定義一組標簽,讓子組件擁有它們的父組件的權限的子集。在這個示例中,創建一個名為 “J_DEPT” 的安全組件。

      CREATE SECURITY LABEL COMPONENT J_DEPT
    TREE ('HR_EXECUTIVE' ROOT,
       'MAN_D11_E21' UNDER 'HR_EXECUTIVE'
       'A00' UNDER 'HR_EXECUTIVE',
       'B01' UNDER 'HR_EXECUTIVE',
       'C01' UNDER 'HR_EXECUTIVE',
       'D11' UNDER 'MAN_D11_E21',
       'D21' UNDER 'HR_EXECUTIVE',
       'E01' UNDER 'HR_EXECUTIVE',
       'E11' UNDER 'HR_EXECUTIVE',
       'E21' UNDER 'MAN_D11_E21'
    )

上面的布局說明根是 HR_EXECUTIVE,這個執行官領導的所有部門都是它的子組件。

步驟 1b. 定義安全策略

在上面的示例中,設置 LBAC 所需的下一個步驟是定義與上面的安全標簽組件相關聯的策略。一個安全策略可以使用多個組件。

     CREATE SECURITY POLICY J_DEPT_POLICY
       COMPONENTS J_DEPT
       WITH DB2LBACRULES
       RESTRICT NOT AUTHORIZED WRITE SECURITY LABEL

步驟 1c. 創建安全標簽

設置安全策略的第三步是創建安全標簽。在這裡將指定每個用戶具有的不同角色。因為這個示例非常簡單,只有三個標簽,Executive、Manager 和 Team Lead。

   CREATE SECURITY LABEL J_DEPT_POLICY.EXECUTIVE
       COMPONENT J_DEPT 'HR_EXECUTIVE'
      
   CREATE SECURITY LABEL J_DEPT_POLICY.MANAGE_D11_E21
       COMPONENT J_DEPT 'MAN_D11_E21'
      
   CREATE SECURITY LABEL J_DEPT_POLICY.A00
       COMPONENT J_DEPT 'A00'
      
   CREATE SECURITY LABEL J_DEPT_POLICY.B01
       COMPONENT J_DEPT 'B01'
      
   CREATE SECURITY LABEL J_DEPT_POLICY.C01
       COMPONENT J_DEPT 'C01'
   CREATE SECURITY LABEL J_DEPT_POLICY.D11
       COMPONENT J_DEPT 'D11'
   CREATE SECURITY LABEL J_DEPT_POLICY.D21
       COMPONENT J_DEPT 'D21'
   CREATE SECURITY LABEL J_DEPT_POLICY.E01
       COMPONENT J_DEPT 'E01'
   CREATE SECURITY LABEL J_DEPT_POLICY.E11
       COMPONENT J_DEPT 'E11'
   CREATE SECURITY LABEL J_DEPT_POLICY.E21
       COMPONENT J_DEPT 'E21'      

在下一步中,將定義與這些標簽相關聯的實際權限。

步驟 1d. 根據標簽授予權限

下面的步驟描述對表數據授予權限的過程。權限可以是 ALL ACCESS、WRITE ACCESS 或 READ Access。如果這些權限都沒有授予一個用戶,那麼這個用戶就不能訪問任何表數據。請記住,執行官有完全的訪問權,經理對自己的部門有完全的訪問權,而團隊主管對他們領導的部門成員有讀訪問權。

db2 grant security label J_DEPT_POLICY.A00 to user Frank for read Access
db2 grant security label J_DEPT_POLICY.MANAGE_D11_E21 to user Joe for all Access
db2 grant security label J_DEPT_POLICY.EXECUTIVE to user Jane for all Access

在用戶上設置以上標簽,就會根據步驟 1a 中的樹定義來分配權限。因為用戶 Joe 被標為 MANAGE_D11_E21 並獲得所有權限,他將能夠讀寫那些安全標記為 J_DEPT_POLICY.D11 或 J_DEPT_POLICY.E21 的行(因為它們是他的子組件)。

步驟 2. 修改 EMP 表

在修改 EMP 表時,必須創建一個額外的列來存儲安全標簽。這個列的類型是 “DB2SECURITYLABEL”。您可以修改 SAMPLE 數據庫中現有的 EMP 表。為此,必須使用在這個策略中被授予根級特權的用戶,在這個示例中就是用戶 Jane。還必須先從 SAMPLE 數據庫刪除 MQT 表 ADEFUSR。

CONNECT TO SAMPLE
  Database Connection Information
Database server    = DB2/NT 9.1.0
SQL authorization ID  = GMILNE
Local database alias  = SAMPLE 
DROP TABLE ADEFUSR
CONNECT RESET
CONNECT TO SAMPLE USER Jane USING passWord
ALTER TABLE EMP
    ADD COLUMN DEPT_TAG DB2SECURITYLABEL
    ADD SECURITY POLICY J_DEPT_POLICY

如果從 EMP 表進行選擇,就會看到剛定義的新列。因為是用在 EXECUTIVE 級上定義的用戶執行這一修改,添加的所有安全標記都是 EXECUTIVE。為了改變這一情況,需要更新這個表。

db2 => select EMPNO, FIRSTNME, LASTNAME, WORKDEPT, SALARY,
varchar(SECLABEL_TO_CHAR('J_DEPT_POLICY',DEPT_TAG),30) from gmilne.emp
EMPNO FIRSTNME   LASTNAME    WORKDEPT SALARY   6
------ ------------ --------------- -------- ----------- ------------------------------
000010 CHRISTINE  HAAS      A00    152750.00 HR_EXECUTIVE
000020 MICHAEL   THOMPSON    B01     94250.00 HR_EXECUTIVE
000030 SALLY    KWAN      C01     98250.00 HR_EXECUTIVE
000050 JOHN     GEYER      E01     80175.00 HR_EXECUTIVE
000060 IRVING    STERN      D11     72250.00 HR_EXECUTIVE
000070 EVA     PULASKI     D21     96170.00 HR_EXECUTIVE
000090 EILEEN    HENDERSON    E11     89750.00 HR_EXECUTIVE
000100 THEODORE   SPENSER     E21     86150.00 HR_EXECUTIVE
000110 VINCENZO   LUCCHESSI    A00     66500.00 HR_EXECUTIVE
000120 SEAN     O'CONNELL    A00     49250.00 HR_EXECUTIVE
000130 DELORES   QUINTANA    C01     73800.00 HR_EXECUTIVE
000140 HEATHER   NICHOLLS    C01     68420.00 HR_EXECUTIVE
000150 BRUCE    ADAMSON     D11     55280.00 HR_EXECUTIVE
000160 ELIZABETH  PIANKA     D11     62250.00 HR_EXECUTIVE
000170 MASATOSHI  YOSHIMURA    D11     44680.00 HR_EXECUTIVE
000180 MARILYN   SCOUTTEN    D11     51340.00 HR_EXECUTIVE
000190 JAMES    WALKER     D11     50450.00 HR_EXECUTIVE
000200 DAVID    BROWN      D11     57740.00 HR_EXECUTIVE
000210 WILLIAM   JONES      D11     68270.00 HR_EXECUTIVE
000220 JENNIFER   LUTZ      D11     49840.00 HR_EXECUTIVE
000230 JAMES    JEFFERSON    D21     42180.00 HR_EXECUTIVE
000240 SALVATORE  MARINO     D21     48760.00 HR_EXECUTIVE
000250 DANIEL    SMITH      D21     49180.00 HR_EXECUTIVE
000260 SYBIL    JOHNSON     D21     47250.00 HR_EXECUTIVE
000270 MARIA    PEREZ      D21     37380.00 HR_EXECUTIVE
000280 ETHEL    SCHNEIDER    E11     36250.00 HR_EXECUTIVE
000290 JOHN     PARKER     E11     35340.00 HR_EXECUTIVE
000300 PHILIP    SMITH      E11     37750.00 HR_EXECUTIVE
000310 MAUDE    SETRIGHT    E11     35900.00 HR_EXECUTIVE
000320 RAMLAL    MEHTA      E21     39950.00 HR_EXECUTIVE
000330 WING     LEE       E21     45370.00 HR_EXECUTIVE
000340 JASON    GOUNOT     E21     43840.00 HR_EXECUTIVE
200010 DIAN     HEMMINGER    A00     46500.00 HR_EXECUTIVE
200120 GREG     ORLANDO     A00     39250.00 HR_EXECUTIVE
200140 KIM     NATZ      C01     68420.00 HR_EXECUTIVE
200170 KIYOSHI   YAMAMOTO    D11     64680.00 HR_EXECUTIVE
200220 REBA     JOHN      D11     69840.00 HR_EXECUTIVE
200240 ROBERT    MONTEVERDE   D21     37760.00 HR_EXECUTIVE
200280 EILEEN    SCHWARTZ    E11     46250.00 HR_EXECUTIVE
200310 MICHELLE   SPRINGER    E11     35900.00 HR_EXECUTIVE
200330 HELENA    WONG      E21     35370.00 HR_EXECUTIVE
200340 ROY     ALONZO     E21     31840.00 HR_EXECUTIVE
 42 record(s) selected.
update emp set DEPT_TAG=(SECLABEL_BY_NAME('J_DEPT_POLICY','A00')) where WORKDEPT='A00'
update emp set DEPT_TAG=(SECLABEL_BY_NAME('J_DEPT_POLICY','B01')) where WORKDEPT='B01'
update emp set DEPT_TAG=(SECLABEL_BY_NAME('J_DEPT_POLICY','C01')) where WORKDEPT='C01'
update emp set DEPT_TAG=(SECLABEL_BY_NAME('J_DEPT_POLICY','D11')) where WORKDEPT='D11'
update emp set DEPT_TAG=(SECLABEL_BY_NAME('J_DEPT_POLICY','D21')) where WORKDEPT='D21'
update emp set DEPT_TAG=(SECLABEL_BY_NAME('J_DEPT_POLICY','E01')) where WORKDEPT='E01'
update emp set DEPT_TAG=(SECLABEL_BY_NAME('J_DEPT_POLICY','E11')) where WORKDEPT='E11'
update emp set DEPT_TAG=(SECLABEL_BY_NAME('J_DEPT_POLICY','E21')) where WORKDEPT='E21'
db2 => select EMPNO, FIRSTNME, LASTNAME, WORKDEPT, SALARY,
varchar(SECLABEL_TO_CHAR('J_DEPT_POLICY',DEPT_TAG),30) from emp
EMPNO FIRSTNME   LASTNAME    WORKDEPT SALARY   6
------ ------------ --------------- -------- ----------- ------------------------------
000010 CHRISTINE  HAAS      A00    152750.00 A00
000020 MICHAEL   THOMPSON    B01     94250.00 B01
000030 SALLY    KWAN      C01     98250.00 C01
000050 JOHN     GEYER      E01     80175.00 E01
000060 IRVING    STERN      D11     72250.00 D11
000070 EVA     PULASKI     D21     96170.00 D21
000090 EILEEN    HENDERSON    E11     89750.00 E11
000100 THEODORE   SPENSER     E21     86150.00 E21
000110 VINCENZO   LUCCHESSI    A00     66500.00 A00
000120 SEAN     O'CONNELL    A00     49250.00 A00
000130 DELORES   QUINTANA    C01     73800.00 C01
000140 HEATHER   NICHOLLS    C01     68420.00 C01
000150 BRUCE    ADAMSON     D11     55280.00 D11
000160 ELIZABETH  PIANKA     D11     62250.00 D11
000170 MASATOSHI  YOSHIMURA    D11     44680.00 D11
000180 MARILYN   SCOUTTEN    D11     51340.00 D11
000190 JAMES    WALKER     D11     50450.00 D11
000200 DAVID    BROWN      D11     57740.00 D11
000210 WILLIAM   JONES      D11     68270.00 D11
000220 JENNIFER   LUTZ      D11     49840.00 D11
000230 JAMES    JEFFERSON    D21     42180.00 D21
000240 SALVATORE  MARINO     D21     48760.00 D21
000250 DANIEL    SMITH      D21     49180.00 D21
000260 SYBIL    JOHNSON     D21     47250.00 D21
000270 MARIA    PEREZ      D21     37380.00 D21
000280 ETHEL    SCHNEIDER    E11     36250.00 E11
000290 JOHN     PARKER     E11     35340.00 E11
000300 PHILIP    SMITH      E11     37750.00 E11
000310 MAUDE    SETRIGHT    E11     35900.00 E11
000320 RAMLAL    MEHTA      E21     39950.00 E21
000330 WING     LEE       E21     45370.00 E21
000340 JASON    GOUNOT     E21     43840.00 E21
200010 DIAN     HEMMINGER    A00     46500.00 A00
200120 GREG     ORLANDO     A00     39250.00 A00
200140 KIM     NATZ      C01     68420.00 C01
200170 KIYOSHI   YAMAMOTO    D11     64680.00 D11
200220 REBA     JOHN      D11     69840.00 D11
200240 ROBERT    MONTEVERDE   D21     37760.00 D21
200280 EILEEN    SCHWARTZ    E11     46250.00 E11
200310 MICHELLE   SPRINGER    E11     35900.00 E11
200330 HELENA    WONG      E21     35370.00 E21
200340 ROY     ALONZO     E21     31840.00 E21
 42 record(s) selected.

在更新之後,我們來看看各個用戶能夠做什麼。使用 Executive 用戶 ID Jane 連接數據庫。首先執行與前面一樣的選擇語句:

db2 => select EMPNO, FIRSTNME, LASTNAME, WORKDEPT, SALARY,
varchar(SECLABEL_TO_CHAR('J_DEPT_POLICY',DEPT_TAG),30) from gmilne.emp
EMPNO FIRSTNME   LASTNAME    WORKDEPT SALARY   6
------ ------------ --------------- -------- ----------- ------------------------------
000010 CHRISTINE  HAAS      A00    152750.00 A00
000020 MICHAEL   THOMPSON    B01     94250.00 B01
000030 SALLY    KWAN      C01     98250.00 C01
000050 JOHN     GEYER      E01     80175.00 E01
000060 IRVING    STERN      D11     72250.00 D11
000070 EVA     PULASKI     D21     96170.00 D21
000090 EILEEN    HENDERSON    E11     89750.00 E11
000100 THEODORE   SPENSER     E21     86150.00 E21
000110 VINCENZO   LUCCHESSI    A00     66500.00 A00
000120 SEAN     O'CONNELL    A00     49250.00 A00
000130 DELORES   QUINTANA    C01     73800.00 C01
000140 HEATHER   NICHOLLS    C01     68420.00 C01
000150 BRUCE    ADAMSON     D11     55280.00 D11
000160 ELIZABETH  PIANKA     D11     62250.00 D11
000170 MASATOSHI  YOSHIMURA    D11     44680.00 D11
000180 MARILYN   SCOUTTEN    D11     51340.00 D11
000190 JAMES    WALKER     D11     50450.00 D11
000200 DAVID    BROWN      D11     57740.00 D11
000210 WILLIAM   JONES      D11     68270.00 D11
000220 JENNIFER   LUTZ      D11     49840.00 D11
000230 JAMES    JEFFERSON    D21     42180.00 D21
000240 SALVATORE  MARINO     D21     48760.00 D21
000250 DANIEL    SMITH      D21     49180.00 D21
000260 SYBIL    JOHNSON     D21     47250.00 D21
000270 MARIA    PEREZ      D21     37380.00 D21
000280 ETHEL    SCHNEIDER    E11     36250.00 E11
000290 JOHN     PARKER     E11     35340.00 E11
000300 PHILIP    SMITH      E11     37750.00 E11
000310 MAUDE    SETRIGHT    E11     35900.00 E11
000320 RAMLAL    MEHTA      E21     39950.00 E21
000330 WING     LEE       E21     45370.00 E21
000340 JASON    GOUNOT     E21     43840.00 E21
200010 DIAN     HEMMINGER    A00     46500.00 A00
200120 GREG     ORLANDO     A00     39250.00 A00
200140 KIM     NATZ      C01     68420.00 C01
200170 KIYOSHI   YAMAMOTO    D11     64680.00 D11
200220 REBA     JOHN      D11     69840.00 D11
200240 ROBERT    MONTEVERDE   D21     37760.00 D21
200280 EILEEN    SCHWARTZ    E11     46250.00 E11
200310 MICHELLE   SPRINGER    E11     35900.00 E11
200330 HELENA    WONG      E21     35370.00 E21
200340 ROY     ALONZO     E21     31840.00 E21
 42 record(s) selected.

以及更新命令:

db2 => update gmilne.emp set DEPT_TAG=(SECLABEL_BY_NAME('J_DEPT_POLICY','E01'))
where WORKDEPT='E01' DB20000I The SQL command completed successfully.

可以看到,Jane 對表中的所有數據有完全的訪問權。現在,看看 Joe 可以看到的內容。首先進行選擇。

db2 => select EMPNO, FIRSTNME, LASTNAME, WORKDEPT, SALARY,
varchar(SECLABEL_TO_CHAR('J_DEPT_POLICY',DEPT_TAG),30) from gmilne.emp
EMPNO FIRSTNME   LASTNAME    WORKDEPT SALARY   6
------ ------------ --------------- -------- ----------- ------------------------------
000060 IRVING    STERN      D11     72250.00 D11
000100 THEODORE   SPENSER     E21     86150.00 E21
000150 BRUCE    ADAMSON     D11     55280.00 D11
000160 ELIZABETH  PIANKA     D11     62250.00 D11
000170 MASATOSHI  YOSHIMURA    D11     44680.00 D11
000180 MARILYN   SCOUTTEN    D11     51340.00 D11
000190 JAMES    WALKER     D11     50450.00 D11
000200 DAVID    BROWN      D11     57740.00 D11
000210 WILLIAM   JONES      D11     68270.00 D11
000220 JENNIFER   LUTZ      D11     49840.00 D11
000320 RAMLAL    MEHTA      E21     39950.00 E21
000330 WING     LEE       E21     45370.00 E21
000340 JASON    GOUNOT     E21     43840.00 E21
200170 KIYOSHI   YAMAMOTO    D11     64680.00 D11
200220 REBA     JOHN      D11     69840.00 D11
200330 HELENA    WONG      E21     35370.00 E21
200340 ROY     ALONZO     E21     31840.00 E21
 17 record(s) selected.

看到了嗎?他只能看到 D11 和 E21 部門的信息。如果他試圖選擇不允許他訪問的表數據,那麼會發生什麼:

db2 => select EMPNO, FIRSTNME, LASTNAME, WORKDEPT, SALARY,
varchar(SECLABEL_TO_CHAR('J_DEPT_POLICY',DEPT_TAG),30)
from gmilne.emp where empno='000130'
EMPNO FIRSTNME   LASTNAME    WORKDEPT SALARY   6
------ ------------ --------------- -------- ----------- ------------------------------
 0 record(s) selected.

在前面 Jane 進行選擇的結果中我們看到,有一個職員的 empno 是 000130,但是不允許 Joe 看到它。

現在是最後一個測試,對於用戶 Frank 的測試。

首先,運行與前兩個用戶相同的選擇:

db2 => select EMPNO, FIRSTNME, LASTNAME, WORKDEPT, SALARY,
varchar(SECLABEL_TO_CHAR('J_DEPT_POLICY',DEPT_TAG),30) from gmilne.emp
EMPNO FIRSTNME   LASTNAME    WORKDEPT SALARY   6
------ ------------ --------------- -------- ----------- ------------------------------
000010 CHRISTINE  HAAS      A00    152750.00 A00
000110 VINCENZO   LUCCHESSI    A00     66500.00 A00
000120 SEAN     O'CONNELL    A00     49250.00 A00
200010 DIAN     HEMMINGER    A00     46500.00 A00
200120 GREG     ORLANDO     A00     39250.00 A00
 5 record(s) selected.

在這裡可以看到,Frank 只能看到部門中他領導的用戶的相關信息。我們來看看在他嘗試進行更新時會發生什麼:

db2 => update gmilne.emp set DEPT_TAG=(SECLABEL_BY_NAME('J_DEPT_POLICY','A00'))
where WORKDEPT='A00'DB21034E The command was processed as an SQL statement
because it was not a valid Command Line Processor command. During SQL processing it
returned:
SQL20402N Authorization ID "FRANK" does not have the LBAC credentials to
perform the "UPDATE" Operation on table "EMPLOYEE". SQLSTATE=42519

盡管他嘗試更新的記錄是在自己的部門中,但是訪問安全策略只允許他對表進行讀訪問。我們的業務需求已經得到了滿足。

結束語

既然您已經學完了本教程,您應該對以下主題有了基本理解:

DB2 安全計劃的元素:您應該了解整個 DB2 環境的結構,包括客戶機、服務器、網關和主機。還應該了解了身份驗證、授權和特權。

DB2 身份驗證類型:您應該知道如何使用 db2 update dbm cfg using authentication type 命令在服務器上設置身份驗證類型,以及使用 db2 catalog database 命令在網關和客戶機上設置身份驗證類型。

DB2 權限:您應該了解 SYSADM、SYSCTRL 和 SYSMAINT 權限(在 DBM CFG 文件中設置)以及 DBADM 和 LOAD 權限(通過 GRANT 命令設置,使用 REVOKE 命令撤消)的基本知識。您應該明確地知道每種權限允許運行什麼命令。

DB2 特權:您應該了解不同類型的特權以及它們允許用戶做什麼。特權的例子包括 CONTROL、INSERT、DELETE、CREATEIN、DROPIN、REFERENCES 和 SELECT。還應該知道如何顯式(GRANT/REVOKE 命令)、隱式或(只針對包)間接地獲得/撤消特權。另外,應該基本了解基於標簽的訪問控制,以及如何基於這個新的安全概念定義不同類型的策略。

本系列其他教程推薦

DB2 9 基礎(730 考試)認證指南,第 1 部分: DB2 規劃 1

DB2 9 基礎(730 考試)認證指南,第 1 部分: DB2 規劃 2

DB2 9 基礎(730 考試)認證指南,第 3 部分: 訪問 DB2 數據

DB2 9 基礎(730 考試)認證指南,第 4 部分: 處理 DB2 數據

DB2 9 基礎(730 考試)認證指南,第 5 部分: 處理 DB2 對象

DB2 9 基礎(730 考試)認證指南,第 6 部分: 數據並發性

DB2 9 基礎(730 考試)認證指南,第 7 部分: XQuery 簡介

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved