IBM Support

使用IBM Java Toolbox for i 管理IBM i权限

Technical Blog Post


Abstract

使用IBM Java Toolbox for i 管理IBM i权限

Body

从安全性的角度,IBM i提供了三个级别的安全保护机制,分别为:物理安全性、登录安全性、以及资源安全性。物理安全性是从硬件的角度,主要涉及的是IBM i数据存储介质的保护;登录安全性则以用户为中心,限制哪些用户访问IBM i以及登录后可执行哪些操作;资源安全性是围绕IBM i对象与文件等资源,保护文件、对象以及对象中数据避免非法访问。另一方面,作为一组Java应用程序编程接口,IBM Java Toolbox for i主要用于访问IBM i的数据与资源。有关IBM Java Toolbox for i的基础知识,请参见另一篇技术文档“Toolbox for Java 和 JTOpen”。本文的主要目标是:从程序设计的角度,指导读者如何使用IBM Java Toolbox for i从登录安全性与资源安全性的角度,实现针对用户、对象以及文件的权限管理。物理安全性不属于本文的讨论范围。

从结构上,本文主要分为3部分。第一部分主要从用户权限的角度,介绍IBM Java Toolbox for i针对IBM i的登录安全性的编程支持;在第二部分中,我们将分别从对象权限与IFS文件权限的角度,介绍IBM Java Toolbox for i针对IBM i的资源安全性的编程支持。最后一部分是总结。

为便于读者理解,本文给出样例,其说明如表1所示:

表 1. 样例说明
样例 说明
用户Admin                       IBM i管理员用户(*SECOFR)。样例程序将列出它的特殊权限(以下称Special Authority)。
用户 User1                     普通用户(*USER),属于用户组User2,无任何Special Authority。样例程序将创建文件/home/user1.policy
用户 User2                      组用户,同时也是管理员用户。样例程序将列出它的成员。
用户 User3                      普通用户(*USER)。样例程序将删除该用户。
对象CUSTINFO               QSYS.LIB/CUSTINFO.PGM作为RPG程序,提供客户信息查询功能。样例程序将打印用户针对该对象的权限。
文件/home/user1.policy    user1.policy功能是管理用户User1对应的安全策略。
 

IBM Java Toolbox for i实现IBM i的登录安全性

作为IBM i提供的三个安全保护级别之一,登录安全性的主体是用户。在IBM i中,描述用户的对象是用户概要(以下称User Profile)。因此,这里我们围绕用户概要,讨论IBM Java Toolbox for i关于IBM i登录安全性的相关支持。
作为IBM i系统中的一种特殊对象,User Profile是IBM i系统安全性的起点,对应的对象类型为*USRPRF。User Profile中定义了许多与安全性相关的属性,列举如下:
 
    (1) 用户拥有哪些对象。
    (2)针对拥有部分所有权的对象,该用户拥有哪些权限。
    (3)用户拥有哪些Special Authority。
    (4)用户是否属于某组用户(以下称Group Profile)及一系列子组用户(Supplemental Group Profile)
使用CL命令Work User Profile (WRKUSRPRF)可以查看User Profile对应的所有属性。其中,当使用CL命令Delete User Profile (DLTUSRPRF)删除某一用户时,针对用户拥有的对象与拥有部分所有权的对象,两者关于用户的权限引用也一并删除。与此同时,对于用户曾经拥有的对象而言,要么易主,更换所有者,要么选择一并删除。对于拥有部分所有权的对象,其用户权限也会随用户一起被删除。
 
从面向对象程序设计的角度,我们可以使用IBM Java Toolbox for i提供的CommandCall对象封装并远程执行CL命令的方式,完成删除用户的操作,如清单1所示:

清单 1. IBM Java Toolbox for i删除用户User3

// 构造AS400对象,建立Java应用程序与IBM i服务器的连接。
AS400 sys = new AS400(system, usr, pwd);
// 构造CommandCall,准备远程调用CL命令删除用户。
CommandCall cc = new CommandCall(sys);
// 删除用户。
if (cc.run("DLTUSRPRF User3")){
   //删除用户的操作成功。
   System.out.println("User3 was deleted successfully");
} else {
   // 如果调用失败,则将错误消息封装成相关Java类AS400Message。
   AS400Message[] messageList = pgm.getMessageList();
   // ... 处理消息列表
}

// 作为好的编程习惯,释放连接
sys.disconnectService(AS400.COMMAND);
 
 
刚才,我们介绍了User Profile关于对象与权限相关的两个属性。从中可以看出,用户,对象,权限三者的关联程度。
接下来介绍的是User Profile的另一重要属性——Special Authority。简单地说,用户的Special Authority的目标是控制用户访问某一对象或完成某一任务的特殊能力。通过CL命令Display User Profile (DSPUSRPRF)可查看用户相关的Special Authority,如图1所示:
 
