迁移 Java 2 安全策略

请使用本主题来获取有关迁移 Java™ 2 安全策略的指导信息。

有关此任务

先前的 WebSphere® Application Server 发行版

WebSphere Application Server 在服务器运行时中使用 Java 2 安全管理器来阻止企业应用程序调用 System.exit 和 System.setSecurityManager 方法。 这两个 Java 应用程序编程接口 (API) 如果由企业应用程序调用,将产生不期望的后果。 例如, System.exit API 会导致 Java 虚拟机 (应用程序服务器进程) 过早退出,这不是应用程序服务器的有益操作。

要正确支持 Java 2 安全性,必须将所有服务器运行时标记为privileged(在正确的位置插入了 doPrivileged API 调用) ,并标识缺省许可权集或策略。 应用程序代码没有特权,并且服从策略文件中定义的许可权。 doPrivileged 检测很重要,并且是支持 Java 2 安全性所必需的。 没有它,应用程序代码必须被授予服务器运行时所需的许可权。 此情况是由于 Java 2 安全性用于实施许可权检查的设计和算法所致。 请参阅 Java 2 安全性检查许可权算法。

以下两个许可权由 WebSphere Application Server的 Java 2 安全管理器 (硬编码) 实施:
  • java.lang.RuntimePermission(exitVM)
  • java.lang.RuntimePermission(setSecurityManager)

无论 Java 2 安全策略中的内容如何,都将拒绝应用程序代码访问这些许可权。 但是,服务器运行时被授予这些许可权。 所有其他许可权检查并非都执行。

仅支持两个许可权:
  • java.net.SocketPermission
  • java.net.NetPermission

但是,并非所有产品服务器运行时都正确地标记为有特权的。 除了前面列出的这两个许可权之外,您还必须授予应用程序代码所有其他的许可权,否则企业应用程序的运行可能会失败。 企业应用程序的此 Java 2 安全策略是自由的。

更改的内容

Java 2 安全性在 WebSphere Application Server中完全受支持,这意味着将强制实施所有许可权。 企业应用程序的缺省 Java 2 安全策略是由 Java Platform, Enterprise Edition (Java EE) V 1.4 规范定义的建议许可权集。 请参阅profile_root/config/cells/cell_name/nodes/node_name/app.policy针对向企业应用程序授予的缺省 Java 2 安全策略的文件。 与前发行版比较,此策略要严格得多。

所有策略是声明性的。 产品安全管理器支持策略文件中声明的所有策略。 此规则有一个例外: 企业应用程序被拒绝访问在以下环境中声明的许可权:profile_root/config/cells/cell_name/filter.policy中。

注: 企业应用程序的缺省 Java 2 安全策略要严格得多,并且在 WebSphere Application Server 版本 9.0中强制实施所有许可权。 因为应用程序代码在系统资源(如,文件 I/O)可通过编程方式访问而且现在接受许可权检查时,未授予必需许可权,所以安全策略可能会失败。

在应用程序代码中,不要使用 setSecurityManager 许可权来设置安全管理器。 当应用程序使用 setSecurityManager 权限时,会与应用程序内部的安全管理器发生冲突。 WebSphere Application Server. 如果必须在应用程序中设置安全管理器以用于 RMI ,那么还必须在 WebSphere Application Server 管理控制台的 "全局安全性" 页面上启用 使用 Java 2 安全性来限制应用程序对本地资源的访问 选项。 WebSphere Application Server 然后注册安全管理器。 应用程序代码可通过使用 System.getSecurityManager() 应用程序编程接口 (API) 来验证是否已注册此安全管理器。

迁移系统属性

在与 Java 2 安全性相关的先前发行版中,将使用以下系统属性:
  • java.security.policy. 策略文件的绝对路径(必需的操作)。 此系统属性包含系统许可权 (授予 Java 虚拟机 (JVM) 和产品服务器运行时的许可权) 和企业应用程序许可权。 将企业应用程序的 Java 2 安全策略迁移到 V 9.0。 对于 Java 2 安全策略迁移,请参阅迁移 Java 2 安全策略的步骤。
  • enableJava2Security. 用于启用 Java 2 安全性实施 (不需要任何操作)。 不推荐使用此系统属性; WebSphere 配置应用程序编程接口 (API) 中的标志用于控制是否启用 Java 2 安全性。 通过管理控制台启用此选项。
  • was.home. 已展开到 WebSphere Application Server 的安装目录 (可能需要操作)。 不推荐使用此系统属性;它已被 ${user.install.root} 和 ${was.install.root} 属性取代。 如果目录包含特定于实例的数据,请使用 ${user.install.root};否则使用 ${was.install.root}。 可互换地将这些属性用于 WebSphere Application ServerWebSphere Application Server Network Deployment 环境。 请参阅迁移 Java 2 安全策略的步骤。

