Java 2 安全性

Java™ 2 安全性 功能在 WebSphere® Application Server Liberty中受支持。 Java 2 安全性 提供基于策略的细颗粒度访问控制机制,通过在允许访问某些受保护的系统资源之前检查许可权来提高整体系统完整性。

Java 2 安全性 独立于 Java Platform, Enterprise Edition 基于角色的授权。 Java 2 安全性 保护对系统资源 (例如,文件输入和输出,套接字和属性) 的访问权; 而 Java Platform, Enterprise Edition 安全性保护对 Web 资源 (例如, Servlet 和 JSP 文件) 的访问权。

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

在启用 Java 2 安全性之前,需要确保所有应用程序都被授予必需的许可权,否则应用程序可能无法运行。 缺省情况下,系统会针对每个 Java 平台企业修订版 7.0 规范向应用程序授予许可权。 如果未针对 Java 2 安全性 准备应用程序,或者如果应用程序提供程序未提供 permissions.xml 文件作为应用程序的一部分,那么在启用 Java 2 安全性 时,应用程序可能会在运行时导致 Java 2 安全性 访问控制异常。 即使应用程序正在运行,它也可能不会正常运行。

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

应用程序开发者必须了解在缺省 WebSphere 策略中授予的许可权及 Java SDK API 的许可权需求。 您需要知道应用程序调用的 API 是否需要额外许可权。 有关哪些 Java API 需要许可权的更多信息,请参阅 Java 2 SDK 中的许可权
许可权是通过 permissions.xml 文件添加至应用程序的,与所列示许可权相关联的代码库基于该文件的位置。 对于独立 .war 应用程序,permissions.xml 文件捆绑在 META-INF 目录中,并且所有指定许可权适用于 .war 文件中包含的所有模块。 对于 .ear 应用程序,permissions.xml 直接捆绑在 .ear 本身的 META-INF 目录下,指定许可权适用于 .ear 文件中包含的所有模块。
注: 对于 .ear 应用程序,将忽略捆绑在除 .ear 以外的任何模块的 META-INF 目录下的 permissions.xml 文件。

当您使用包含 Web 应用程序捆绑包 (WAB) 的 OSGi 应用程序时,许可权是通过 permissions.perm 文件添加的。 如果 WAB 没有 permissions.perm 文件,那么策略缺省为 java.security.AllPermission.

启用 Java 2 安全性

Java 2 安全性 函数是内核扩展的一部分,并在引导时通过使用 websphere.java.security 属性更新 bootstrap.properties 文件来启用。

如果在 bootstrap.properties 文件中指定了 websphere.java.security 属性,那么将强制实施 Java 2 安全性 ; 否则,不会进行许可权检查。

指定受限许可权

Liberty 提供了一种机制,用于在运行 Web 或 EJB 应用程序组件时指定受限许可权。 受限许可权确保不向捆绑包或应用程序授予该许可权的任何实例。 它们提供一种机制以阻止应用程序向其自身授予必须允许的许可权之外的其他许可权,例如,退出 VM 的许可权。
受限许可权是在 server.xml 文件和 client.xml 文件中指定的。 以下示例显示如何限制用于编写系统属性 os.namePropertyPermission。 此语法在 server.xml 文件和 client.xml 文件中完全相同:

<javaPermission className="java.security.PropertyPermission" name="os.name" actions="write" restriction="true" />

授予许可权

OSGi 捆绑包可自我调整通过 permissions.perm 文件向该捆绑包内的库/类授予的许可权。

应用程序也可自我调整通过 permissions.xml 文件授予或通过在 server.xml 文件和 client.xml 文件中指定许可权授予来授予的许可权。

OSGi 捆绑包许可权

OSGi 规范提供一种机制以通过捆绑包的 OSGI-INF 目录中的 permissions.perm 文件指定对捆绑包的许可权。 此机制允许对捆绑包的许可权进行细颗粒度访问控制。
permissions.perm 文件指定捆绑包需要的最大许可权。
重要信息:permissions.perm 文件不等同于无 permissions.perm 文件。 如果您想要获取受限许可权,请确保您具有非空 permissions.perm 文件。

server.xmlclient.xml 中对应用程序声明许可权

没有指定代码库的许可权 (在 server.xmlclient.xml 文件中定义) 适用于该 Liberty 服务器上的所有应用程序。
可按以下示例中所示在 server.xml 文件和 client.xml 文件中指定要授予的许可权: 在此示例中,授予允许读取所有系统属性的 PropertyPermission

<javaPermission className="java.util.PropertyPermission"  name="*" actions="read" />
可在 server.xml 文件和 client.xml 文件中指定要限制的许可权。 以下示例显示如何限制用于编写系统属性 os.namePropertyPermission。 此语法在 server.xml 文件和 client.xml 文件中完全相同:

<javaPermission className="java.security.PropertyPermission" name="os.name" actions="write" restriction="true" />
注:
  • 受限许可权的 restriction 设置为 true
  • 如果应用程序尝试向其自身授予定义为受限许可权的许可权,那么受限许可权优先于授权并且不允许授权。

permissions.xml 中对应用程序声明许可权

permissions.xml 文件是 Java EE7 规范引入的新文件。 它被打包在应用程序目录的 META-INF 目录下。

对于打包为独立 .war 文件的应用程序,在 META-INF WAR 级别指定的许可权适用于打包在 .war 文件中的所有模块和库。

对于打包在 .ear 文件中的应用程序,必须在 .ear 文件级别声明许可权。 此许可权集适用于打包在 .ear 文件或其所包含模块中的所有模块和库。 这类打包模块中的任何 permissions.xml 文件将被忽略,不管是否对 .ear 文件提供了 permissions.xml 文件都是如此。

对于打包在 .rar 文件中的应用程序,必须在 META-INF RAR 级别声明许可权。

no-rethrow 选项

启用 Java 2 安全性后,发生许可权违例时,缺省情况下 JDK 安全管理器会抛出 java.security.AccessControl 异常。 如果不处理此异常,那么可能导致运行时失败。 如果开发者在准备应用程序以使用 Java 2 安全性时需要帮助,可使用了 no-rethrow 选项。 no-rethrow 选项允许将 AccessControl 异常记录在 console.logmessages.log 中而不会导致应用程序失败。 通过在 bootstrap.properties 文件中指定 websphere.java.security.norethrow=true 来启用 no-rethrow 选项。 缺省情况下未启用 no-rethrow 选项,因此,必须在 bootstrap.properties 文件中指定它以启用此属性。
注: 由于此属性不允许安全管理器抛出异常,因此安全管理器在技术上不会强制实施 Java 2 安全性。 不能在生产环境中使用 no-rethrow 属性。

动态更新

系统不支持对 permissions.permpermissions.xmlserver.xmlclient.xml 之类的许可权文件的动态更新。 对许可权的更新需要重新启动 Liberty 服务器。