图 1. 管理员Admin对应的Special Authority
图像 
图1列出管理员Admin拥有的众多Special Authority列表。其中,最值得一提的是*ALLOBJ与*SAVSYS这两种。*ALLOBJ权限最大,相当于IBM i的管理员,其操作不受任何限制。而*SAVSYS则允许用户将任意IBM i对象保存为Save File,即使用户对该对象没有权限。
 
从面向对象的角度,我们可以使用IBM Java Toolbox for i提供的User对象获取User Profile的相关属性,包括Special Authority,如清单2所示:

清单 2. IBM Java Toolbox for i获取用户Admin的特殊权限
// 构造AS400对象,建立Java应用程序与IBM i服务器的连接。
AS400 sys = new AS400(system, usr, pwd);
// 构造User对象,指定目标用户。
User user = new User(sys, "ADMIN");
// 获取用户特殊权限列表并打印。
String[] returnValue = user.getSpecialAuthority();
System.out.println("ADMIN Special Authority List:");
for (int i = 0; i < returnValue.length; ++i){
   System.out.println(returnValue[i]);
}

// 作为好的编程习惯,释放连接
sys.disconnectAllServices();
 
在介绍User Profile的前三个重要属性之后,我们看一下最后一个属性——Group Profile与Supplemental Group Profile。
我们知道,与Unix,Windows等操作系统一样,IBM i平台也支持用户与组的概念。所不同的是,Unix与Windows将用户与组视为两个不同的概念。而在IBM i中,组与用户是同一个概念,对象类型均为*USRPRF。从这个角度而言,Group Profile本身也是一个User Profile,所不同的是,当一个用户的GID(Group ID)属性被赋值或者说另一个*USRPRF对象被加入时,该User Profile就变成了一个Group Profile。而被加入的User Profile则成为成员用户(Member)。
 
在IBM i中,支持一个User Profile可以同时属于最多16个组,并且只有1个组能成为Group Profile,余下的则为Supplemental Group Profile。
 
与Unix,Windows等操作系统一样,Group Profile能起到简化管理用户的功效。需要指出的是,IBM i并不支持组与组之间的递归嵌套关系。换句话说,Group Profile并不允许成为其它User Profile的成员用户。
 
从面向对象的角度,要知道一个Group Profile究竟包含多少个普通的User Profile,我们可以使用IBM Java Toolbox for i提供的UserList对象列出某用户组对应的成员,如清单3所示:

清单 3. IBM Java Toolbox for i获取组用户User2的成员
// 构造AS400对象,建立Java应用程序与IBM i服务器的连接。
AS400 sys = new AS400(system, usr, pwd);
// 构造UserList对象,返回指定组的成员用户列表。
UserList userList = new UserList(sys);
userList.setUserInfo(UserList.MEMBER);
userList.setGroupInfo("User2");
// 打印成员用户列表。
System.out.println("The Member List of group User2:");
Enumeration enum = userList.getUsers();
while (en.hasMoreElements()) {
   User u = (User) en.nextElement();
   System.out.println ("User name: " + u.getName ());
   System.out.println ("Description: " + u.getDescription ());
}

// 作为好的编程习惯,释放连接
sys.disconnectAllServices();
 
至此,我们围绕用户权限,讨论了IBM Java Toolbox for i针对IBM i登录安全性的相关支持。接下来,我们继续讨论IBM Java Toolbox for i针对IBM i资源安全性的相关支持。
IBM Java Toolbox for i实现IBM i的资源安全性

作为IBM i提供的另一安全保护级别,资源安全性讨论的范畴是对象权限与文件权限。一方面,不同于文件系统为中心的Windows与Unix,IBM i是一种面向对象的操作系统。另一方面,为与Windows与Unix兼容,IBM i支持基于POSIX标准的IFS文件系统。本节部分主要讨论如何利用IBM Java Toolbox for i实现对基于对象权限与基于IFS文件权限的两种管理方式。

IBM Java Toolbox for i针对对象权限的支持

首先,我们讨论IBM Java Toolbox for i针对对象权限的支持。前面提到过,IBM i是一种面向对象的操作系统。因此对象的权限实际上包含两部分:对象权限与数据权限。
 
(1)对象权限指的是允许针对对象进行哪些操作。
(2)数据权限指的是允许针对对象内容进行哪些操作。
这里,只列出常见的对象权限与数据权限对应的值极其说明,分别如表1与表2所示。有关对象权限与数据权限更多详细内容,请参见IBM i 信息中心。

2. 对象权限

对象权限值

说明

*ALL

用户可以执行除了对象权限列表(*AUTL)所控操作外的所有操作。

*CHANGE

用户可对对象更改和执行基本功能。

