Java 2 安全性

Java™ 2 安全性提供了基于策略的细颗粒度访问控制机制,该机制通过在允许访问某些受保护系统资源前检查许可权来提高系统整体完整性。Java 2 安全性保护对系统资源(例如文件 I/O、套接字和属性)的访问。Java 2 Platform, Enterprise Edition (J2EE) 安全性保护对 Web 资源(如 Servlet、JavaServer Pages (JSP) 文件和 Enterprise JavaBeans (EJB) 方法)的访问。

由于 Java 2 安全性相对较新,因此许多现有应用程序甚至新应用程序都没有为 Java 2 安全性能够实现的非常细颗粒度访问控制编程模型作好准备。管理员需要了解在应用程序没有为 Java 2 安全性作好准备的情况下启用 Java 2 安全性的可能后果。Java 2 安全性对应用程序开发者和管理员有一些新要求。

[IBM i]要点: Java 2 安全性仅对在启用了 Java 2 安全性的 Java 虚拟机中运行的 Java 程序有限制。如果禁用了 Java 2 安全性,或者从其他程序或命令访问系统资源,那么无法保护系统资源。因此,如果要保护系统资源,就需要使用操作系统安全性。
避免故障 避免故障: 该应用程序服务器不支持定制 custom Java 安全管理器实现。gotcha

部署者和管理员的 Java 2 安全性

虽然支持 Java 2 安全性,但缺省情况下它处于禁用状态。可以彼此独立地配置 Java 2 安全性和管理安全性。禁用管理安全性时并不会自动禁用 Java 2 安全性。您需要显式地将其禁用。

如果应用程序或第三方库尚未就绪,启用 Java 2 安全性就会引起问题。在系统日志或跟踪文件中,这些问题被标识为 Java 2 安全性 AccessControlException。如果不确定应用程序是否已经为 Java 2 安全性作好了准备,那么,最初应该禁用 Java 2 安全性以安装应用程序并验证它能否正常工作。

因为产品可能没有必需的 Java 2 安全性 doPrivileged API,所以不能提高这些策略文件包含的策略的限制性。限制性策略是缺省策略。可以授予其他许可权,但不能提高缺省策略的限制性,这是因为这将导致 WebSphere® Application Server 中发生 AccessControlException。本产品不支持比前面提到的策略文件中定义的缺省策略更有限制性的策略。

使用了几个策略文件来定义 Java 进程的安全策略。这些策略文件是静态的(代码库是在策略文件中定义的),他们采用 IBM® Developer Kit, Java Technology Edition 提供的缺省策略格式。对于企业应用程序资源和实用程序库,WebSphere Application Server 提供了动态策略支持。代码库是基于部署信息动态计算的,并且许可权是运行时期间基于模板策略文件授予的。有关更多信息,请参阅Java 2 安全策略文件

策略文件中的语法错误将导致应用程序服务器进程发生故障,因此,务必谨慎地编辑这些策略文件。

[IBM i]注: 使用 IBM Developer Kit, Java Technology Edition 提供的策略工具来编辑这些策略文件。请参阅使用 PolicyTool 来编辑 Java 2 安全性的策略文件以了解更多信息。

如果没有为 Java 2 安全性准备应用程序,如果应用程序供应商没有提供 was.policy 文件作为应用程序的一部分,或者如果应用程序供应商没有传递所期望的许可权,那么应用程序在运行时很可能导致 Java 2 安全性访问控制异常。应用程序没有为 Java 2 安全性作好准备这一事实可能并不明显。几个运行时调试助手可以帮助对发生访问控制异常的应用程序进行故障诊断。请参阅“Java 2 安全性调试助手”以了解更多详细信息。请参阅处理没有为 Java 2 安全性做好准备的应用程序,以获取有关处理此类应用程序的信息和策略。

目前,在管理安全性设置中启用 Java 安全性后,已安装的安全管理器并不会检查非系统线程的 modifyThread 和 modifyThreadGroup 许可权,注意这一点十分重要。如果允许 Web 和 Enterprise JavaBeans (EJB) 应用程序代码创建或修改线程,就可能会对容器的其他组件产生负面影响,并可能会影响容器管理企业 Bean 生命周期和事务的功能。

应用程序开发者的 Java 2 安全性

应用程序开发者必须了解缺省 WebSphere 策略中授予的许可权以及应用程序调用的 SDK API 的许可权需求,以确定是否需要其他许可权。资源部分中的“Java 2 SDK 中的许可权”参考资料描述了哪些 API 需要哪个许可权。

应用程序供应商可以假定应用程序拥有前面提到的缺省策略中授予的许可权。如果应用程序访问未受缺省 WebSphere 策略保护的资源,就需要将其他 Java 2 安全许可权授予该应用程序。

当可以在其中一个其他动态 WebSphere 策略文件或其中一个更传统的 java.policy 静态策略文件中将其他许可权授予应用程序时,嵌入在 EAR 文件中的 was.policy 文件确保其他许可权的作用域刚好是需要这些许可权的应用程序。如果许可权的范围超出需要该许可权的应用程序代码,就会允许通常无权访问特定资源的代码访问那些资源。

