首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

基於 DMTF CIM 標準的 IBM i 角色權限管理實戰:Profile 設計與 SBLIM 開發

     編輯:Java 相關知識

背景:為何需要標準化管理模型

異構環境下,每個平台(IBM i、Linux、Windows)都有自有的用戶權限模型。DMTF(分布式管理任務組)發布的 CIM (Common Information Model) 及其上的 Management Profiles,提供了跨平台、廠商中立的管理抽象層。本文以 Role Based Authorization Profile 為例,示範如何將 IBM i 的角色權限體系映射至標準模型,並用 SBLIM 開發管理客戶端。

IBM i 原生角色權限體系

IBM i 定義 5 種角色、8 項特權,預設映射隨 QSECURITY 系統值(安全等級)變化:

角色QSECURITY 10/20 特權QSECURITY 30+ 特權
USER*ALLOBJ, *SAVSYS(無預設)
SYSOPR*ALLOBJ, *SAVSYS, *JOBCTL*SAVSYS, *JOBCTL
PGMR*ALLOBJ, *SAVSYS, *JOBCTL*SAVSYS, *JOBCTL
SECADM*ALLOBJ, *SAVSYS, *SECADM, *JOBCTL*SECADM
SECOFR*ALLOBJ, *AUDIT, *IOSYSCFG, *JOBCTL, *SAVSYS, *SECADM, *SERVICE, *SPLCTL同左(完整特權)

業務痛點:若需給 USER 角色額外授予 *SECADM,原生機制僅支援「用戶級覆蓋」,無法建立新的通用角色。

DMTF Role Based Authorization Profile 類模型

Profile 類圖

核心類與關聯:

  • CIM_Role:角色模型(如 USER、SECADM)
  • CIM_Privilege:特權模型(如 *ALLOBJ、*SECADM)
  • CIM_MemberOfCollection:關聯類,連接 Role↔Privilege、Identity↔Role
  • CIM_Identity:用戶/群組安全主體
  • CIM_ConcreteDependency:專有角色關聯(用於用戶級客製化權限)
  • CIM_RoleBasedAuthorizationService:服務類,暴露 CreateRole()、AssignRole()、ShowAccess() 等方法
  • CIM_RoleBasedManagementCapabilities:能力類,SupportedMethods 屬性聲明實際支援哪些方法

兩種權限建模策略對比

策略一:建立新通用角色(IBM i 不支援)

新通用角色模式

創建擁有 {*ALLOBJ, *SAVSYS, *SECADM} 的新角色「USER_EXT」,指派給用戶 A。優點:復用性高;缺點:需平台支援動態創建角色,IBM i 受限於系統架構無法實現。

策略二:專有角色——IBM i 的實際落地方案

專有角色模式

  • 用戶 A 透過 CIM_ConcreteDependency 關聯專屬 Role 實例
  • 該 Role 僅服務於用戶 A,關聯所需的 3 個 Privilege 實例
  • 區分關鍵:通用角色用 MemberOfCollection,專有角色用 ConcreteDependency

兩種模式可共存:通用角色服務標準職務,專有角色處理例外授權。

SBLIM 客戶端開發實戰:遍歷用戶權限

import org.sblim.wbem.cim.*;
import org.sblim.wbem.client.*;

public class IBMiPrivilegeEnumerator {
    public static void main(String[] args) throws Exception {
        // 1. 建立 CIM 客戶端連線
        UserPrincipal principal = new UserPrincipal("JINGLEI");
        PasswordCredential cred = new PasswordCredential("password".toCharArray());
        CIMNameSpace ns = new CIMNameSpace("https://CD06070C.CN.IBM.COM:5988", "root/cimv2");
        CIMClient client = new CIMClient(ns, principal, cred, CIMClient.CIM_XML);

        // 2. 列舉所有 Identity (用戶帳號)
        CIMObjectPath identityPath = new CIMObjectPath("CIM_Identity", "root/cimv2");
        Enumeration identities = client.enumerateInstanceNames(identityPath);

        while (identities.hasMoreElements()) {
            CIMObjectPath userPath = (CIMObjectPath) identities.nextElement();
            String userName = userPath.getKey("Name").getValue().toString();

            // 3. 遍歷 ConcreteDependency 找到專有角色
            Enumeration rolePaths = client.associatorNames(userPath, 
                "CIM_ConcreteDependency", null, null, null);

            while (rolePaths.hasMoreElements()) {
                CIMObjectPath rolePath = (CIMObjectPath) rolePaths.nextElement();

                // 4. 遍歷 MemberOfCollection 找到角色擁有的特權
                Enumeration privPaths = client.associatorNames(rolePath,
                    "CIM_MemberOfCollection", null, null, null);

                System.out.print("User: " + userName + " -> Privileges: ");
                while (privPaths.hasMoreElements()) {
                    CIMObjectPath privPath = (CIMObjectPath) privPaths.nextElement();
                    String priv = privPath.getKey("InstanceID").getValue().toString();
                    System.out.print(priv + " ");
                }
                System.out.println();
            }
        }
        client.close();
    }
}

代碼邏輯對應 Profile 圖解

  1. enumerateInstanceNames(CIM_Identity) → 獲取所有用戶節點
  2. associatorNames(..., CIM_ConcreteDependency) → 沿「專有角色」關聯邊走到 Role 節點
  3. associatorNames(..., CIM_MemberOfCollection) → 沿「角色-特權」關聯邊走到 Privilege 節點
  4. 從 CIMObjectPath 的 Key InstanceID 取得特權字串(如 *SECADM)

Profile 驅動開發的價值

  • 介面標準化:Console 端代碼與平台無關,只依賴 Profile 定義的類/方法/關聯。
  • 能力查詢機制:調用服務方法前,先讀 RoleBasedManagementCapabilities.SupportedMethods,避免調用不支援操作報錯。
  • 平台實現解耦:IBM i、Linux、Windows 各自實現 Provider 映射到底層 API(如 IBM i 的 QSYRUSRI、QSYRUPRA 系統 API),Console 完全屏蔽差異。

結語

DMTF Profile 將「管理什麼」與「如何管理」分離。隨著 Software Inventory、Sensor、Virtualization 等數十個 Profile 成熟,單一管理控制台統管異構數據中心正從願景走向現實。對系統集成商與工具開發商而言,投資 Profile 相容實現,即是投資未來的互操作性紅利。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved