DB2權限管理

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.tabauthsyscat.colauthsyscat.indexauthsyscat.schemaauthsyscat.routineauthsyscat.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 命令現在應該會成功完成,因爲 test1db2grp1 組的成員。

現在,在第二個窗口中輸入以下命令:

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 安全策略來實現這些規則。

1、定義安全策略和標籤,並將安全標籤授予用戶
2、在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.

db2=>update emp set DEPT_TAG=(SECLABEL_BY_NAME('J_DEPT_POLICY','A00')) where WORKDEPT='A00'
db2=>update emp set DEPT_TAG=(SECLABEL_BY_NAME('J_DEPT_POLICY','B01')) where WORKDEPT='B01'
db2=>update emp set DEPT_TAG=(SECLABEL_BY_NAME('J_DEPT_POLICY','C01')) where WORKDEPT='C01'
db2=>update emp set DEPT_TAG=(SECLABEL_BY_NAME('J_DEPT_POLICY','D11')) where WORKDEPT='D11'
db2=>update emp set DEPT_TAG=(SECLABEL_BY_NAME('J_DEPT_POLICY','D21')) where WORKDEPT='D21'
db2=>update emp set DEPT_TAG=(SECLABEL_BY_NAME('J_DEPT_POLICY','E01')) where WORKDEPT='E01'
db2=>update emp set DEPT_TAG=(SECLABEL_BY_NAME('J_DEPT_POLICY','E11')) where WORKDEPT='E11'
db2=>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

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


參考至:http://www.ibm.com/developerworks/cn/education/data/db2-cert7302/section5.htm
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章