DB2 9數(shù)據(jù)庫服務器管理之DB2安全性
DB2安全性概述
DB2安全性是通過組合外部安全性服務與內部 DB2 授權機制來處理的。外部安全性服務對希望訪問 DB2 服務器的用戶進行身份驗證,DB2 外部的安全性軟件負責處理身份驗證。該軟件可以是操作系統(tǒng)的安全性設施,也可是 Kerberos 等獨立產品。成功校驗了用戶 ID 和口令后,內部 DB2 進程將接管控制,并確保用戶有權執(zhí)行所請求的操作。
圖1
身份驗證類型
身份驗證類型確定在何處驗證用戶 ID/口令對。所支持的身份驗證類型有:
SERVER(默認) SERVER_ENCRYPT KERBEROS KRB_SERVER_ENCRYPT CLIENT |
身份驗證類型是在服務器和客戶機處同時設置的。
服務器
每個實例僅允許一種類型的身份驗證,也就是說,設置適用于該實例下定義的所有數(shù)據(jù)庫。在數(shù)據(jù)庫管理器配置文件中使用 AUTHENTICATION 參數(shù)指定該設置。DB2 update database manager configuration authentication auth_type
manager configuration authentication auth_type |
客戶機
在客戶機處編目的各數(shù)據(jù)庫擁有自己的身份驗證類型,使用 catalog database 命令指定。#p#
使用 SERVER 選項進行身份驗證
DB2 catalog database db_name at node node_nameauthentication auth_type |
使用 SERVER 選項時,用戶 ID 和口令將發(fā)送到服務器進行校驗。考慮以下示例。
圖2
1、用戶使用用戶名 peter 和口令 peterpwd 登錄到工作站。
2、peter 隨后使用用戶 ID db2user 和口令 db2pwd 連接到 SAMPLE 數(shù)據(jù)庫,這是在遠程 DB2 服務器上定義的。
3、db2user 和 db2pwd 通過網(wǎng)絡發(fā)送到服務器。
4、db2user 和 db2pwd 在 DB2 服務器上校驗。
若您想保護用戶 ID 和口令免于被竊聽,可使用身份驗證類型 SERVER_ENCRYPT,這樣用戶 ID 和口令就都會被加密。
使用 Kerberos 進行身份驗證
Kerberos 是一種外部安全性設施,它使用通用密碼術創(chuàng)建共享的加密密鑰。Kerberos 提供了安全的身份驗證機制,這是因為用戶 ID 和口令不再需要以明文形式通過網(wǎng)絡傳輸。通過使用加密密鑰,它使單點登錄到遠程 DB2 服務器成為可能。以下示意圖展示了 Kerberos 身份驗證在 DB2 中的工作原理。
圖3
DB2 客戶機和服務器均支持 Kerberos 安全協(xié)議時,即可使用 KERBEROS 身份驗證類型。某些客戶機可能并不支持 Kerberos,但依然需要訪問 DB2 服務器。為確保所有類型的客戶機均能安全地連接,將 DB2 服務器的身份驗證類型設置為 KRB_SERVER_ENCRYPT。這將允許所有啟用了 Kerberos 的客戶機使用 Kerberos 進行身份驗證,而其他客戶機則使用 SERVER_ENCRYPT 身份驗證。下面給出了與 Kerberos 相關的不同的客戶機與服務器身份驗證設置摘要。
圖4
在客戶機上進行身份驗證
這一選項允許在客戶機上進行身份驗證。用戶成功登錄到客戶機后,即可輕松連接到數(shù)據(jù)庫,而無需再次提供口令。
圖5
這里有一個重要問題需要理解:存在不具有可靠的安全性設施的客戶機系統(tǒng),例如 Windows 9x 和 Classic Mac OS。它們叫做不受信任的客戶機。任何人只要可以訪問這些系統(tǒng),就可以不經過身份驗證直接連接到 DB2 服務器。誰知道他們會執(zhí)行怎樣的破壞性操作(例如,刪除一個數(shù)據(jù)庫)?為提供允許受信任的客戶機自行執(zhí)行身份驗證、同時強制不受信任的客戶機在服務器處進行身份驗證的靈活性,引入了另外兩種數(shù)據(jù)庫管理器配置參數(shù):
TRUST_ALLCLNTS TRUST_CLNTAUTH |
這兩個參數(shù)僅在身份驗證設置為 CLIENT 時被評估。DB2
信任客戶機
TRUST_ALLCLNTS 確定信任哪種類型的客戶機。參數(shù)有以下可能值:
◆YES
信任所有客戶機。這是默認設置。身份驗證將在客戶機處執(zhí)行。但有一個例外,我們將在介紹 TRUST_CLNTAUTH 時更詳細地予以討論。
◆NO
僅信任具備可靠的安全性設施的客戶機(受信任的客戶機)。若不受信任的客戶機連接,則必須提供用戶 ID 和口令,以便在服務器進行身份驗證。
◆DRDAONLY
僅信任在 iSeries 或 zSeries 平臺上運行的客戶機(例如,DRDA 客戶機)。其他任何客戶機都必須提供用戶 ID 和口令。
設想一個場景,DB2 服務器將身份驗證設置為 CLIENT、TRUST_ALLCLNTS 設置為 YES。您作為 localuser 登錄到一臺 Windows 2000 計算機,并在未指定用戶 ID 和口令的情況下連接到遠程數(shù)據(jù)庫。那么 localuser 將成為數(shù)據(jù)庫處的連接授權 ID。而如果您想使用其他用戶 ID 連接到數(shù)據(jù)庫(例如,有執(zhí)行數(shù)據(jù)庫備份權限的 poweruser),又會怎么樣呢?
為允許此類行為,可使用 TRUST_CLNTAUTH 來指定,當在 connect 語句或 attach 命令中提供了用戶 ID 和密碼時將在何處進行身份驗證。允許使用的值有兩個:
◆CLIENT
身份驗證在客戶機處執(zhí)行,不需要用戶 ID 和口令。
◆SERVER
身份驗證在服務器處完成,需要提供用戶 ID 和口令。
讓我們來看一些演示參數(shù)用法的示例:
圖6 #p#
設置權限級別
權限級別控制執(zhí)行數(shù)據(jù)庫管理器維護操作和管理數(shù)據(jù)庫對象的能力。在 DB2 中共有 5 種權限:
圖7
SYSADM
具有管理實例的完整特權,還可訪問底層數(shù)據(jù)庫中的數(shù)據(jù)。
SYSCTRL 和 SYSMAINT
擁有管理實例、其數(shù)據(jù)庫和數(shù)據(jù)庫對象的特定特權。這些權限不含 訪問數(shù)據(jù)的權限。例如,像 'SELECT * FROM mytable' 或 'DELETE FROM mytable' 這樣的語句是不允許的。
DBADM
擁有在特定數(shù)據(jù)庫上執(zhí)行管理任務的特權。還具有數(shù)據(jù)庫的完整數(shù)據(jù)訪問權限。
LOAD
擁有對指定數(shù)據(jù)庫運行加載實用工具的特權。
下表總結了各權限可執(zhí)行的功能。
圖8
管理 DB2 權限
SYS* 權限是在數(shù)據(jù)庫管理器配置中設置的,通過將操作系統(tǒng)或安全性設施中定義的用戶組指派給關聯(lián)的參數(shù)進行設置。它必須是最大長度為 8 個字符的組名稱,如下所示。
圖9
DBADM 和 LOAD 是數(shù)據(jù)庫級的權限。使用 grant 語句可授予用戶或用戶組這些權限,使用 revoke 語句可予以撤銷權限:
connect to sample; grant dbadm on database to user john; grant load on database to group dbagrp; revoke load on database from group dbagrp; |
請注意,具有 LOAD 權限的用戶也需要表上的 INSERT 特權,之后才能加載數(shù)據(jù)。下一節(jié)將討論特權。
設置特權
特權給予用戶通過特定方式訪問數(shù)據(jù)庫對象的權力。如下列表給出了不同數(shù)據(jù)庫對象的特權摘要。
數(shù)據(jù)庫特權
CONNECT 允許用戶連接數(shù)據(jù)庫。
BINDADD 允許用戶在數(shù)據(jù)庫中創(chuàng)建新包。
CREATETAB 允許用戶在數(shù)據(jù)庫中創(chuàng)建新表。
CREATE_NOT_FENCED 允許用戶創(chuàng)建非 fenced 用戶定義的函數(shù)或存儲過程。
IMPLICIT_SCHEMA 允許用戶在尚不存在的模式中創(chuàng)建對象。 QUIESCE_CONNECT 允許用戶在數(shù)據(jù)庫停頓時訪問數(shù)據(jù)庫。
CREATE_EXTERNAL_ROUTINE 允許用戶創(chuàng)建以 C 語言、Java™ 語言、OLD 和 COBOL 編寫的存儲過程。
模式特權
CREATEIN 允許用戶在模式內創(chuàng)建對象。
ALTERIN 允許用戶更改模式內的對象。
DROPIN 允許用戶刪除模式內的對象。
要顯式地創(chuàng)建新模式,可使用 create schema 命令:
connect to sample user dbowner;create schema dev authorization devuser; |
空間特權
USE OF TABLESPACE 允許用戶在特定表空間內創(chuàng)建表。這一特權無法用于 SYSCATSPACE 或任何系統(tǒng)臨時表空間。
表與視圖特權
CONTROL 為用戶提供表或視圖的所有特權,以及將這些特權(除 CONTROL 以外)授予他人的能力。
ALTER 允許用戶更改表或視圖。
DELETE 允許用戶刪除表或視圖中的記錄。
INDEX 允許用戶在表上創(chuàng)建索引。
INSERT 允許用戶向表或視圖中插入條目。
REFERENCES 允許用戶創(chuàng)建和刪除外鍵,將表指定為關系中的父表。
SELECT 允許用戶從表或視圖中檢索行。
UPDATE 允許用戶在表或視圖中更新條目。這一特權還可將用戶約束為僅更新特定列: grant update (workdept, job) on table employee to devuser;
ALL PRIVILEGES 授予用戶表或視圖上的上述全部特權(除 CONTROL 外)。
包特權
CONTROL 為用戶提供了重新綁定、刪除或執(zhí)行一個包的能力,以及將這些特權(除CONTROL以外)授予他人的能力。
BIND 允許用戶重新綁定現(xiàn)有包。
EXECUTE 允許用戶執(zhí)行包。
索引特權
CONTROL 允許用戶刪除索引。
例程特權
EXECUTE 允許用戶執(zhí)行用戶定義的函數(shù)。
順序特權
USAGE 允許用戶為順序對象使用 NEXTVAL 和 PREVVAL 表達式。
授予顯式特權
授予特權 with grant option 允許授權 ID 將特定特權擴展給他人。該選項僅對包、例程、模式、表、表空間和視圖可用。
盡管特權的授予是可擴展的,但撤銷特權并非如此。若通過 with grant option 獲得了特權,用戶不能撤銷他人的特權。示例如下。
該語句允許 john 在表 employee 上執(zhí)行 select、update 或 delete 操作,并可將這些特權授予他人:
該語句允許 devusers 組中的用戶重新綁定、刪除及執(zhí)行包 dev.pkg1。同一組的用戶還可將 BIND 和 EXECUTE(但不包括 CONTROL)特權授予他人。
授予隱式及間接特權
典型情況下,DB2 特權是通過 grant 語句顯式授予的,方法如前所述。有時用戶可能還要隱式或間接地通過執(zhí)行的特定操作獲得特權。讓我們來看一些場景。
被授予 DBADM 權限的用戶還被隱式地授予 BINDADD、CONNECT、CREATETAB、CREATE_NOT_FENCED 和 IMPLICIT_SCHEMA 權限。
當用戶創(chuàng)建數(shù)據(jù)庫時:
◆DBADM 權限將被授予數(shù)據(jù)庫創(chuàng)建者。
◆CONNECT、CREATETAB、BINDADD 和 IMPLICIT_SCHEMA 特權將被授予 PUBLIC。
◆USERSPACE1 表空間上的 USE OF TABLESPACE 特權將被授予 PUBLIC。
◆各成功綁定實用工具上的 BIND 和 EXECUTE 特權將被授予 PUBLIC。
grant select, update, delete on table employee to user johnwith grant option |
◆SYSFUN 模式中所有函數(shù)的 EXECUTE 特權 with grant option 將被授予 PUBLIC。
grant control on package dev.pkg1 to group devuserswith grant option |
創(chuàng)建表、視圖、索引、模式或包的用戶將自動獲得他/她所創(chuàng)建的數(shù)據(jù)庫對象上的 CONTROL 特權。
當用戶執(zhí)行一個包含靜態(tài) SQL 語句的包時,語句中所引用的數(shù)據(jù)庫對象的顯式特權是不需要的。用戶僅需要包上的 EXECUTE 特權來執(zhí)行語句。但這并不表示該用戶有權直接訪問底層數(shù)據(jù)庫對象。考慮以下示例:
【編輯推薦】