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 安全性对应用程序开发者和管理员提出了一些新的要求。
部署者和管理员的 Java 2 安全性
虽然支持 Java 2 安全性,但缺省情况下会将其禁用。 您可以相互独立配置 Java 2 安全性和管理安全性。 禁用管理安全性不会自动禁用 Java 2 安全性。 您需要显式地将其禁用。
如果应用程序或第三方库未就绪,那么启用 Java 2 安全性会导致问题。 您可以在系统日志或跟踪文件中将这些问题识别为 Java 2 安全性AccessControlExceptions。 如果您不确定应用程序的 Java 2 安全性就绪情况,请初始禁用 Java 2 安全性以安装应用程序并验证其是否正常工作。
无法使这些策略文件所包含的策略更具限制性,因为产品可能没有必要的 Java 2 安全性 doPrivileged API。 限制性策略是缺省策略。 您可以授予额外的权限,但不能使默认权限更具限制性,因为AccessControlExceptions异常是在WebSphere® Application Server 内部生成的。 本产品不支持比前面提到的策略文件中定义的缺省策略更有限制性的策略。
多个 策略文件 用于定义 Java 进程的安全策略。 这些策略文件是静态的 (代码库在策略文件中定义) ,并且采用 IBM® Developer Kit Java Technology Edition 提供的缺省策略格式。 对于企业应用程序资源和实用程序库, WebSphere Application Server 提供动态策略支持。 代码库是基于部署信息动态计算的,并且许可权是运行时期间基于模板策略文件授予的。
策略文件中的语法错误将导致应用程序服务器进程发生故障,因此,务必谨慎地编辑这些策略文件。
如果未针对 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) 文档或某些其他外部文档提供必需的许可权。
如果许可权仅由组件库内部使用,并且从未授权应用程序访问受该访问权保护的资源,那么可能有必要将代码标记为拥有特权。 有关详细信息,请参阅AccessControlException主题。 但是,不恰当地插入 doPrivileged 调用可能会埋下安全性隐患。 您应该了解 doPrivileged 调用的影响以作出正确的判断。
Java 2 安全策略文件 中有关动态策略文件的部分描述了如何在运行时授予 was.policy 文件中的许可权。
开发要与 Java 2 安全性配合使用的应用程序可能是一项新技能,并施加先前不需要应用程序开发者的安全性感知。 描述 Java 2 安全模型以及对应用程序开发的影响超出了本节的范围。 下面的 URL 可以帮助您入门: https://docs.oracle.com/javase/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 安全性。
grant codeBase "file:${application}" {
permission java.security.AllPermission;
};server.policy 文件
server.policy 文件位于 app_server_root/properties/ 目录中。
server.policy 文件位于 profile_root/properties 目录中。
此策略定义 WebSphere Application Server 类的策略。 当前,同一个安装中的所有服务器进程共享同一个 server.policy 文件。 但是,可以对此文件进行配置,以使每个服务器进程可以有不同的 server.policy 文件。 将策略文件定义为 java.security.policy Java 系统属性的值。 有关如何定义 Java 系统属性的详细信息,请参阅 "管理应用程序服务器" 文件的 "进程定义" 部分。
java.policy 文件
此文件包含要授予所有类的缺省许可权。 此文件的策略适用于 Java 虚拟机在 WebSphere Application Server中启动的所有进程。
java.policy 文件位于 app_server_root/java/lib/security 目录中。
java.policy 文件位于${java.home}/lib/security/ 目录中,其中 ${java.home} 是您正在使用的软件开发包 (SDK) 的路径。 在整个操作系统中都要使用此策略文件。 请不要编辑 java.policy 文件。
故障诊断
- 错误消息 CWSCJ0314E
症状:
Error message CWSCJ0314E:当前 Java 2 安全策略报告了可能违反 Java 2 安全许可的情况。 有关详细信息,请参阅《问题确定指南》。 {0} Permission\: {1} Code\: {2}{3} Stack Trace\: {4} Code Base Location\: {5} 当前 Java 2 安全策略报告了可能违反 Java 2 安全权限的情况。 请参阅“问题确定指南”以了解进一步的信息。{0}许可权:{1}代码:{2}{3}堆栈跟踪:{4}代码库位置:{5}问题:
Java 安全管理器 checkPermission 方法在具有调试信息的主题许可权上报告了安全性异常。 根据系统配置的不同,报告的信息也会有所变化。 通过将可靠性可用性服务能力 (RAS) 跟踪配置为调试方式或指定 Java 属性来启用此报告。
有关如何在调试方式下配置 RAS 跟踪的信息,请参阅 启用跟踪 。
在 管理控制台的“JVM 设置”面板中指定以下属性:java.security.debug。 有效值包括:- 访问
- 打印调试信息,包括:必需的许可权、代码、堆栈和代码库位置。
- 堆栈
- 打印调试信息,包括:必需的许可权、代码和堆栈。
- 失败
- 打印调试信息,包括:必需的许可权和代码。
建议的响应:
报告的异常对于安全系统可能十分关键。 请打开安全性跟踪以确定可能违反了安全策略的代码。 确定违例代码后,通过检查所有适用的 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 异常,并将以下异常写入系统日志:许可权: /opt/IBM/WebSphere/AppServer/java/jre/lib/jaxm.properties : access denied (java.io.FilePermission /opt/IBM/WebSphere/AppServer/java/jre/lib/jaxm.properties read) 代码: 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} 堆栈跟踪: 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 安全性的任何 Web Service 应用程序中忽略此 SecurityException 。
消息
Message: CWSCJ0313E:Java 2 安全管理器调试信息标志已初始化:TrDebug: {0}, Access:{1}, Stack:{2}, Failure:{3}
问题:已经为安全管理器配置了有效调试消息标志的值。
消息:CWSCJ0307E:
尝试确定代码库位置时捕获到意外的异常。 异常:{0}
问题:确定代码库位置时捕获到意外的异常。