迁移 Java 2 安全策略

由于在同一策略文件中混用了系统许可权和应用程序许可权,因此不存在将 Java 策略文件自动迁移到 版本 9.0 的简单方法。 手动将企业应用程序的 Java 2 安全策略复制到was.policyapp.policy中。 但是,将 Java 2 安全策略迁移到was.policy最好使用文件,因为使用符号或相对代码库而不是绝对代码库。 这样做有很多好处。 授予在以下目录中定义的许可权:was.policy仅适用于特定企业应用程序,而在app.policy文件将应用于在其节点上运行的所有企业应用程序。app.policy文件属于。

有关策略管理的更多详细信息,请参阅 Java 2 安全策略文件 主题。

以下示例说明从先前发行版迁移 Java 2 安全策略。 内容包括 Java 2 安全策略文件app1.ear企业应用程序和系统许可权,即授予 Java 虚拟机 (JVM) 和产品服务器运行时的许可权。

[AIX Solaris HP-UX Linux Windows]Java 2 安全策略文件的缺省位置为profile_root/properties/java.policy. 为清楚起见,将省略缺省许可权:

[IBM i]Java 2 安全策略文件的缺省位置为profile_root/properties/java.policy. 为清楚起见,将省略缺省许可权:

// For product Samples
   grant codeBase "file:${app_server_root}/installedApps/app1.ear/-" {
     permission java.security.SecurityPermission "printIdentity";
     permission java.io.FilePermission "${app_server_root}${/}temp${/}somefile.txt", 
       "read";
   };

为了清楚地说明,在本示例中,所有许可权迁移为应用程序级别许可权。 但是,您可以在组件级别 (Web ,企业 Bean ,连接器或实用程序 Java 归档 (JAR) 组件级别) 更精细地授予许可权,也可以向特定组件授予许可权。

过程

  1. 确保在应用程序服务器上禁用 Java 2 安全性。
  2. 新建was.policy文件 (如果该文件不存在) ,或更新was.policy包含以下内容的配置库中已迁移应用程序的文件:
    grant codeBase "file:${application}" {
         permission java.security.SecurityPermission "printIdentity";
         permission java.io.FilePermission "
                 ${user.install.root}${/}temp${/}somefile.txt", "read";
       };

    以上代码样本中的第三和第四行分成两行显示仅为了便于说明。

    was.policy文件位于profile_root/config/cells/cell_name/applications/app.ear/deployments/app/META-INF/目录。

  3. 使用组装工具来连接was.policy文件到企业归档 (EAR) 文件。

    您还可以使用组装工具来验证was.policy中。 有关更多信息,请参阅 为 Java 2 安全性配置 was.policy 文件

  4. 验证企业应用程序是否不需要对已迁移的 Java 2 安全许可权以及在${user.install.root}/config/cells/cell_name/nodes/node_name/app.policy中。 此验证需要对在生产前环境中启用了 Java 2 安全性的已迁移企业应用程序进行代码复审,代码检查,应用程序文档复审和沙箱测试。 请参阅受 Java 2 安全性保护的开发人员工具包 API ,以获取有关哪些 API 受 Java 2 安全性保护的信息。 如果使用第三方库,请查阅供应商文档以了解受 Java 2 安全性保护的 API。 请验证是否向应用程序授予了所有必需的许可权,或者在启用 Java 2 安全性时该应用程序可能无法运行。
  5. 在启用 Java 2 安全性的情况下对迁移的企业应用程序执行生产前测试。
    使用以下跟踪字符串在生产前测试环境中对 WebSphere Application Server Java 2 安全管理器启用跟踪:com.ibm.ws.security.core.SecurityManager=all=enabled.该跟踪功能有助于调试 AccessControlException 异常,当应用程序未被授予所需的权限或某些系统代码未被正确标记为特权时,就会产生该异常。 当产生异常时,跟踪转储堆栈跟踪和授予调用堆栈中类的许可权。

    有关更多信息,请参阅 Java 2 安全性的访问控制异常

    注: 由于 Java 2 安全策略与先前发行版相比要严格得多,因此管理员或部署者必须查看其企业应用程序,以了解在启用 Java 2 安全性之前是否需要额外的许可权。 如果未授予企业应用程序必需的许可权,它们无法运行。