*EXCLUDE

用户不能存取对象。

*USE

用户具有对象操作权限、读取权限和执行权限。

 
 
表 3. 数据权限 

数据权限值

说明

Add

可以向对象添加数据。

Delete

可以从对象删除数据。

Execute

可以使用对象。

Read

可以读取但不更改数据。

Update

可以读取、更改并保存数据。

 

表 4. 对象权限与数据权限的默认映射关系

对应关系

Add

Delete

Execute

Read

Update

*ALL

X

X

X

X

X

*CHANGE

X

X

X

X

X

*EXCLUDE

 

 

 

 

 

*USE

 

 

X

X

 

 用户可以根据业务需求,可以使用CL命令Edit Object Authority (EDTOBJAUT)更改这一映射关系规则,如图2所示。

 图 2. 编辑CUSTINFO.PGM的对象权限
 
图像 
 
从面向对象程序设计的角度,IBM Java Toolbox for i使用QSYSPermission对象获取对象权限,如清单4所示:

清单 4. IBM Java Toolbox for i打印CUSTINFO.PGM的对象权限
// 构造AS400对象,建立Java应用程序与IBM i服务器的连接。
AS400 sys = new AS400(system, usr, pwd);
// 指定对象,构造Permission对象。
Permission objectInQSYS = new Permission(sys, "/QSYS.LIB/CUSTINFO.PGM");
// 打印对象权限。
System.out.println("The Object Authority List:");
Enumeration en = objectInQSYS.getUserPermissions();
   while (en.hasMoreElements()) {
      QSYSPermission qsysPerm = (QSYSPermission) en.nextElement();
      System.out.println(qsysPerm.getUserID() + ": " + qsysPerm.getObjectAuthority());
}

// 作为好的编程习惯,释放连接
sys.disconnectAllServices();
 
至此,我们已从IBM i作为面向对象的系统的角度,介绍了如何使用IBM Java Toolbox for i提供对象权限的相关支持。接下来,我们从IFS文件系统的角度,介绍如何使用IBM Java Toolbox for i提供文件权限的相关支持。

IBM Java Toolbox for i针对IFS文件权限的支持

前面提到过,IBM i设计IFS的目的是效仿Windows,Unix文件系统。从面向对象的角度看,IFS的类型主要有两种,分别是对象类型为*DIR的文件夹与对象类型为*STMF的文件。
 
要查看文件的权限,最直接的方式是采用QShell的ls命令,如图3所示:
图 3. QShell查看/home/user1.policy的文件权限
 
 图像 
我们看到,文件user1.policy的所有者、用户组,以及其它用户对应的权限均为RW,没有执行权限。
另一种查看文件权限的方式是执行CL命令Work with Authority (WRKAUT),如图4所示:
图 4. CL查看/home/user1.policy的文件权限
图像 
从面向对象程序设计的角度,IBM Java Toolbox for i使用QSYSPermission类表示对象权限。要获取针对指定对象的用户对象权限,如清单4所示:

清单 4. IBM Java Toolbox for i打印/home/user1.policy的文件权限
// 构造AS400对象,建立Java应用程序与IBM i服务器的连接。
AS400 sys = new AS400(system, usr, pwd);
// 指定文件路径,构造Permission对象。
Permission objectInRoot = new Permission(sys, "/home/user1.policy");
// 打印文件权限。
System.out.println("The IFS File Authority List:");
Enumeration en = objectInRoot.getUserPermissions();
   while (en.hasMoreElements()) {
   RootPermission rootPerm = (RootPermission)en.nextElement();
   System.out.println(rootPerm.getUserID()+": "+rootPerm.getDataAuthority());
}

// 作为好的编程习惯,释放连接
sys.disconnectAllServices();
 
至此,我们从面向对象程序设计的角度,分别介绍了IBM Java Toolbox for i针对登录安全性与资源安全性的相关IBM i安全支持。

总结

安全性对于IBM i而言是一个相对复杂的话题。本文分别以用户,对象,文件这三个角度,重点介绍了IBM i的相关权限概念,并结合样例指导读者如何使用IBM Java Toolbox for i实现相关的IBM i安全支持工作。
参考资源
• 参看文章“Toolbox for Java 和 JTOpen” ,了解IBM Java Toolbox for i的概要信息。
• 参考“IBM i 信息中心对象权限章节”,了解更多有关IBM i对象权限的内容。
 
 
作者: pi guang ming 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

[{"Business Unit":{"code":"BU058","label":"IBM Infrastructure w\/TPS"},"Product":{"code":"SWG60","label":"IBM i"},"Component":"","Platform":[{"code":"PF025","label":"Platform Independent"}],"Version":"","Edition":"","Line of Business":{"code":"LOB57","label":"Power"}}]

UID

ibm11145116