引言
分布式管理工作組(Distributed Management Task Force,DMTF)是一個領 導開發和采納管理標准的行業組織。DMTF 的管理技術對於增強企業內部使用的 多廠商的工具之間的互操作性起到關鍵作用。通過在混合系統環境內部署符合 DMTF 標准的管理應用,客戶可以進行統一管理,有效降低管理的復雜度和成本 。
DMTF 已經針對不同的管理領域制定和發布了一系列管理 Profile。例如針對 軟件領域的 Software Inventory Profile 等。這些 Profile 運用通用信息模 型(Common Information Model,CIM)來描述管理對象,以面向對象的方法構 建受管對象類,聯系,屬性,操作等。本文示例如何把 Role Based Authorization Profile 運用到 IBM i 系統上進行權限管理,並結合 Standards Based Linux Instrumentation for Manageability(SBLIM)開發工具 包展示如何開發管理接口。
IBM i 上的用戶角色和權限
IBM i定義了 5 種角色和 8 個權限,這些角色和權限之間存在著如表 1 所 示的默認的對應關系。QSECURITY 是一個表示安全級別的系統值,在不同的安全 級別上角色對應的權限也有相應的差別。IBM i 支持用戶修改默認權限,例如, 在 QSECURITY 為 10 的情況下,用戶 A 被授予 USER 角色,那麼用戶 A 應該 默認擁有 *ALLOBJ 和 *SAVSYS 兩個權限,但也允許為用戶 A 額外授予 *SECADM 權限,這種權限的定制只局限於當前用戶。
表 1. IBM i 角色和權限對應關系表
Role Privileges QSECURITY level 10 or 20 QSECURITY level 30 or above USER "*ALLOBJ", "*SAVSYS" SYSOPR "*ALLOBJ", "*SAVSYS", "*JOBCTL" "*SAVSYS", "*JOBCTL" PGMR "*ALLOBJ", "*SAVSYS", "*JOBCTL" SECADM "*ALLOBJ", "*SAVSYS", "SECADM", "*JOBCTL" "*SECADM" SECOFR "*ALLOBJ", "*AUDIT", "*IOSYSCFG", "*JOBCTL", "*SAVSYS", "SECADM", "*SERVICE", "*SPLCTL" "*ALLOBJ", "*AUDIT", "*IOSYSCFG", "*JOBCTL", "*SAVSYS", "SECADM", "*SERVICE", "*SPLCTL"
基於角色授權 Profile
圖 1 顯示了 DMTF 基於角色授權 Profile 的類以及他們之間的聯系。其中 類 Role 用來建模角色,類 Privilege 用來建模權限,這兩個類之間使用關聯 類 MemberOfCollection 來表示表 1 中的對應關系。類 Identity 用來表示賬 號,用戶或者用戶組的安全代理,為用戶發生角色或權限驗證等操作提供安全相 關的信息。在 Identity 和 Role 之間的關聯類 MemberOfCollection 用來幫助 發現一個用戶擁有的角色。類和類之間的關系可分為兩種,其中紅色線條代表關 聯關系,綠色線條表示組合或包含關系;類和類存在一對一,一對多和多對多等 情況。
圖 1. 基於角色授權 Profile 的類圖
類 RoleBasedAuthorizationService 聲明了 Profile 支持的內部操作和外 部方法。這些方法為管理應用提供了修改用戶權限的手段。從實現者的角度,可 以有選擇的支持這些方法。這些方法主要有:
CreateRole(),創建具有特殊權限的新角色
DeleteRole(),刪除一個角色
ModifyRole(),修改角色及其具有的權限
AssignRole(),授予用戶某個角色
ShowAccess(),查詢用戶權限
ShowRoles(),查詢用戶角色
以 ModifyRole() 方法為例,該方法需要一個 Role 的實例和若干 Privilege 的實例作為輸入參數,這些實例是通過關聯類 ServiceAffectsElement 來得到的,ServiceAffectsElement 用來查詢支持 RoleBasedAuthorizationService 類上的方法的角色和權限的集合。
作為 Profile 的使用者,如何得知以上方法是否被支持呢?類 RoleBasedManagementCapabilities 中的屬性 SupportedMethods 中包含了已經 實現的方法。在調用 RoleBasedAuthorizationService 中相應的方法前,應該 先查詢 RoleBasedManagementCapabilities 的 SupportedMethods 中是否已經 支持了該方法。
用戶權限管理
由於代表權限的類 Privilege 和代表用戶的類 Identity 之間並未存在直接 的聯系,為了發現一個用戶的權限,需要通過該用戶的角色,即通過兩次 MemberOfCollection 關聯關系來得到用戶的權限,這也說明權限的組合定義了 角色。在默認情況下,一個通用的角色應該擁有固定的眾所周知的某些權限,例 如表 1 中的 5 種角色都屬於通用的角色。假如有一個用戶 A,我們想賦予他 *ALLOBJ 和 *SAVSYS 權限,那麼我們為他指定一個通用的 USER 角色即可。如 圖 2 所示:
圖 2. 使用系統通用角色進行權限管理
但考慮以下情況:如果我們同時想授予用戶 A 一個 *SECADM 權限,但不幸 的是沒有一個通用的角色同時擁有且只擁有這三個權限,那麼基於角色授權 Profile 是怎麼處理這種情況呢?
方式一:創建新的通用角色
基於角色授權 Profile 允許創建擁有客戶化權限的新的通用角色。一個具有 以上三種權限的角色被創建和指定給用戶 A 即可,同時該角色保存在系統中並 可以指定給其他用戶。這樣通過 MemberOfCollection,一個 Identity 類的實 例不再關聯到通用角色 USER 而是新建的角色,通過該新角色就能獲取用戶 A 的 3 個權限。遺憾的是在 IBM i 上並不支持創建新角色,所以這種方式不適用 於 IBM i。
圖 3. 通過創建新的通用角色進行權限管理
方式二:專有的角色
在這種方式下,用戶 A 通過 ConcreteDependency 關聯到一個專門用於用戶 A 的角色,這個角色不能應用到其他用戶,該角色關聯 3 個權限。這個專門的 角色存在的前提是沒有通用的角色可以表達用戶的權限。這樣客戶化的權限可以 單獨授予每個用戶。請注意專有角色和 Identity 之間使用的連接類是 ConcreteDependency 而非 MemberOfCollection 以區分專有角色和通用角色。
圖 4. 通過專有角色進行權限管理
在實現過程中,這兩種權限管理方式可以同時存在。
基於角色授權 Profile 的應用示例
基於 Profile 開發管理應用程序的好處是流程和接口的標准化。雖然在系統 一側,由於所在平台的差異,構造 Profile 中每個類的實例需要依賴平台相關 的代碼,但如果支持了 Profile,那麼在構建用戶接口即 Console 側,按照 Profile 的用例來對這些管理數據的提取和使用,可以省略接口協商過程和做到 平台無關。
下面的代碼使用到了 SBLIM 提供的開發包,SBLIM 是 IBM 發起的旨在 GNU/Linux 上管理標准化的一個開源項目。SBLIM CIM Client for Java 是一個 Linux 客戶應用框架,也可用於對符合 DMTF 管理標准的其他平台上的管理應用 實現進行測試。
清單 1. 使用 SBLIM 開發包構建管理程序實例
import org.sblim.wbem.cim.CIMClass;
import org.sblim.wbem.cim.CIMDataType;
import org.sblim.wbem.cim.CIMException;
import org.sblim.wbem.cim.CIMInstance;
import org.sblim.wbem.cim.CIMObjectPath;
import org.sblim.wbem.cim.CIMNameSpace;
import org.sblim.wbem.cim.CIMProperty;
import org.sblim.wbem.cim.CIMValue;
import org.sblim.wbem.client.CIMClient;
import org.sblim.wbem.client.PasswordCredential;
import org.sblim.wbem.client.UserPrincipal;
……
UserPrincipal cimPrinciple = new UserPrincipal ("JINGLEI");
String password = "password";
PasswordCredential cimCredential = new PasswordCredential (password.toCharArray());
CIMNameSpace cimNamespace =
new CIMNameSpace("http://CD06070C.CN.IBM.COM:5988", "root/cimv2");
CIMClient cimClient =
new CIMClient(cimNamespace, cimPrinciple, cimCredential, CIMClient.CIM_XML);
CIMObjectPath aPath = new CIMObjectPath("CIM_Identity", "root/cimv2");
Enumeration instNames = cimClient.enumerateInstanceNames (aPath);
while(instNames.hasMoreElements())
{
CIMObjectPath eachEnumPath = (CIMObjectPath) instNames.nextElement();
Enumeration assoNames = cimClient.associatorNames (eachEnumPath,
"CIM_ConcreteDependency",null,null,null);
while(assoNames.hasMoreElements())
{
CIMObjectPath retPath = (CIMObjectPath) assoNames.nextElement();
Enumeration assoInsts = cimClient.associatorNames (retPath,
"CIM_MemberOfCollection", null, null, null);
while(assoInsts.hasMoreElements())
{
CIMObjectPath path = (CIMObjectPath) assoInsts.nextElement();
String privilege = path.getKey ("InstanceID").getValue().toString();
}
}
}
……
程序片斷分析 :
本程序用來遍歷 CD06070C.CN.IBM.COM 機器上用戶及其權限。CIMClient 是 SBLIM 提供的用於和管理應用服務器端進行通信的類,用來向服務一側請求管理 對象信息。它封裝了底層的通信連接建立 , 消息發送接收等基本功能。管理對 象的信息使用類 CIMObjectPath 來封裝,cimClient.enumerateInstanceNames (aPath) 操作將獲取所有 CIM_Identity 類的實例,而 CIM_Identity 是 DMTF 定義的用來建模系統帳戶的類,即該操作將獲取 IBM i 上所有系統帳戶的實例 。對於每一個帳戶 , 為了得到其對應的權限 , 參照圖 4 的權限管理建模方式 , 首先通過關聯類 CIM_ConcreteDependency 得到該用戶的角色 CIM_Role 的實 例。cimClient.associatorNames 實現從 CIM_Identity 到 CIM_Role 的映射。 在獲得了用戶角色之後,再通過 cimClient.associatorNames 和關聯類 CIM_MemberOfCollection 找到這個角色擁有的權限 , 即 CIM_Privilege 的實 例。權限值放在 InstanceID 屬性裡 , 可以通過 CIMObjectPath 的 getKey 方 法提取。
結束語
Profile 的出現推動了分布式環境下系統管理應用的標准化進程。目前, DMTF 已經發布了幾十個管理 Profile,內容設計軟件,硬件,網絡,虛擬化等 方面。隨著 Profile 的應用不斷深入,單點式的跨平台的系統管理軟件將日趨 流行。