如果正在开发应用程序组件,例如实际上可能包括在多个 .ear 文件中的库,那么库开发者就需要记录应用程序组装程序所需的 Java 2 许可权。库类型的组件没有 was.policy 文件。开发者必须通过应用程序编程接口 (API) 文档或某些其他外部文档提供必需的许可权。

如果组件库由多个企业应用程序共享,那么可以在 app.policy 文件中将许可权授予节点上的所有企业应用程序。
注: app.policy 文件的更新仅适用于节点上 app.policy 文件所属的企业应用程序。

如果许可权仅由组件库内部使用,并且从未授权应用程序访问受该访问权保护的资源,那么可能有必要将代码标记为拥有特权。请参阅 AccessControlException 主题以了解更多详细信息。但是,不恰当地插入 doPrivileged 调用可能会埋下安全性隐患。您应该了解 doPrivileged 调用的影响以作出正确的判断。

Java 2 安全策略文件中有关动态策略文件的部分描述了如何在运行时授予 was.policy 文件中的许可权。

开发要与 Java 2 安全性配合工作的应用程序是一项新技能,并且施加了以前对应用程序开发者不作要求的安全意识。此部分内容未提供有关 Java 2 安全模型的描述以及它对应用程序开发的影响。以下 URL 可以帮助您入门:http://java.sun.com/j2se/1.5.0/docs/guide/security/index.html

调试助手

WebSphere Application Server SYSOUT 文件和 com.ibm.websphere.java2secman.norethrow 属性是两个主要的调试助手。

WebSphere 系统日志或跟踪文件

系统日志或跟踪文件中记录的 AccessControl 异常包含导致该异常的许可权违例、异常调用堆栈以及授予每个堆栈帧的许可权。此信息通常足以确定缺少的许可权和需要该许可权的代码。

com.ibm.websphere.java2secman.norethrow 属性

在 WebSphere Application Server 中启用 Java 2 安全性后,如果发生许可权违例,安全管理器组件就会创建 java.security.AccessControl 异常。如果未处理此异常,它通常会导致运行时发生故障。此异常也记录在 SYSOUT 文件中。

但是,如果将 Java 虚拟机的 com.ibm.websphere.java2secman.norethrow 属性设置为值 true,那么安全管理器就不会创建 AccessControl 异常。此信息将被记录下来。

由于此属性指示安全管理器不要创建 AccessControl 异常,所以此属性可用于沙箱或调试环境。不强制实施 Java 2 安全性。因为宽松的 Java 2 安全性环境会削弱 Java 2 安全性希望实现的完整性,所以,请不要在生产环境中使用此属性。

此属性在沙箱或测试环境中非常有用。在沙箱或测试环境中,可以全面测试应用程序,并且可以检查系统日志或跟踪文件中记录的 AccessControl 异常。由于此属性不会创建 AccessControl 异常,所以它不传播调用堆栈,并且不会引起故障。如果没有此属性,您就必须逐个地查找和修正 AccessControl 异常。

处理没有为 Java 2 安全性做好准备的应用程序

如果 Java 2 安全性提供的增加的系统完整性很重要,那么联系该应用程序供应商,使该应用程序支持 Java 2 安全性或者至少传递必需的其他许可权(必须授予的缺省的 WebSphere Application Server 策略范围外的许可权)。

处理此类应用程序的最简单方法是在 WebSphere Application Server 中禁用 Java 2 安全性。缺点是此解决方案应用于整个系统,系统完整性会有所下降。根据企业安全策略或风险容忍度的不同,禁用 Java 2 安全性可能是不可接受的。

另一种方法是继续启用 Java 2 安全性,但是仅将足够的附加许可权或者全部许可权授予有问题的应用程序。但是,授予许可权的工作可能并不容易完成。如果应用程序供应商未通过某种方法指明所需的许可权,那么没有简便的方法来确定所需的许可权,授予所有许可权可能是唯一的选择。通过将此应用程序放到另一个节点上(这可能有助于将其与某些资源隔离开),可以最大程度地降低此风险。授予应用程序 .ear 文件中嵌入的 was.policy 文件中的 java.security.AllPermission 许可权,例如:
grant codeBase "file:${application}" {
            permission java.security.AllPermission;
        };

server.policy 文件

[AIX Solaris HP-UX Linux Windows][z/OS]server.policy 文件位于 app_server_root/properties/ 目录中。

[IBM i]server.policy 文件在 profile_root/properties 目录中。

此策略定义了 WebSphere Application Server 类的策略。当前,同一个安装中的所有服务器进程共享同一个 server.policy 文件。但是,可以对此文件进行配置,以使每个服务器进程可以有不同的 server.policy 文件。将该策略文件作为 Java 系统属性 java.security.policy 的值来定义。有关如何定义 Java 系统属性的详细信息,请参阅“管理应用程序服务器文件”的“进程定义”部分。

