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所示:
样例 说明
用户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登录安全性的相关支持。
(4)用户是否属于某组用户(以下称Group Profile)及一系列子组用户(Supplemental Group Profile)
清单 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);
图1列出管理员Admin拥有的众多Special Authority列表。其中,最值得一提的是*ALLOBJ与*SAVSYS这两种。*ALLOBJ权限最大,相当于IBM i的管理员,其操作不受任何限制。而*SAVSYS则允许用户将任意IBM i对象保存为Save File,即使用户对该对象没有权限。
清单 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();
清单 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 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是一种面向对象的操作系统。因此对象的权限实际上包含两部分:对象权限与数据权限。
表 2. 对象权限
对象权限值 | 说明 |
*ALL | 用户可以执行除了对象权限列表(*AUTL)所控操作外的所有操作。 |
*CHANGE | 用户可对对象更改和执行基本功能。 |
*EXCLUDE | 用户不能存取对象。 |
*USE | 用户具有对象操作权限、读取权限和执行权限。 |
数据权限值 | 说明 |
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
对应关系
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所示。
清单 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 Java Toolbox for i针对IFS文件权限的支持
前面提到过,IBM i设计IFS的目的是效仿Windows,Unix文件系统。从面向对象的角度看,IFS的类型主要有两种,分别是对象类型为*DIR的文件夹与对象类型为*STMF的文件。
图 3. QShell查看/home/user1.policy的文件权限
图 4. CL查看/home/user1.policy的文件权限
清单 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 i而言是一个相对复杂的话题。本文分别以用户,对象,文件这三个角度,重点介绍了IBM i的相关权限概念,并结合样例指导读者如何使用IBM Java Toolbox for i实现相关的IBM i安全支持工作。
参考资源
• 参看文章“Toolbox for Java 和 JTOpen” ,了解IBM Java Toolbox for i的概要信息。
• 参考“IBM i 信息中心对象权限章节”,了解更多有关IBM i对象权限的内容。
UID
ibm11145116