使用 DMTF 标准的 Profile 管理 IBM i 用户权限
2009-11-05 00:00:00 来源:WEB开发网引言
分布式管理工作组(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 的应用不断深入,单点式的跨平台的系统管理软件将日趋流行。
更多精彩
赞助商链接