server.policy 文件不是存储库和文件复制服务管理的配置文件。对此文件所作的更改是在本地进行的,不会将此更改复制到其他机器。使用 server.policy 文件来为服务器资源定义 Java 2 安全策略。使用 app.policy 文件(每个节点)或 was.policy 文件(每个企业应用程序)来为企业应用程序资源定义 Java 2 安全策略。
注: app.policy 文件的更新仅适用于节点上 app.policy 文件所属的企业应用程序。

java.policy 文件

此文件包含要授予所有类的缺省许可权。此文件的策略将应用于 WebSphere Application Server 中 Java 虚拟机启动的所有进程。

[AIX Solaris HP-UX Linux Windows][z/OS]java.policy 文件位于 app_server_root/java/lib/security 目录中。

[IBM i]java.policy 文件在 ${java.home}/lib/security/ 目录中,其中 ${java.home} 是您正在使用的软件开发包 (SDK) 的路径。在整个操作系统中都要使用此策略文件。请不要编辑 java.policy 文件。

故障诊断

错误消息 CWSCJ0314E

症状:

错误消息 CWSCJ0314E:Current® Java 2 安全策略报告了潜在的 Java 2 安全许可权违例。请参阅“问题确定指南”以了解进一步的信息。{0}许可权:{1}代码:{2}{3}堆栈跟踪:{4}代码库位置:{5}Current Java 2 安全策略报告了潜在的 Java 2 安全许可权违例。请参阅“问题确定指南”以了解进一步的信息。{0}许可权:{1}代码:{2}{3}堆栈跟踪:{4}代码库位置:{5}

问题:

Java 安全管理器 checkPermission 方法报告了主体集许可权安全性异常,并提供了调试信息。根据系统配置的不同,报告的信息也会有所变化。通过将可靠性可用性服务功能 (RAS) 跟踪配置为调试方式或指定 Java 属性来启用此报告。

请参阅启用跟踪,以了解如何以调试方式配置 RAS 跟踪的信息。

在 管理控制台的“JVM 设置”面板中指定以下属性:java.security.debug。有效值包括:
access
打印调试信息,包括:必需的许可权、代码、堆栈和代码库位置。
stack
打印调试信息,包括:必需的许可权、代码和堆栈。
failure
打印调试信息,包括:必需的许可权和代码。

建议的响应:

报告的异常对于安全系统可能十分关键。请打开安全性跟踪以确定可能违反了安全策略的代码。确定违例代码后,通过检查所有适用的 Java 2 安全策略文件和应用程序代码,验证 Java 2 安全性是否允许执行所尝试的操作。

如果应用程序正在与 Java Mail 一起运行,此消息可能是良性的。可以更新 was.policy 文件以将下列许可权授予该应用程序:

permission java.io.FilePermission "${user.home}${/}.mailcap", "read";
permission java.io.FilePermission "${user.home}${/}.mime.types", "read";
permission java.io.FilePermission "${java.home}${/}lib${/}mailcap", "read";
permission java.io.FilePermission "${java.home}${/}lib${/}mime.types", "read";

SecurityException - 访问遭拒

症状:

如果启用了 Java 安全性,并且未授予读取 jaxm.properties 文件的权限,那么在通过调用 javax.xml.soap.SOAPFactory.newInstance() 来创建 SOAPFactory 实例时,或者通过调用 MessageFactory.newInstance() 来创建 MessageFactory 实例时,会发生 SecurityException 异常,并且会将以下异常写入系统日志中:
Permission:

      /opt/IBM/WebSphere/AppServer/java/jre/lib/jaxm.properties : access denied 
(java.io.FilePermission /opt/IBM/WebSphere/AppServer/java/jre/lib/jaxm.properties
read)

Code:

     com.ibm.ws.wsfvt.test.binding.addr1.binder.AddressBinder  
in  {file:/opt/IBM/WebSphere/AppServer/profiles/AppSrv01/installedApps/
ahp6405Node01Cell/DataBinding.ear/address1.war/WEB-INF/lib
/addressbinder1.jar}

Stack Trace:

java.security.AccessControlException: access denied (java.io.FilePermission
/opt/IBM/WebSphere/AppServer/java/jre/lib/jaxm.properties read)
.

问题:

Java 2 安全策略报告了可能的 Java 2 安全许可权违例。

建议的响应:

SOAPFactory 会忽略异常,并继续确定要装入的实现的下一种方法。因此,可以忽略此安全性异常的日志条目。

因为本产品使用 SOAPFactory 来支持其他 Web Service 技术(例如 WS-Addressing (WS-A)、WS-Atomic Transaction (WS-AT) 和 WS-Notification),所以在启用了 Java 安全性的任何应用程序中,您可以忽略此 SecurityException。

消息

消息: CWSCJ0313E: 已初始化 Java 2 安全管理器调试消息标志:TrDebug:{0},Access:{1},Stack:{2},Failure:{3}

问题:已经为安全管理器配置了有效调试消息标志的值。

消息:CWSCJ0307E: 尝试确定代码库位置时捕获到意外的异常。异常:{0}

问题:确定代码库位置时捕获到意外的异常。


指示主题类型的图标 概念主题



时间戳记图标 最近一次更新时间: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=csec_rsecmgr2
文件名:csec_rsecmgr2.html